Skip to content

Commit 3992313

Browse files
committed
Merge branch 'fixes' of git://git.linaro.org/people/rmk/linux-arm
Pull ARM fixes from Russell King: "I was going to hold these off until v3.8 was out, and send them with a stable tag, but as everyone else is pushing much bigger fixes which Linus is accepting, let's save people from the hastle of having to patch v3.8 back into working or use a stable kernel. Looking at the diffstat, this really is high value for its size; this is miniscule compared to how the -rc6 to tip diffstat currently looks. So, four patches in this set: - Punit Agrawal reports that the kernel no longer boots on MPCore due to a new assumption made in the GIC code which isn't true of earlier GIC designs. This is the biggest change in this set. - Punit's boot log also revealed a bunch of WARN_ON() dumps caused by the DT-ification of the GIC support without fixing up non-DT Realview - which now sees a greater number of interrupts than it did before. - A fix for the DMA coherent code from Marek which uses the wrong check for atomic allocations; this can result in spinlock lockups or other nasty effects. - A fix from Will, which will affect all Android based platforms if not applied (which use the 2G:2G VM split) - this causes particularly 'make' to misbehave unless this bug is fixed." * 'fixes' of git://git.linaro.org/people/rmk/linux-arm: ARM: 7641/1: memory: fix broken mmap by ensuring TASK_UNMAPPED_BASE is aligned ARM: DMA mapping: fix bad atomic test ARM: realview: ensure that we have sufficient IRQs available ARM: GIC: fix GIC cpumask initialization
2 parents e06b840 + 79d1f5c commit 3992313

File tree

4 files changed

+26
-5
lines changed

4 files changed

+26
-5
lines changed

arch/arm/common/gic.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,25 @@ void __init gic_cascade_irq(unsigned int gic_nr, unsigned int irq)
351351
irq_set_chained_handler(irq, gic_handle_cascade_irq);
352352
}
353353

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+
354373
static void __init gic_dist_init(struct gic_chip_data *gic)
355374
{
356375
unsigned int i;
@@ -369,7 +388,9 @@ static void __init gic_dist_init(struct gic_chip_data *gic)
369388
/*
370389
* Set all global interrupts to this CPU only.
371390
*/
372-
cpumask = readl_relaxed(base + GIC_DIST_TARGET + 0);
391+
cpumask = gic_get_cpumask(gic);
392+
cpumask |= cpumask << 8;
393+
cpumask |= cpumask << 16;
373394
for (i = 32; i < gic_irqs; i += 4)
374395
writel_relaxed(cpumask, base + GIC_DIST_TARGET + i * 4 / 4);
375396

@@ -400,7 +421,7 @@ static void __cpuinit gic_cpu_init(struct gic_chip_data *gic)
400421
* Get what the GIC says our CPU mask is.
401422
*/
402423
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);
404425
gic_cpu_map[cpu] = cpu_mask;
405426

406427
/*

arch/arm/include/asm/memory.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
*/
3838
#define PAGE_OFFSET UL(CONFIG_PAGE_OFFSET)
3939
#define TASK_SIZE (UL(CONFIG_PAGE_OFFSET) - UL(0x01000000))
40-
#define TASK_UNMAPPED_BASE (UL(CONFIG_PAGE_OFFSET) / 3)
40+
#define TASK_UNMAPPED_BASE ALIGN(TASK_SIZE / 3, SZ_16M)
4141

4242
/*
4343
* The maximum size of a 26-bit user space task.

arch/arm/mach-realview/include/mach/irqs-eb.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@
115115
/*
116116
* Only define NR_IRQS if less than NR_IRQS_EB
117117
*/
118-
#define NR_IRQS_EB (IRQ_EB_GIC_START + 96)
118+
#define NR_IRQS_EB (IRQ_EB_GIC_START + 128)
119119

120120
#if defined(CONFIG_MACH_REALVIEW_EB) \
121121
&& (!defined(NR_IRQS) || (NR_IRQS < NR_IRQS_EB))

arch/arm/mm/dma-mapping.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,7 @@ static void *__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle,
640640

641641
if (is_coherent || nommu())
642642
addr = __alloc_simple_buffer(dev, size, gfp, &page);
643-
else if (gfp & GFP_ATOMIC)
643+
else if (!(gfp & __GFP_WAIT))
644644
addr = __alloc_from_pool(size, &page);
645645
else if (!IS_ENABLED(CONFIG_CMA))
646646
addr = __alloc_remap_buffer(dev, size, gfp, prot, &page, caller);

0 commit comments

Comments
 (0)