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