xref: /openbmc/qemu/hw/arm/npcm7xx.c (revision 19ed42e8)
1 /*
2  * Nuvoton NPCM7xx SoC family.
3  *
4  * Copyright 2020 Google LLC
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of the GNU General Public License as published by the
8  * Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14  * for more details.
15  */
16 
17 #include "qemu/osdep.h"
18 
19 #include "hw/arm/boot.h"
20 #include "hw/arm/npcm7xx.h"
21 #include "hw/char/serial.h"
22 #include "hw/loader.h"
23 #include "hw/misc/unimp.h"
24 #include "hw/qdev-clock.h"
25 #include "hw/qdev-properties.h"
26 #include "qapi/error.h"
27 #include "qemu/bswap.h"
28 #include "qemu/units.h"
29 #include "sysemu/sysemu.h"
30 #include "target/arm/cpu-qom.h"
31 
32 /*
33  * This covers the whole MMIO space. We'll use this to catch any MMIO accesses
34  * that aren't handled by any device.
35  */
36 #define NPCM7XX_MMIO_BA         (0x80000000)
37 #define NPCM7XX_MMIO_SZ         (0x7ffd0000)
38 
39 /* OTP key storage and fuse strap array */
40 #define NPCM7XX_OTP1_BA         (0xf0189000)
41 #define NPCM7XX_OTP2_BA         (0xf018a000)
42 
43 /* Core system modules. */
44 #define NPCM7XX_L2C_BA          (0xf03fc000)
45 #define NPCM7XX_CPUP_BA         (0xf03fe000)
46 #define NPCM7XX_GCR_BA          (0xf0800000)
47 #define NPCM7XX_CLK_BA          (0xf0801000)
48 #define NPCM7XX_MC_BA           (0xf0824000)
49 #define NPCM7XX_RNG_BA          (0xf000b000)
50 
51 /* USB Host modules */
52 #define NPCM7XX_EHCI_BA         (0xf0806000)
53 #define NPCM7XX_OHCI_BA         (0xf0807000)
54 
55 /* ADC Module */
56 #define NPCM7XX_ADC_BA          (0xf000c000)
57 
58 /* Internal AHB SRAM */
59 #define NPCM7XX_RAM3_BA         (0xc0008000)
60 #define NPCM7XX_RAM3_SZ         (4 * KiB)
61 
62 /* Memory blocks at the end of the address space */
63 #define NPCM7XX_RAM2_BA         (0xfffd0000)
64 #define NPCM7XX_RAM2_SZ         (128 * KiB)
65 #define NPCM7XX_ROM_BA          (0xffff0000)
66 #define NPCM7XX_ROM_SZ          (64 * KiB)
67 
68 /* SDHCI Modules */
69 #define NPCM7XX_MMC_BA          (0xf0842000)
70 
71 /* Clock configuration values to be fixed up when bypassing bootloader */
72 
73 /* Run PLL1 at 1600 MHz */
74 #define NPCM7XX_PLLCON1_FIXUP_VAL   (0x00402101)
75 /* Run the CPU from PLL1 and UART from PLL2 */
76 #define NPCM7XX_CLKSEL_FIXUP_VAL    (0x004aaba9)
77 
78 /*
79  * Interrupt lines going into the GIC. This does not include internal Cortex-A9
80  * interrupts.
81  */
82 enum NPCM7xxInterrupt {
83     NPCM7XX_ADC_IRQ             = 0,
84     NPCM7XX_UART0_IRQ           = 2,
85     NPCM7XX_UART1_IRQ,
86     NPCM7XX_UART2_IRQ,
87     NPCM7XX_UART3_IRQ,
88     NPCM7XX_GMAC1_IRQ           = 14,
89     NPCM7XX_EMC1RX_IRQ          = 15,
90     NPCM7XX_EMC1TX_IRQ,
91     NPCM7XX_GMAC2_IRQ,
92     NPCM7XX_MMC_IRQ             = 26,
93     NPCM7XX_PSPI2_IRQ           = 28,
94     NPCM7XX_PSPI1_IRQ           = 31,
95     NPCM7XX_TIMER0_IRQ          = 32,   /* Timer Module 0 */
96     NPCM7XX_TIMER1_IRQ,
97     NPCM7XX_TIMER2_IRQ,
98     NPCM7XX_TIMER3_IRQ,
99     NPCM7XX_TIMER4_IRQ,
100     NPCM7XX_TIMER5_IRQ,                 /* Timer Module 1 */
101     NPCM7XX_TIMER6_IRQ,
102     NPCM7XX_TIMER7_IRQ,
103     NPCM7XX_TIMER8_IRQ,
104     NPCM7XX_TIMER9_IRQ,
105     NPCM7XX_TIMER10_IRQ,                /* Timer Module 2 */
106     NPCM7XX_TIMER11_IRQ,
107     NPCM7XX_TIMER12_IRQ,
108     NPCM7XX_TIMER13_IRQ,
109     NPCM7XX_TIMER14_IRQ,
110     NPCM7XX_WDG0_IRQ            = 47,   /* Timer Module 0 Watchdog */
111     NPCM7XX_WDG1_IRQ,                   /* Timer Module 1 Watchdog */
112     NPCM7XX_WDG2_IRQ,                   /* Timer Module 2 Watchdog */
113     NPCM7XX_EHCI_IRQ            = 61,
114     NPCM7XX_OHCI_IRQ            = 62,
115     NPCM7XX_SMBUS0_IRQ          = 64,
116     NPCM7XX_SMBUS1_IRQ,
117     NPCM7XX_SMBUS2_IRQ,
118     NPCM7XX_SMBUS3_IRQ,
119     NPCM7XX_SMBUS4_IRQ,
120     NPCM7XX_SMBUS5_IRQ,
121     NPCM7XX_SMBUS6_IRQ,
122     NPCM7XX_SMBUS7_IRQ,
123     NPCM7XX_SMBUS8_IRQ,
124     NPCM7XX_SMBUS9_IRQ,
125     NPCM7XX_SMBUS10_IRQ,
126     NPCM7XX_SMBUS11_IRQ,
127     NPCM7XX_SMBUS12_IRQ,
128     NPCM7XX_SMBUS13_IRQ,
129     NPCM7XX_SMBUS14_IRQ,
130     NPCM7XX_SMBUS15_IRQ,
131     NPCM7XX_PWM0_IRQ            = 93,   /* PWM module 0 */
132     NPCM7XX_PWM1_IRQ,                   /* PWM module 1 */
133     NPCM7XX_MFT0_IRQ            = 96,   /* MFT module 0 */
134     NPCM7XX_MFT1_IRQ,                   /* MFT module 1 */
135     NPCM7XX_MFT2_IRQ,                   /* MFT module 2 */
136     NPCM7XX_MFT3_IRQ,                   /* MFT module 3 */
137     NPCM7XX_MFT4_IRQ,                   /* MFT module 4 */
138     NPCM7XX_MFT5_IRQ,                   /* MFT module 5 */
139     NPCM7XX_MFT6_IRQ,                   /* MFT module 6 */
140     NPCM7XX_MFT7_IRQ,                   /* MFT module 7 */
141     NPCM7XX_EMC2RX_IRQ          = 114,
142     NPCM7XX_EMC2TX_IRQ,
143     NPCM7XX_GPIO0_IRQ           = 116,
144     NPCM7XX_GPIO1_IRQ,
145     NPCM7XX_GPIO2_IRQ,
146     NPCM7XX_GPIO3_IRQ,
147     NPCM7XX_GPIO4_IRQ,
148     NPCM7XX_GPIO5_IRQ,
149     NPCM7XX_GPIO6_IRQ,
150     NPCM7XX_GPIO7_IRQ,
151 };
152 
153 /* Total number of GIC interrupts, including internal Cortex-A9 interrupts. */
154 #define NPCM7XX_NUM_IRQ         (160)
155 
156 /* Register base address for each Timer Module */
157 static const hwaddr npcm7xx_tim_addr[] = {
158     0xf0008000,
159     0xf0009000,
160     0xf000a000,
161 };
162 
163 /* Register base address for each 16550 UART */
164 static const hwaddr npcm7xx_uart_addr[] = {
165     0xf0001000,
166     0xf0002000,
167     0xf0003000,
168     0xf0004000,
169 };
170 
171 /* Direct memory-mapped access to SPI0 CS0-1. */
172 static const hwaddr npcm7xx_fiu0_flash_addr[] = {
173     0x80000000, /* CS0 */
174     0x88000000, /* CS1 */
175 };
176 
177 /* Direct memory-mapped access to SPI3 CS0-3. */
178 static const hwaddr npcm7xx_fiu3_flash_addr[] = {
179     0xa0000000, /* CS0 */
180     0xa8000000, /* CS1 */
181     0xb0000000, /* CS2 */
182     0xb8000000, /* CS3 */
183 };
184 
185 /* Register base address for each PWM Module */
186 static const hwaddr npcm7xx_pwm_addr[] = {
187     0xf0103000,
188     0xf0104000,
189 };
190 
191 /* Register base address for each MFT Module */
192 static const hwaddr npcm7xx_mft_addr[] = {
193     0xf0180000,
194     0xf0181000,
195     0xf0182000,
196     0xf0183000,
197     0xf0184000,
198     0xf0185000,
199     0xf0186000,
200     0xf0187000,
201 };
202 
203 /* Direct memory-mapped access to each SMBus Module. */
204 static const hwaddr npcm7xx_smbus_addr[] = {
205     0xf0080000,
206     0xf0081000,
207     0xf0082000,
208     0xf0083000,
209     0xf0084000,
210     0xf0085000,
211     0xf0086000,
212     0xf0087000,
213     0xf0088000,
214     0xf0089000,
215     0xf008a000,
216     0xf008b000,
217     0xf008c000,
218     0xf008d000,
219     0xf008e000,
220     0xf008f000,
221 };
222 
223 /* Register base address for each EMC Module */
224 static const hwaddr npcm7xx_emc_addr[] = {
225     0xf0825000,
226     0xf0826000,
227 };
228 
229 /* Register base address for each PSPI Module */
230 static const hwaddr npcm7xx_pspi_addr[] = {
231     0xf0200000,
232     0xf0201000,
233 };
234 
235 /* Register base address for each GMAC Module */
236 static const hwaddr npcm7xx_gmac_addr[] = {
237     0xf0802000,
238     0xf0804000,
239 };
240 
241 static const struct {
242     hwaddr regs_addr;
243     uint32_t unconnected_pins;
244     uint32_t reset_pu;
245     uint32_t reset_pd;
246     uint32_t reset_osrc;
247     uint32_t reset_odsc;
248 } npcm7xx_gpio[] = {
249     {
250         .regs_addr = 0xf0010000,
251         .reset_pu = 0xff03ffff,
252         .reset_pd = 0x00fc0000,
253     }, {
254         .regs_addr = 0xf0011000,
255         .unconnected_pins = 0x0000001e,
256         .reset_pu = 0xfefffe07,
257         .reset_pd = 0x010001e0,
258     }, {
259         .regs_addr = 0xf0012000,
260         .reset_pu = 0x780fffff,
261         .reset_pd = 0x07f00000,
262         .reset_odsc = 0x00700000,
263     }, {
264         .regs_addr = 0xf0013000,
265         .reset_pu = 0x00fc0000,
266         .reset_pd = 0xff000000,
267     }, {
268         .regs_addr = 0xf0014000,
269         .reset_pu = 0xffffffff,
270     }, {
271         .regs_addr = 0xf0015000,
272         .reset_pu = 0xbf83f801,
273         .reset_pd = 0x007c0000,
274         .reset_osrc = 0x000000f1,
275         .reset_odsc = 0x3f9f80f1,
276     }, {
277         .regs_addr = 0xf0016000,
278         .reset_pu = 0xfc00f801,
279         .reset_pd = 0x000007fe,
280         .reset_odsc = 0x00000800,
281     }, {
282         .regs_addr = 0xf0017000,
283         .unconnected_pins = 0xffffff00,
284         .reset_pu = 0x0000007f,
285         .reset_osrc = 0x0000007f,
286         .reset_odsc = 0x0000007f,
287     },
288 };
289 
290 static const struct {
291     const char *name;
292     hwaddr regs_addr;
293     int cs_count;
294     const hwaddr *flash_addr;
295 } npcm7xx_fiu[] = {
296     {
297         .name = "fiu0",
298         .regs_addr = 0xfb000000,
299         .cs_count = ARRAY_SIZE(npcm7xx_fiu0_flash_addr),
300         .flash_addr = npcm7xx_fiu0_flash_addr,
301     }, {
302         .name = "fiu3",
303         .regs_addr = 0xc0000000,
304         .cs_count = ARRAY_SIZE(npcm7xx_fiu3_flash_addr),
305         .flash_addr = npcm7xx_fiu3_flash_addr,
306     },
307 };
308 
309 static void npcm7xx_write_board_setup(ARMCPU *cpu,
310                                       const struct arm_boot_info *info)
311 {
312     uint32_t board_setup[] = {
313         0xe59f0010,     /* ldr r0, clk_base_addr */
314         0xe59f1010,     /* ldr r1, pllcon1_value */
315         0xe5801010,     /* str r1, [r0, #16] */
316         0xe59f100c,     /* ldr r1, clksel_value */
317         0xe5801004,     /* str r1, [r0, #4] */
318         0xe12fff1e,     /* bx lr */
319         NPCM7XX_CLK_BA,
320         NPCM7XX_PLLCON1_FIXUP_VAL,
321         NPCM7XX_CLKSEL_FIXUP_VAL,
322     };
323     int i;
324 
325     for (i = 0; i < ARRAY_SIZE(board_setup); i++) {
326         board_setup[i] = tswap32(board_setup[i]);
327     }
328     rom_add_blob_fixed("board-setup", board_setup, sizeof(board_setup),
329                        info->board_setup_addr);
330 }
331 
332 static void npcm7xx_write_secondary_boot(ARMCPU *cpu,
333                                          const struct arm_boot_info *info)
334 {
335     /*
336      * The default smpboot stub halts the secondary CPU with a 'wfi'
337      * instruction, but the arch/arm/mach-npcm/platsmp.c in the Linux kernel
338      * does not send an IPI to wake it up, so the second CPU fails to boot. So
339      * we need to provide our own smpboot stub that can not use 'wfi', it has
340      * to spin the secondary CPU until the first CPU writes to the SCRPAD reg.
341      */
342     uint32_t smpboot[] = {
343         0xe59f2018,     /* ldr r2, bootreg_addr */
344         0xe3a00000,     /* mov r0, #0 */
345         0xe5820000,     /* str r0, [r2] */
346         0xe320f002,     /* wfe */
347         0xe5921000,     /* ldr r1, [r2] */
348         0xe1110001,     /* tst r1, r1 */
349         0x0afffffb,     /* beq <wfe> */
350         0xe12fff11,     /* bx r1 */
351         NPCM7XX_SMP_BOOTREG_ADDR,
352     };
353     int i;
354 
355     for (i = 0; i < ARRAY_SIZE(smpboot); i++) {
356         smpboot[i] = tswap32(smpboot[i]);
357     }
358 
359     rom_add_blob_fixed("smpboot", smpboot, sizeof(smpboot),
360                        NPCM7XX_SMP_LOADER_START);
361 }
362 
363 static struct arm_boot_info npcm7xx_binfo = {
364     .loader_start           = NPCM7XX_LOADER_START,
365     .smp_loader_start       = NPCM7XX_SMP_LOADER_START,
366     .smp_bootreg_addr       = NPCM7XX_SMP_BOOTREG_ADDR,
367     .gic_cpu_if_addr        = NPCM7XX_GIC_CPU_IF_ADDR,
368     .write_secondary_boot   = npcm7xx_write_secondary_boot,
369     .board_id               = -1,
370     .board_setup_addr       = NPCM7XX_BOARD_SETUP_ADDR,
371     .write_board_setup      = npcm7xx_write_board_setup,
372 };
373 
374 void npcm7xx_load_kernel(MachineState *machine, NPCM7xxState *soc)
375 {
376     npcm7xx_binfo.ram_size = machine->ram_size;
377 
378     arm_load_kernel(&soc->cpu[0], machine, &npcm7xx_binfo);
379 }
380 
381 static void npcm7xx_init_fuses(NPCM7xxState *s)
382 {
383     NPCM7xxClass *nc = NPCM7XX_GET_CLASS(s);
384     uint32_t value;
385 
386     /*
387      * The initial mask of disabled modules indicates the chip derivative (e.g.
388      * NPCM750 or NPCM730).
389      */
390     value = cpu_to_le32(nc->disabled_modules);
391     npcm7xx_otp_array_write(&s->fuse_array, &value, NPCM7XX_FUSE_DERIVATIVE,
392                             sizeof(value));
393 }
394 
395 static void npcm7xx_write_adc_calibration(NPCM7xxState *s)
396 {
397     /* Both ADC and the fuse array must have realized. */
398     QEMU_BUILD_BUG_ON(sizeof(s->adc.calibration_r_values) != 4);
399     npcm7xx_otp_array_write(&s->fuse_array, s->adc.calibration_r_values,
400             NPCM7XX_FUSE_ADC_CALIB, sizeof(s->adc.calibration_r_values));
401 }
402 
403 static qemu_irq npcm7xx_irq(NPCM7xxState *s, int n)
404 {
405     return qdev_get_gpio_in(DEVICE(&s->a9mpcore), n);
406 }
407 
408 static void npcm7xx_init(Object *obj)
409 {
410     NPCM7xxState *s = NPCM7XX(obj);
411     int i;
412 
413     for (i = 0; i < NPCM7XX_MAX_NUM_CPUS; i++) {
414         object_initialize_child(obj, "cpu[*]", &s->cpu[i],
415                                 ARM_CPU_TYPE_NAME("cortex-a9"));
416     }
417 
418     object_initialize_child(obj, "a9mpcore", &s->a9mpcore, TYPE_A9MPCORE_PRIV);
419     object_initialize_child(obj, "gcr", &s->gcr, TYPE_NPCM7XX_GCR);
420     object_property_add_alias(obj, "power-on-straps", OBJECT(&s->gcr),
421                               "power-on-straps");
422     object_initialize_child(obj, "clk", &s->clk, TYPE_NPCM7XX_CLK);
423     object_initialize_child(obj, "otp1", &s->key_storage,
424                             TYPE_NPCM7XX_KEY_STORAGE);
425     object_initialize_child(obj, "otp2", &s->fuse_array,
426                             TYPE_NPCM7XX_FUSE_ARRAY);
427     object_initialize_child(obj, "mc", &s->mc, TYPE_NPCM7XX_MC);
428     object_initialize_child(obj, "rng", &s->rng, TYPE_NPCM7XX_RNG);
429     object_initialize_child(obj, "adc", &s->adc, TYPE_NPCM7XX_ADC);
430 
431     for (i = 0; i < ARRAY_SIZE(s->tim); i++) {
432         object_initialize_child(obj, "tim[*]", &s->tim[i], TYPE_NPCM7XX_TIMER);
433     }
434 
435     for (i = 0; i < ARRAY_SIZE(s->gpio); i++) {
436         object_initialize_child(obj, "gpio[*]", &s->gpio[i], TYPE_NPCM7XX_GPIO);
437     }
438 
439     for (i = 0; i < ARRAY_SIZE(s->smbus); i++) {
440         object_initialize_child(obj, "smbus[*]", &s->smbus[i],
441                                 TYPE_NPCM7XX_SMBUS);
442     }
443 
444     object_initialize_child(obj, "ehci", &s->ehci, TYPE_NPCM7XX_EHCI);
445     object_initialize_child(obj, "ohci", &s->ohci, TYPE_SYSBUS_OHCI);
446 
447     QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_fiu) != ARRAY_SIZE(s->fiu));
448     for (i = 0; i < ARRAY_SIZE(s->fiu); i++) {
449         object_initialize_child(obj, npcm7xx_fiu[i].name, &s->fiu[i],
450                                 TYPE_NPCM7XX_FIU);
451     }
452 
453     for (i = 0; i < ARRAY_SIZE(s->pwm); i++) {
454         object_initialize_child(obj, "pwm[*]", &s->pwm[i], TYPE_NPCM7XX_PWM);
455     }
456 
457     for (i = 0; i < ARRAY_SIZE(s->mft); i++) {
458         object_initialize_child(obj, "mft[*]", &s->mft[i], TYPE_NPCM7XX_MFT);
459     }
460 
461     for (i = 0; i < ARRAY_SIZE(s->emc); i++) {
462         object_initialize_child(obj, "emc[*]", &s->emc[i], TYPE_NPCM7XX_EMC);
463     }
464 
465     for (i = 0; i < ARRAY_SIZE(s->pspi); i++) {
466         object_initialize_child(obj, "pspi[*]", &s->pspi[i], TYPE_NPCM_PSPI);
467     }
468 
469     for (i = 0; i < ARRAY_SIZE(s->gmac); i++) {
470         object_initialize_child(obj, "gmac[*]", &s->gmac[i], TYPE_NPCM_GMAC);
471     }
472 
473     object_initialize_child(obj, "mmc", &s->mmc, TYPE_NPCM7XX_SDHCI);
474 }
475 
476 static void npcm7xx_realize(DeviceState *dev, Error **errp)
477 {
478     NPCM7xxState *s = NPCM7XX(dev);
479     NPCM7xxClass *nc = NPCM7XX_GET_CLASS(s);
480     int i;
481 
482     if (memory_region_size(s->dram) > NPCM7XX_DRAM_SZ) {
483         error_setg(errp, "%s: NPCM7xx cannot address more than %" PRIu64
484                    " MiB of DRAM", __func__, NPCM7XX_DRAM_SZ / MiB);
485         return;
486     }
487 
488     /* CPUs */
489     for (i = 0; i < nc->num_cpus; i++) {
490         object_property_set_int(OBJECT(&s->cpu[i]), "mp-affinity",
491                                 arm_build_mp_affinity(i, NPCM7XX_MAX_NUM_CPUS),
492                                 &error_abort);
493         object_property_set_int(OBJECT(&s->cpu[i]), "reset-cbar",
494                                 NPCM7XX_GIC_CPU_IF_ADDR, &error_abort);
495         object_property_set_bool(OBJECT(&s->cpu[i]), "reset-hivecs", true,
496                                  &error_abort);
497 
498         /* Disable security extensions. */
499         object_property_set_bool(OBJECT(&s->cpu[i]), "has_el3", false,
500                                  &error_abort);
501 
502         if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
503             return;
504         }
505     }
506 
507     /* A9MPCORE peripherals. Can only fail if we pass bad parameters here. */
508     object_property_set_int(OBJECT(&s->a9mpcore), "num-cpu", nc->num_cpus,
509                             &error_abort);
510     object_property_set_int(OBJECT(&s->a9mpcore), "num-irq", NPCM7XX_NUM_IRQ,
511                             &error_abort);
512     sysbus_realize(SYS_BUS_DEVICE(&s->a9mpcore), &error_abort);
513     sysbus_mmio_map(SYS_BUS_DEVICE(&s->a9mpcore), 0, NPCM7XX_CPUP_BA);
514 
515     for (i = 0; i < nc->num_cpus; i++) {
516         sysbus_connect_irq(SYS_BUS_DEVICE(&s->a9mpcore), i,
517                            qdev_get_gpio_in(DEVICE(&s->cpu[i]), ARM_CPU_IRQ));
518         sysbus_connect_irq(SYS_BUS_DEVICE(&s->a9mpcore), i + nc->num_cpus,
519                            qdev_get_gpio_in(DEVICE(&s->cpu[i]), ARM_CPU_FIQ));
520     }
521 
522     /* L2 cache controller */
523     sysbus_create_simple("l2x0", NPCM7XX_L2C_BA, NULL);
524 
525     /* System Global Control Registers (GCR). Can fail due to user input. */
526     object_property_set_int(OBJECT(&s->gcr), "disabled-modules",
527                             nc->disabled_modules, &error_abort);
528     object_property_add_const_link(OBJECT(&s->gcr), "dram-mr", OBJECT(s->dram));
529     if (!sysbus_realize(SYS_BUS_DEVICE(&s->gcr), errp)) {
530         return;
531     }
532     sysbus_mmio_map(SYS_BUS_DEVICE(&s->gcr), 0, NPCM7XX_GCR_BA);
533 
534     /* Clock Control Registers (CLK). Cannot fail. */
535     sysbus_realize(SYS_BUS_DEVICE(&s->clk), &error_abort);
536     sysbus_mmio_map(SYS_BUS_DEVICE(&s->clk), 0, NPCM7XX_CLK_BA);
537 
538     /* OTP key storage and fuse strap array. Cannot fail. */
539     sysbus_realize(SYS_BUS_DEVICE(&s->key_storage), &error_abort);
540     sysbus_mmio_map(SYS_BUS_DEVICE(&s->key_storage), 0, NPCM7XX_OTP1_BA);
541     sysbus_realize(SYS_BUS_DEVICE(&s->fuse_array), &error_abort);
542     sysbus_mmio_map(SYS_BUS_DEVICE(&s->fuse_array), 0, NPCM7XX_OTP2_BA);
543     npcm7xx_init_fuses(s);
544 
545     /* Fake Memory Controller (MC). Cannot fail. */
546     sysbus_realize(SYS_BUS_DEVICE(&s->mc), &error_abort);
547     sysbus_mmio_map(SYS_BUS_DEVICE(&s->mc), 0, NPCM7XX_MC_BA);
548 
549     /* ADC Modules. Cannot fail. */
550     qdev_connect_clock_in(DEVICE(&s->adc), "clock", qdev_get_clock_out(
551                           DEVICE(&s->clk), "adc-clock"));
552     sysbus_realize(SYS_BUS_DEVICE(&s->adc), &error_abort);
553     sysbus_mmio_map(SYS_BUS_DEVICE(&s->adc), 0, NPCM7XX_ADC_BA);
554     sysbus_connect_irq(SYS_BUS_DEVICE(&s->adc), 0,
555             npcm7xx_irq(s, NPCM7XX_ADC_IRQ));
556     npcm7xx_write_adc_calibration(s);
557 
558     /* Timer Modules (TIM). Cannot fail. */
559     QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_tim_addr) != ARRAY_SIZE(s->tim));
560     for (i = 0; i < ARRAY_SIZE(s->tim); i++) {
561         SysBusDevice *sbd = SYS_BUS_DEVICE(&s->tim[i]);
562         int first_irq;
563         int j;
564 
565         /* Connect the timer clock. */
566         qdev_connect_clock_in(DEVICE(&s->tim[i]), "clock", qdev_get_clock_out(
567                     DEVICE(&s->clk), "timer-clock"));
568 
569         sysbus_realize(sbd, &error_abort);
570         sysbus_mmio_map(sbd, 0, npcm7xx_tim_addr[i]);
571 
572         first_irq = NPCM7XX_TIMER0_IRQ + i * NPCM7XX_TIMERS_PER_CTRL;
573         for (j = 0; j < NPCM7XX_TIMERS_PER_CTRL; j++) {
574             qemu_irq irq = npcm7xx_irq(s, first_irq + j);
575             sysbus_connect_irq(sbd, j, irq);
576         }
577 
578         /* IRQ for watchdogs */
579         sysbus_connect_irq(sbd, NPCM7XX_TIMERS_PER_CTRL,
580                 npcm7xx_irq(s, NPCM7XX_WDG0_IRQ + i));
581         /* GPIO that connects clk module with watchdog */
582         qdev_connect_gpio_out_named(DEVICE(&s->tim[i]),
583                 NPCM7XX_WATCHDOG_RESET_GPIO_OUT, 0,
584                 qdev_get_gpio_in_named(DEVICE(&s->clk),
585                         NPCM7XX_WATCHDOG_RESET_GPIO_IN, i));
586     }
587 
588     /* UART0..3 (16550 compatible) */
589     for (i = 0; i < ARRAY_SIZE(npcm7xx_uart_addr); i++) {
590         serial_mm_init(get_system_memory(), npcm7xx_uart_addr[i], 2,
591                        npcm7xx_irq(s, NPCM7XX_UART0_IRQ + i), 115200,
592                        serial_hd(i), DEVICE_LITTLE_ENDIAN);
593     }
594 
595     /* Random Number Generator. Cannot fail. */
596     sysbus_realize(SYS_BUS_DEVICE(&s->rng), &error_abort);
597     sysbus_mmio_map(SYS_BUS_DEVICE(&s->rng), 0, NPCM7XX_RNG_BA);
598 
599     /* GPIO modules. Cannot fail. */
600     QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_gpio) != ARRAY_SIZE(s->gpio));
601     for (i = 0; i < ARRAY_SIZE(s->gpio); i++) {
602         Object *obj = OBJECT(&s->gpio[i]);
603 
604         object_property_set_uint(obj, "reset-pullup",
605                                  npcm7xx_gpio[i].reset_pu, &error_abort);
606         object_property_set_uint(obj, "reset-pulldown",
607                                  npcm7xx_gpio[i].reset_pd, &error_abort);
608         object_property_set_uint(obj, "reset-osrc",
609                                  npcm7xx_gpio[i].reset_osrc, &error_abort);
610         object_property_set_uint(obj, "reset-odsc",
611                                  npcm7xx_gpio[i].reset_odsc, &error_abort);
612         sysbus_realize(SYS_BUS_DEVICE(obj), &error_abort);
613         sysbus_mmio_map(SYS_BUS_DEVICE(obj), 0, npcm7xx_gpio[i].regs_addr);
614         sysbus_connect_irq(SYS_BUS_DEVICE(obj), 0,
615                            npcm7xx_irq(s, NPCM7XX_GPIO0_IRQ + i));
616     }
617 
618     /* SMBus modules. Cannot fail. */
619     QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_smbus_addr) != ARRAY_SIZE(s->smbus));
620     for (i = 0; i < ARRAY_SIZE(s->smbus); i++) {
621         Object *obj = OBJECT(&s->smbus[i]);
622 
623         sysbus_realize(SYS_BUS_DEVICE(obj), &error_abort);
624         sysbus_mmio_map(SYS_BUS_DEVICE(obj), 0, npcm7xx_smbus_addr[i]);
625         sysbus_connect_irq(SYS_BUS_DEVICE(obj), 0,
626                            npcm7xx_irq(s, NPCM7XX_SMBUS0_IRQ + i));
627     }
628 
629     /* USB Host */
630     object_property_set_bool(OBJECT(&s->ehci), "companion-enable", true,
631                              &error_abort);
632     sysbus_realize(SYS_BUS_DEVICE(&s->ehci), &error_abort);
633     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ehci), 0, NPCM7XX_EHCI_BA);
634     sysbus_connect_irq(SYS_BUS_DEVICE(&s->ehci), 0,
635                        npcm7xx_irq(s, NPCM7XX_EHCI_IRQ));
636 
637     object_property_set_str(OBJECT(&s->ohci), "masterbus", "usb-bus.0",
638                             &error_abort);
639     object_property_set_uint(OBJECT(&s->ohci), "num-ports", 1, &error_abort);
640     sysbus_realize(SYS_BUS_DEVICE(&s->ohci), &error_abort);
641     sysbus_mmio_map(SYS_BUS_DEVICE(&s->ohci), 0, NPCM7XX_OHCI_BA);
642     sysbus_connect_irq(SYS_BUS_DEVICE(&s->ohci), 0,
643                        npcm7xx_irq(s, NPCM7XX_OHCI_IRQ));
644 
645     /* PWM Modules. Cannot fail. */
646     QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_pwm_addr) != ARRAY_SIZE(s->pwm));
647     for (i = 0; i < ARRAY_SIZE(s->pwm); i++) {
648         SysBusDevice *sbd = SYS_BUS_DEVICE(&s->pwm[i]);
649 
650         qdev_connect_clock_in(DEVICE(&s->pwm[i]), "clock", qdev_get_clock_out(
651                     DEVICE(&s->clk), "apb3-clock"));
652         sysbus_realize(sbd, &error_abort);
653         sysbus_mmio_map(sbd, 0, npcm7xx_pwm_addr[i]);
654         sysbus_connect_irq(sbd, i, npcm7xx_irq(s, NPCM7XX_PWM0_IRQ + i));
655     }
656 
657     /* MFT Modules. Cannot fail. */
658     QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_mft_addr) != ARRAY_SIZE(s->mft));
659     for (i = 0; i < ARRAY_SIZE(s->mft); i++) {
660         SysBusDevice *sbd = SYS_BUS_DEVICE(&s->mft[i]);
661 
662         qdev_connect_clock_in(DEVICE(&s->mft[i]), "clock-in",
663                               qdev_get_clock_out(DEVICE(&s->clk),
664                                                  "apb4-clock"));
665         sysbus_realize(sbd, &error_abort);
666         sysbus_mmio_map(sbd, 0, npcm7xx_mft_addr[i]);
667         sysbus_connect_irq(sbd, 0, npcm7xx_irq(s, NPCM7XX_MFT0_IRQ + i));
668     }
669 
670     /*
671      * EMC Modules. Cannot fail.
672      * Use the available NIC configurations in order, allowing 'emc0' and
673      * 'emc1' to by used as aliases for the model= parameter to override.
674      *
675      * This works around the inability to specify the netdev property for the
676      * emc device: it's not pluggable and thus the -device option can't be
677      * used.
678      */
679     QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_emc_addr) != ARRAY_SIZE(s->emc));
680     QEMU_BUILD_BUG_ON(ARRAY_SIZE(s->emc) != 2);
681     for (i = 0; i < ARRAY_SIZE(s->emc); i++) {
682         SysBusDevice *sbd = SYS_BUS_DEVICE(&s->emc[i]);
683         char alias[6];
684 
685         s->emc[i].emc_num = i;
686         snprintf(alias, sizeof(alias), "emc%u", i);
687         qemu_configure_nic_device(DEVICE(sbd), true, alias);
688 
689         /*
690          * The device exists regardless of whether it's connected to a QEMU
691          * netdev backend. So always instantiate it even if there is no
692          * backend.
693          */
694         sysbus_realize(sbd, &error_abort);
695         sysbus_mmio_map(sbd, 0, npcm7xx_emc_addr[i]);
696         int tx_irq = i == 0 ? NPCM7XX_EMC1TX_IRQ : NPCM7XX_EMC2TX_IRQ;
697         int rx_irq = i == 0 ? NPCM7XX_EMC1RX_IRQ : NPCM7XX_EMC2RX_IRQ;
698         /*
699          * N.B. The values for the second argument sysbus_connect_irq are
700          * chosen to match the registration order in npcm7xx_emc_realize.
701          */
702         sysbus_connect_irq(sbd, 0, npcm7xx_irq(s, tx_irq));
703         sysbus_connect_irq(sbd, 1, npcm7xx_irq(s, rx_irq));
704     }
705 
706     /*
707      * GMAC Modules. Cannot fail.
708      */
709     QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_gmac_addr) != ARRAY_SIZE(s->gmac));
710     QEMU_BUILD_BUG_ON(ARRAY_SIZE(s->gmac) != 2);
711     for (i = 0; i < ARRAY_SIZE(s->gmac); i++) {
712         SysBusDevice *sbd = SYS_BUS_DEVICE(&s->gmac[i]);
713 
714         qemu_configure_nic_device(DEVICE(sbd), false, NULL);
715         /*
716          * The device exists regardless of whether it's connected to a QEMU
717          * netdev backend. So always instantiate it even if there is no
718          * backend.
719          */
720         sysbus_realize(sbd, &error_abort);
721         sysbus_mmio_map(sbd, 0, npcm7xx_gmac_addr[i]);
722         int irq = i == 0 ? NPCM7XX_GMAC1_IRQ : NPCM7XX_GMAC2_IRQ;
723         /*
724          * N.B. The values for the second argument sysbus_connect_irq are
725          * chosen to match the registration order in npcm7xx_emc_realize.
726          */
727         sysbus_connect_irq(sbd, 0, npcm7xx_irq(s, irq));
728     }
729 
730     /*
731      * Flash Interface Unit (FIU). Can fail if incorrect number of chip selects
732      * specified, but this is a programming error.
733      */
734     QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_fiu) != ARRAY_SIZE(s->fiu));
735     for (i = 0; i < ARRAY_SIZE(s->fiu); i++) {
736         SysBusDevice *sbd = SYS_BUS_DEVICE(&s->fiu[i]);
737         int j;
738 
739         object_property_set_int(OBJECT(sbd), "cs-count",
740                                 npcm7xx_fiu[i].cs_count, &error_abort);
741         sysbus_realize(sbd, &error_abort);
742 
743         sysbus_mmio_map(sbd, 0, npcm7xx_fiu[i].regs_addr);
744         for (j = 0; j < npcm7xx_fiu[i].cs_count; j++) {
745             sysbus_mmio_map(sbd, j + 1, npcm7xx_fiu[i].flash_addr[j]);
746         }
747     }
748 
749     /* RAM2 (SRAM) */
750     memory_region_init_ram(&s->sram, OBJECT(dev), "ram2",
751                            NPCM7XX_RAM2_SZ, &error_abort);
752     memory_region_add_subregion(get_system_memory(), NPCM7XX_RAM2_BA, &s->sram);
753 
754     /* RAM3 (SRAM) */
755     memory_region_init_ram(&s->ram3, OBJECT(dev), "ram3",
756                            NPCM7XX_RAM3_SZ, &error_abort);
757     memory_region_add_subregion(get_system_memory(), NPCM7XX_RAM3_BA, &s->ram3);
758 
759     /* Internal ROM */
760     memory_region_init_rom(&s->irom, OBJECT(dev), "irom", NPCM7XX_ROM_SZ,
761                            &error_abort);
762     memory_region_add_subregion(get_system_memory(), NPCM7XX_ROM_BA, &s->irom);
763 
764     /* SDHCI */
765     sysbus_realize(SYS_BUS_DEVICE(&s->mmc), &error_abort);
766     sysbus_mmio_map(SYS_BUS_DEVICE(&s->mmc), 0, NPCM7XX_MMC_BA);
767     sysbus_connect_irq(SYS_BUS_DEVICE(&s->mmc), 0,
768             npcm7xx_irq(s, NPCM7XX_MMC_IRQ));
769 
770     /* PSPI */
771     QEMU_BUILD_BUG_ON(ARRAY_SIZE(npcm7xx_pspi_addr) != ARRAY_SIZE(s->pspi));
772     for (i = 0; i < ARRAY_SIZE(s->pspi); i++) {
773         SysBusDevice *sbd = SYS_BUS_DEVICE(&s->pspi[i]);
774         int irq = (i == 0) ? NPCM7XX_PSPI1_IRQ : NPCM7XX_PSPI2_IRQ;
775 
776         sysbus_realize(sbd, &error_abort);
777         sysbus_mmio_map(sbd, 0, npcm7xx_pspi_addr[i]);
778         sysbus_connect_irq(sbd, 0, npcm7xx_irq(s, irq));
779     }
780 
781     create_unimplemented_device("npcm7xx.shm",          0xc0001000,   4 * KiB);
782     create_unimplemented_device("npcm7xx.vdmx",         0xe0800000,   4 * KiB);
783     create_unimplemented_device("npcm7xx.pcierc",       0xe1000000,  64 * KiB);
784     create_unimplemented_device("npcm7xx.kcs",          0xf0007000,   4 * KiB);
785     create_unimplemented_device("npcm7xx.gfxi",         0xf000e000,   4 * KiB);
786     create_unimplemented_device("npcm7xx.espi",         0xf009f000,   4 * KiB);
787     create_unimplemented_device("npcm7xx.peci",         0xf0100000,   4 * KiB);
788     create_unimplemented_device("npcm7xx.siox[1]",      0xf0101000,   4 * KiB);
789     create_unimplemented_device("npcm7xx.siox[2]",      0xf0102000,   4 * KiB);
790     create_unimplemented_device("npcm7xx.ahbpci",       0xf0400000,   1 * MiB);
791     create_unimplemented_device("npcm7xx.mcphy",        0xf05f0000,  64 * KiB);
792     create_unimplemented_device("npcm7xx.vcd",          0xf0810000,  64 * KiB);
793     create_unimplemented_device("npcm7xx.ece",          0xf0820000,   8 * KiB);
794     create_unimplemented_device("npcm7xx.vdma",         0xf0822000,   8 * KiB);
795     create_unimplemented_device("npcm7xx.usbd[0]",      0xf0830000,   4 * KiB);
796     create_unimplemented_device("npcm7xx.usbd[1]",      0xf0831000,   4 * KiB);
797     create_unimplemented_device("npcm7xx.usbd[2]",      0xf0832000,   4 * KiB);
798     create_unimplemented_device("npcm7xx.usbd[3]",      0xf0833000,   4 * KiB);
799     create_unimplemented_device("npcm7xx.usbd[4]",      0xf0834000,   4 * KiB);
800     create_unimplemented_device("npcm7xx.usbd[5]",      0xf0835000,   4 * KiB);
801     create_unimplemented_device("npcm7xx.usbd[6]",      0xf0836000,   4 * KiB);
802     create_unimplemented_device("npcm7xx.usbd[7]",      0xf0837000,   4 * KiB);
803     create_unimplemented_device("npcm7xx.usbd[8]",      0xf0838000,   4 * KiB);
804     create_unimplemented_device("npcm7xx.usbd[9]",      0xf0839000,   4 * KiB);
805     create_unimplemented_device("npcm7xx.sd",           0xf0840000,   8 * KiB);
806     create_unimplemented_device("npcm7xx.pcimbx",       0xf0848000, 512 * KiB);
807     create_unimplemented_device("npcm7xx.aes",          0xf0858000,   4 * KiB);
808     create_unimplemented_device("npcm7xx.des",          0xf0859000,   4 * KiB);
809     create_unimplemented_device("npcm7xx.sha",          0xf085a000,   4 * KiB);
810     create_unimplemented_device("npcm7xx.secacc",       0xf085b000,   4 * KiB);
811     create_unimplemented_device("npcm7xx.spixcs0",      0xf8000000,  16 * MiB);
812     create_unimplemented_device("npcm7xx.spixcs1",      0xf9000000,  16 * MiB);
813     create_unimplemented_device("npcm7xx.spix",         0xfb001000,   4 * KiB);
814 }
815 
816 static Property npcm7xx_properties[] = {
817     DEFINE_PROP_LINK("dram-mr", NPCM7xxState, dram, TYPE_MEMORY_REGION,
818                      MemoryRegion *),
819     DEFINE_PROP_END_OF_LIST(),
820 };
821 
822 static void npcm7xx_class_init(ObjectClass *oc, void *data)
823 {
824     DeviceClass *dc = DEVICE_CLASS(oc);
825 
826     dc->realize = npcm7xx_realize;
827     dc->user_creatable = false;
828     device_class_set_props(dc, npcm7xx_properties);
829 }
830 
831 static void npcm730_class_init(ObjectClass *oc, void *data)
832 {
833     NPCM7xxClass *nc = NPCM7XX_CLASS(oc);
834 
835     /* NPCM730 is optimized for data center use, so no graphics, etc. */
836     nc->disabled_modules = 0x00300395;
837     nc->num_cpus = 2;
838 }
839 
840 static void npcm750_class_init(ObjectClass *oc, void *data)
841 {
842     NPCM7xxClass *nc = NPCM7XX_CLASS(oc);
843 
844     /* NPCM750 has 2 cores and a full set of peripherals */
845     nc->disabled_modules = 0x00000000;
846     nc->num_cpus = 2;
847 }
848 
849 static const TypeInfo npcm7xx_soc_types[] = {
850     {
851         .name           = TYPE_NPCM7XX,
852         .parent         = TYPE_DEVICE,
853         .instance_size  = sizeof(NPCM7xxState),
854         .instance_init  = npcm7xx_init,
855         .class_size     = sizeof(NPCM7xxClass),
856         .class_init     = npcm7xx_class_init,
857         .abstract       = true,
858     }, {
859         .name           = TYPE_NPCM730,
860         .parent         = TYPE_NPCM7XX,
861         .class_init     = npcm730_class_init,
862     }, {
863         .name           = TYPE_NPCM750,
864         .parent         = TYPE_NPCM7XX,
865         .class_init     = npcm750_class_init,
866     },
867 };
868 
869 DEFINE_TYPES(npcm7xx_soc_types);
870