diff options
| -rw-r--r-- | arch/arm/common/gic.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index 36ae03a3f5d1..87dfa9026c5b 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c | |||
| @@ -351,6 +351,25 @@ void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq) | |||
| 351 | irq_set_chained_handler(irq, gic_handle_cascade_irq); | 351 | irq_set_chained_handler(irq, gic_handle_cascade_irq); |
| 352 | } | 352 | } |
| 353 | 353 | ||
| 354 | static u8 gic_get_cpumask(struct gic_chip_data *gic) | ||
| 355 | { | ||
| 356 | void __iomem *base = gic_data_dist_base(gic); | ||
| 357 | u32 mask, i; | ||
| 358 | |||
| 359 | for (i = mask = 0; i < 32; i += 4) { | ||
| 360 | mask = readl_relaxed(base + GIC_DIST_TARGET + i); | ||
| 361 | mask |= mask >> 16; | ||
| 362 | mask |= mask >> 8; | ||
| 363 | if (mask) | ||
| 364 | break; | ||
| 365 | } | ||
| 366 | |||
| 367 | if (!mask) | ||
| 368 | pr_crit("GIC CPU mask not found - kernel will fail to boot.\n"); | ||
| 369 | |||
| 370 | return mask; | ||
| 371 | } | ||
| 372 | |||
| 354 | static void __init gic_dist_init(struct gic_chip_data *gic) | 373 | static void __init gic_dist_init(struct gic_chip_data *gic) |
| 355 | { | 374 | { |
| 356 | unsigned int i; | 375 | unsigned int i; |
| @@ -369,7 +388,9 @@ static void __init gic_dist_init(struct gic_chip_data *gic) | |||
| 369 | /* | 388 | /* |
| 370 | * Set all global interrupts to this CPU only. | 389 | * Set all global interrupts to this CPU only. |
| 371 | */ | 390 | */ |
| 372 | cpumask = readl_relaxed(base + GIC_DIST_TARGET + 0); | 391 | cpumask = gic_get_cpumask(gic); |
| 392 | cpumask |= cpumask << 8; | ||
| 393 | cpumask |= cpumask << 16; | ||
| 373 | for (i = 32; i < gic_irqs; i += 4) | 394 | for (i = 32; i < gic_irqs; i += 4) |
| 374 | writel_relaxed(cpumask, base + GIC_DIST_TARGET + i * 4 / 4); | 395 | writel_relaxed(cpumask, base + GIC_DIST_TARGET + i * 4 / 4); |
| 375 | 396 | ||
| @@ -400,7 +421,7 @@ static void __cpuinit gic_cpu_init(struct gic_chip_data *gic) | |||
| 400 | * Get what the GIC says our CPU mask is. | 421 | * Get what the GIC says our CPU mask is. |
| 401 | */ | 422 | */ |
| 402 | BUG_ON(cpu >= NR_GIC_CPU_IF); | 423 | BUG_ON(cpu >= NR_GIC_CPU_IF); |
| 403 | cpu_mask = readl_relaxed(dist_base + GIC_DIST_TARGET + 0); | 424 | cpu_mask = gic_get_cpumask(gic); |
| 404 | gic_cpu_map[cpu] = cpu_mask; | 425 | gic_cpu_map[cpu] = cpu_mask; |
| 405 | 426 | ||
| 406 | /* | 427 | /* |
