Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.2-rc7 682 lines 17 kB view raw
1/* 2 * linux/arch/arm/common/gic.c 3 * 4 * Copyright (C) 2002 ARM Limited, All Rights Reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 2 as 8 * published by the Free Software Foundation. 9 * 10 * Interrupt architecture for the GIC: 11 * 12 * o There is one Interrupt Distributor, which receives interrupts 13 * from system devices and sends them to the Interrupt Controllers. 14 * 15 * o There is one CPU Interface per CPU, which sends interrupts sent 16 * by the Distributor, and interrupts generated locally, to the 17 * associated CPU. The base address of the CPU interface is usually 18 * aliased so that the same address points to different chips depending 19 * on the CPU it is accessed from. 20 * 21 * Note that IRQs 0-31 are special - they are local to each CPU. 22 * As such, the enable set/clear, pending set/clear and active bit 23 * registers are banked per-cpu for these sources. 24 */ 25#include <linux/init.h> 26#include <linux/kernel.h> 27#include <linux/err.h> 28#include <linux/module.h> 29#include <linux/list.h> 30#include <linux/smp.h> 31#include <linux/cpu_pm.h> 32#include <linux/cpumask.h> 33#include <linux/io.h> 34#include <linux/of.h> 35#include <linux/of_address.h> 36#include <linux/of_irq.h> 37#include <linux/irqdomain.h> 38#include <linux/interrupt.h> 39#include <linux/percpu.h> 40#include <linux/slab.h> 41 42#include <asm/irq.h> 43#include <asm/mach/irq.h> 44#include <asm/hardware/gic.h> 45 46static DEFINE_RAW_SPINLOCK(irq_controller_lock); 47 48/* Address of GIC 0 CPU interface */ 49void __iomem *gic_cpu_base_addr __read_mostly; 50 51/* 52 * Supported arch specific GIC irq extension. 53 * Default make them NULL. 54 */ 55struct irq_chip gic_arch_extn = { 56 .irq_eoi = NULL, 57 .irq_mask = NULL, 58 .irq_unmask = NULL, 59 .irq_retrigger = NULL, 60 .irq_set_type = NULL, 61 .irq_set_wake = NULL, 62}; 63 64#ifndef MAX_GIC_NR 65#define MAX_GIC_NR 1 66#endif 67 68static struct gic_chip_data gic_data[MAX_GIC_NR] __read_mostly; 69 70static inline void __iomem *gic_dist_base(struct irq_data *d) 71{ 72 struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); 73 return gic_data->dist_base; 74} 75 76static inline void __iomem *gic_cpu_base(struct irq_data *d) 77{ 78 struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d); 79 return gic_data->cpu_base; 80} 81 82static inline unsigned int gic_irq(struct irq_data *d) 83{ 84 return d->hwirq; 85} 86 87/* 88 * Routines to acknowledge, disable and enable interrupts 89 */ 90static void gic_mask_irq(struct irq_data *d) 91{ 92 u32 mask = 1 << (gic_irq(d) % 32); 93 94 raw_spin_lock(&irq_controller_lock); 95 writel_relaxed(mask, gic_dist_base(d) + GIC_DIST_ENABLE_CLEAR + (gic_irq(d) / 32) * 4); 96 if (gic_arch_extn.irq_mask) 97 gic_arch_extn.irq_mask(d); 98 raw_spin_unlock(&irq_controller_lock); 99} 100 101static void gic_unmask_irq(struct irq_data *d) 102{ 103 u32 mask = 1 << (gic_irq(d) % 32); 104 105 raw_spin_lock(&irq_controller_lock); 106 if (gic_arch_extn.irq_unmask) 107 gic_arch_extn.irq_unmask(d); 108 writel_relaxed(mask, gic_dist_base(d) + GIC_DIST_ENABLE_SET + (gic_irq(d) / 32) * 4); 109 raw_spin_unlock(&irq_controller_lock); 110} 111 112static void gic_eoi_irq(struct irq_data *d) 113{ 114 if (gic_arch_extn.irq_eoi) { 115 raw_spin_lock(&irq_controller_lock); 116 gic_arch_extn.irq_eoi(d); 117 raw_spin_unlock(&irq_controller_lock); 118 } 119 120 writel_relaxed(gic_irq(d), gic_cpu_base(d) + GIC_CPU_EOI); 121} 122 123static int gic_set_type(struct irq_data *d, unsigned int type) 124{ 125 void __iomem *base = gic_dist_base(d); 126 unsigned int gicirq = gic_irq(d); 127 u32 enablemask = 1 << (gicirq % 32); 128 u32 enableoff = (gicirq / 32) * 4; 129 u32 confmask = 0x2 << ((gicirq % 16) * 2); 130 u32 confoff = (gicirq / 16) * 4; 131 bool enabled = false; 132 u32 val; 133 134 /* Interrupt configuration for SGIs can't be changed */ 135 if (gicirq < 16) 136 return -EINVAL; 137 138 if (type != IRQ_TYPE_LEVEL_HIGH && type != IRQ_TYPE_EDGE_RISING) 139 return -EINVAL; 140 141 raw_spin_lock(&irq_controller_lock); 142 143 if (gic_arch_extn.irq_set_type) 144 gic_arch_extn.irq_set_type(d, type); 145 146 val = readl_relaxed(base + GIC_DIST_CONFIG + confoff); 147 if (type == IRQ_TYPE_LEVEL_HIGH) 148 val &= ~confmask; 149 else if (type == IRQ_TYPE_EDGE_RISING) 150 val |= confmask; 151 152 /* 153 * As recommended by the spec, disable the interrupt before changing 154 * the configuration 155 */ 156 if (readl_relaxed(base + GIC_DIST_ENABLE_SET + enableoff) & enablemask) { 157 writel_relaxed(enablemask, base + GIC_DIST_ENABLE_CLEAR + enableoff); 158 enabled = true; 159 } 160 161 writel_relaxed(val, base + GIC_DIST_CONFIG + confoff); 162 163 if (enabled) 164 writel_relaxed(enablemask, base + GIC_DIST_ENABLE_SET + enableoff); 165 166 raw_spin_unlock(&irq_controller_lock); 167 168 return 0; 169} 170 171static int gic_retrigger(struct irq_data *d) 172{ 173 if (gic_arch_extn.irq_retrigger) 174 return gic_arch_extn.irq_retrigger(d); 175 176 return -ENXIO; 177} 178 179#ifdef CONFIG_SMP 180static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, 181 bool force) 182{ 183 void __iomem *reg = gic_dist_base(d) + GIC_DIST_TARGET + (gic_irq(d) & ~3); 184 unsigned int shift = (gic_irq(d) % 4) * 8; 185 unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask); 186 u32 val, mask, bit; 187 188 if (cpu >= 8 || cpu >= nr_cpu_ids) 189 return -EINVAL; 190 191 mask = 0xff << shift; 192 bit = 1 << (cpu_logical_map(cpu) + shift); 193 194 raw_spin_lock(&irq_controller_lock); 195 val = readl_relaxed(reg) & ~mask; 196 writel_relaxed(val | bit, reg); 197 raw_spin_unlock(&irq_controller_lock); 198 199 return IRQ_SET_MASK_OK; 200} 201#endif 202 203#ifdef CONFIG_PM 204static int gic_set_wake(struct irq_data *d, unsigned int on) 205{ 206 int ret = -ENXIO; 207 208 if (gic_arch_extn.irq_set_wake) 209 ret = gic_arch_extn.irq_set_wake(d, on); 210 211 return ret; 212} 213 214#else 215#define gic_set_wake NULL 216#endif 217 218static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc) 219{ 220 struct gic_chip_data *chip_data = irq_get_handler_data(irq); 221 struct irq_chip *chip = irq_get_chip(irq); 222 unsigned int cascade_irq, gic_irq; 223 unsigned long status; 224 225 chained_irq_enter(chip, desc); 226 227 raw_spin_lock(&irq_controller_lock); 228 status = readl_relaxed(chip_data->cpu_base + GIC_CPU_INTACK); 229 raw_spin_unlock(&irq_controller_lock); 230 231 gic_irq = (status & 0x3ff); 232 if (gic_irq == 1023) 233 goto out; 234 235 cascade_irq = irq_domain_to_irq(&chip_data->domain, gic_irq); 236 if (unlikely(gic_irq < 32 || gic_irq > 1020 || cascade_irq >= NR_IRQS)) 237 do_bad_IRQ(cascade_irq, desc); 238 else 239 generic_handle_irq(cascade_irq); 240 241 out: 242 chained_irq_exit(chip, desc); 243} 244 245static struct irq_chip gic_chip = { 246 .name = "GIC", 247 .irq_mask = gic_mask_irq, 248 .irq_unmask = gic_unmask_irq, 249 .irq_eoi = gic_eoi_irq, 250 .irq_set_type = gic_set_type, 251 .irq_retrigger = gic_retrigger, 252#ifdef CONFIG_SMP 253 .irq_set_affinity = gic_set_affinity, 254#endif 255 .irq_set_wake = gic_set_wake, 256}; 257 258void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq) 259{ 260 if (gic_nr >= MAX_GIC_NR) 261 BUG(); 262 if (irq_set_handler_data(irq, &gic_data[gic_nr]) != 0) 263 BUG(); 264 irq_set_chained_handler(irq, gic_handle_cascade_irq); 265} 266 267static void __init gic_dist_init(struct gic_chip_data *gic) 268{ 269 unsigned int i, irq; 270 u32 cpumask; 271 unsigned int gic_irqs = gic->gic_irqs; 272 struct irq_domain *domain = &gic->domain; 273 void __iomem *base = gic->dist_base; 274 u32 cpu = 0; 275 276#ifdef CONFIG_SMP 277 cpu = cpu_logical_map(smp_processor_id()); 278#endif 279 280 cpumask = 1 << cpu; 281 cpumask |= cpumask << 8; 282 cpumask |= cpumask << 16; 283 284 writel_relaxed(0, base + GIC_DIST_CTRL); 285 286 /* 287 * Set all global interrupts to be level triggered, active low. 288 */ 289 for (i = 32; i < gic_irqs; i += 16) 290 writel_relaxed(0, base + GIC_DIST_CONFIG + i * 4 / 16); 291 292 /* 293 * Set all global interrupts to this CPU only. 294 */ 295 for (i = 32; i < gic_irqs; i += 4) 296 writel_relaxed(cpumask, base + GIC_DIST_TARGET + i * 4 / 4); 297 298 /* 299 * Set priority on all global interrupts. 300 */ 301 for (i = 32; i < gic_irqs; i += 4) 302 writel_relaxed(0xa0a0a0a0, base + GIC_DIST_PRI + i * 4 / 4); 303 304 /* 305 * Disable all interrupts. Leave the PPI and SGIs alone 306 * as these enables are banked registers. 307 */ 308 for (i = 32; i < gic_irqs; i += 32) 309 writel_relaxed(0xffffffff, base + GIC_DIST_ENABLE_CLEAR + i * 4 / 32); 310 311 /* 312 * Setup the Linux IRQ subsystem. 313 */ 314 irq_domain_for_each_irq(domain, i, irq) { 315 if (i < 32) { 316 irq_set_percpu_devid(irq); 317 irq_set_chip_and_handler(irq, &gic_chip, 318 handle_percpu_devid_irq); 319 set_irq_flags(irq, IRQF_VALID | IRQF_NOAUTOEN); 320 } else { 321 irq_set_chip_and_handler(irq, &gic_chip, 322 handle_fasteoi_irq); 323 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE); 324 } 325 irq_set_chip_data(irq, gic); 326 } 327 328 writel_relaxed(1, base + GIC_DIST_CTRL); 329} 330 331static void __cpuinit gic_cpu_init(struct gic_chip_data *gic) 332{ 333 void __iomem *dist_base = gic->dist_base; 334 void __iomem *base = gic->cpu_base; 335 int i; 336 337 /* 338 * Deal with the banked PPI and SGI interrupts - disable all 339 * PPI interrupts, ensure all SGI interrupts are enabled. 340 */ 341 writel_relaxed(0xffff0000, dist_base + GIC_DIST_ENABLE_CLEAR); 342 writel_relaxed(0x0000ffff, dist_base + GIC_DIST_ENABLE_SET); 343 344 /* 345 * Set priority on PPI and SGI interrupts 346 */ 347 for (i = 0; i < 32; i += 4) 348 writel_relaxed(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4 / 4); 349 350 writel_relaxed(0xf0, base + GIC_CPU_PRIMASK); 351 writel_relaxed(1, base + GIC_CPU_CTRL); 352} 353 354#ifdef CONFIG_CPU_PM 355/* 356 * Saves the GIC distributor registers during suspend or idle. Must be called 357 * with interrupts disabled but before powering down the GIC. After calling 358 * this function, no interrupts will be delivered by the GIC, and another 359 * platform-specific wakeup source must be enabled. 360 */ 361static void gic_dist_save(unsigned int gic_nr) 362{ 363 unsigned int gic_irqs; 364 void __iomem *dist_base; 365 int i; 366 367 if (gic_nr >= MAX_GIC_NR) 368 BUG(); 369 370 gic_irqs = gic_data[gic_nr].gic_irqs; 371 dist_base = gic_data[gic_nr].dist_base; 372 373 if (!dist_base) 374 return; 375 376 for (i = 0; i < DIV_ROUND_UP(gic_irqs, 16); i++) 377 gic_data[gic_nr].saved_spi_conf[i] = 378 readl_relaxed(dist_base + GIC_DIST_CONFIG + i * 4); 379 380 for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++) 381 gic_data[gic_nr].saved_spi_target[i] = 382 readl_relaxed(dist_base + GIC_DIST_TARGET + i * 4); 383 384 for (i = 0; i < DIV_ROUND_UP(gic_irqs, 32); i++) 385 gic_data[gic_nr].saved_spi_enable[i] = 386 readl_relaxed(dist_base + GIC_DIST_ENABLE_SET + i * 4); 387} 388 389/* 390 * Restores the GIC distributor registers during resume or when coming out of 391 * idle. Must be called before enabling interrupts. If a level interrupt 392 * that occured while the GIC was suspended is still present, it will be 393 * handled normally, but any edge interrupts that occured will not be seen by 394 * the GIC and need to be handled by the platform-specific wakeup source. 395 */ 396static void gic_dist_restore(unsigned int gic_nr) 397{ 398 unsigned int gic_irqs; 399 unsigned int i; 400 void __iomem *dist_base; 401 402 if (gic_nr >= MAX_GIC_NR) 403 BUG(); 404 405 gic_irqs = gic_data[gic_nr].gic_irqs; 406 dist_base = gic_data[gic_nr].dist_base; 407 408 if (!dist_base) 409 return; 410 411 writel_relaxed(0, dist_base + GIC_DIST_CTRL); 412 413 for (i = 0; i < DIV_ROUND_UP(gic_irqs, 16); i++) 414 writel_relaxed(gic_data[gic_nr].saved_spi_conf[i], 415 dist_base + GIC_DIST_CONFIG + i * 4); 416 417 for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++) 418 writel_relaxed(0xa0a0a0a0, 419 dist_base + GIC_DIST_PRI + i * 4); 420 421 for (i = 0; i < DIV_ROUND_UP(gic_irqs, 4); i++) 422 writel_relaxed(gic_data[gic_nr].saved_spi_target[i], 423 dist_base + GIC_DIST_TARGET + i * 4); 424 425 for (i = 0; i < DIV_ROUND_UP(gic_irqs, 32); i++) 426 writel_relaxed(gic_data[gic_nr].saved_spi_enable[i], 427 dist_base + GIC_DIST_ENABLE_SET + i * 4); 428 429 writel_relaxed(1, dist_base + GIC_DIST_CTRL); 430} 431 432static void gic_cpu_save(unsigned int gic_nr) 433{ 434 int i; 435 u32 *ptr; 436 void __iomem *dist_base; 437 void __iomem *cpu_base; 438 439 if (gic_nr >= MAX_GIC_NR) 440 BUG(); 441 442 dist_base = gic_data[gic_nr].dist_base; 443 cpu_base = gic_data[gic_nr].cpu_base; 444 445 if (!dist_base || !cpu_base) 446 return; 447 448 ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_enable); 449 for (i = 0; i < DIV_ROUND_UP(32, 32); i++) 450 ptr[i] = readl_relaxed(dist_base + GIC_DIST_ENABLE_SET + i * 4); 451 452 ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_conf); 453 for (i = 0; i < DIV_ROUND_UP(32, 16); i++) 454 ptr[i] = readl_relaxed(dist_base + GIC_DIST_CONFIG + i * 4); 455 456} 457 458static void gic_cpu_restore(unsigned int gic_nr) 459{ 460 int i; 461 u32 *ptr; 462 void __iomem *dist_base; 463 void __iomem *cpu_base; 464 465 if (gic_nr >= MAX_GIC_NR) 466 BUG(); 467 468 dist_base = gic_data[gic_nr].dist_base; 469 cpu_base = gic_data[gic_nr].cpu_base; 470 471 if (!dist_base || !cpu_base) 472 return; 473 474 ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_enable); 475 for (i = 0; i < DIV_ROUND_UP(32, 32); i++) 476 writel_relaxed(ptr[i], dist_base + GIC_DIST_ENABLE_SET + i * 4); 477 478 ptr = __this_cpu_ptr(gic_data[gic_nr].saved_ppi_conf); 479 for (i = 0; i < DIV_ROUND_UP(32, 16); i++) 480 writel_relaxed(ptr[i], dist_base + GIC_DIST_CONFIG + i * 4); 481 482 for (i = 0; i < DIV_ROUND_UP(32, 4); i++) 483 writel_relaxed(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4); 484 485 writel_relaxed(0xf0, cpu_base + GIC_CPU_PRIMASK); 486 writel_relaxed(1, cpu_base + GIC_CPU_CTRL); 487} 488 489static int gic_notifier(struct notifier_block *self, unsigned long cmd, void *v) 490{ 491 int i; 492 493 for (i = 0; i < MAX_GIC_NR; i++) { 494 switch (cmd) { 495 case CPU_PM_ENTER: 496 gic_cpu_save(i); 497 break; 498 case CPU_PM_ENTER_FAILED: 499 case CPU_PM_EXIT: 500 gic_cpu_restore(i); 501 break; 502 case CPU_CLUSTER_PM_ENTER: 503 gic_dist_save(i); 504 break; 505 case CPU_CLUSTER_PM_ENTER_FAILED: 506 case CPU_CLUSTER_PM_EXIT: 507 gic_dist_restore(i); 508 break; 509 } 510 } 511 512 return NOTIFY_OK; 513} 514 515static struct notifier_block gic_notifier_block = { 516 .notifier_call = gic_notifier, 517}; 518 519static void __init gic_pm_init(struct gic_chip_data *gic) 520{ 521 gic->saved_ppi_enable = __alloc_percpu(DIV_ROUND_UP(32, 32) * 4, 522 sizeof(u32)); 523 BUG_ON(!gic->saved_ppi_enable); 524 525 gic->saved_ppi_conf = __alloc_percpu(DIV_ROUND_UP(32, 16) * 4, 526 sizeof(u32)); 527 BUG_ON(!gic->saved_ppi_conf); 528 529 if (gic == &gic_data[0]) 530 cpu_pm_register_notifier(&gic_notifier_block); 531} 532#else 533static void __init gic_pm_init(struct gic_chip_data *gic) 534{ 535} 536#endif 537 538#ifdef CONFIG_OF 539static int gic_irq_domain_dt_translate(struct irq_domain *d, 540 struct device_node *controller, 541 const u32 *intspec, unsigned int intsize, 542 unsigned long *out_hwirq, unsigned int *out_type) 543{ 544 if (d->of_node != controller) 545 return -EINVAL; 546 if (intsize < 3) 547 return -EINVAL; 548 549 /* Get the interrupt number and add 16 to skip over SGIs */ 550 *out_hwirq = intspec[1] + 16; 551 552 /* For SPIs, we need to add 16 more to get the GIC irq ID number */ 553 if (!intspec[0]) 554 *out_hwirq += 16; 555 556 *out_type = intspec[2] & IRQ_TYPE_SENSE_MASK; 557 return 0; 558} 559#endif 560 561const struct irq_domain_ops gic_irq_domain_ops = { 562#ifdef CONFIG_OF 563 .dt_translate = gic_irq_domain_dt_translate, 564#endif 565}; 566 567void __init gic_init(unsigned int gic_nr, int irq_start, 568 void __iomem *dist_base, void __iomem *cpu_base) 569{ 570 struct gic_chip_data *gic; 571 struct irq_domain *domain; 572 int gic_irqs; 573 574 BUG_ON(gic_nr >= MAX_GIC_NR); 575 576 gic = &gic_data[gic_nr]; 577 domain = &gic->domain; 578 gic->dist_base = dist_base; 579 gic->cpu_base = cpu_base; 580 581 /* 582 * For primary GICs, skip over SGIs. 583 * For secondary GICs, skip over PPIs, too. 584 */ 585 domain->hwirq_base = 32; 586 if (gic_nr == 0) { 587 gic_cpu_base_addr = cpu_base; 588 589 if ((irq_start & 31) > 0) { 590 domain->hwirq_base = 16; 591 if (irq_start != -1) 592 irq_start = (irq_start & ~31) + 16; 593 } 594 } 595 596 /* 597 * Find out how many interrupts are supported. 598 * The GIC only supports up to 1020 interrupt sources. 599 */ 600 gic_irqs = readl_relaxed(dist_base + GIC_DIST_CTR) & 0x1f; 601 gic_irqs = (gic_irqs + 1) * 32; 602 if (gic_irqs > 1020) 603 gic_irqs = 1020; 604 gic->gic_irqs = gic_irqs; 605 606 domain->nr_irq = gic_irqs - domain->hwirq_base; 607 domain->irq_base = irq_alloc_descs(irq_start, 16, domain->nr_irq, 608 numa_node_id()); 609 if (IS_ERR_VALUE(domain->irq_base)) { 610 WARN(1, "Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n", 611 irq_start); 612 domain->irq_base = irq_start; 613 } 614 domain->priv = gic; 615 domain->ops = &gic_irq_domain_ops; 616 irq_domain_add(domain); 617 618 gic_chip.flags |= gic_arch_extn.flags; 619 gic_dist_init(gic); 620 gic_cpu_init(gic); 621 gic_pm_init(gic); 622} 623 624void __cpuinit gic_secondary_init(unsigned int gic_nr) 625{ 626 BUG_ON(gic_nr >= MAX_GIC_NR); 627 628 gic_cpu_init(&gic_data[gic_nr]); 629} 630 631#ifdef CONFIG_SMP 632void gic_raise_softirq(const struct cpumask *mask, unsigned int irq) 633{ 634 int cpu; 635 unsigned long map = 0; 636 637 /* Convert our logical CPU mask into a physical one. */ 638 for_each_cpu(cpu, mask) 639 map |= 1 << cpu_logical_map(cpu); 640 641 /* 642 * Ensure that stores to Normal memory are visible to the 643 * other CPUs before issuing the IPI. 644 */ 645 dsb(); 646 647 /* this always happens on GIC0 */ 648 writel_relaxed(map << 16 | irq, gic_data[0].dist_base + GIC_DIST_SOFTINT); 649} 650#endif 651 652#ifdef CONFIG_OF 653static int gic_cnt __initdata = 0; 654 655int __init gic_of_init(struct device_node *node, struct device_node *parent) 656{ 657 void __iomem *cpu_base; 658 void __iomem *dist_base; 659 int irq; 660 struct irq_domain *domain = &gic_data[gic_cnt].domain; 661 662 if (WARN_ON(!node)) 663 return -ENODEV; 664 665 dist_base = of_iomap(node, 0); 666 WARN(!dist_base, "unable to map gic dist registers\n"); 667 668 cpu_base = of_iomap(node, 1); 669 WARN(!cpu_base, "unable to map gic cpu registers\n"); 670 671 domain->of_node = of_node_get(node); 672 673 gic_init(gic_cnt, -1, dist_base, cpu_base); 674 675 if (parent) { 676 irq = irq_of_parse_and_map(node, 0); 677 gic_cascade_irq(gic_cnt, irq); 678 } 679 gic_cnt++; 680 return 0; 681} 682#endif