Skip to content

Commit 94559a4

Browse files
committed
Merge branch 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm
Pull ARM fixes from Russell King: "Various assorted fixes: - a couple of patches from Mark Rutland to resolve an errata with Cortex-A15 CPUs. - fix cpuidle for the CPU part ID changes in the last merge window - add support for a relocation which ARM binutils is generating in some circumstances" * 'fixes' of git://ftp.arm.linux.org.uk/~rmk/linux-arm: ARM: 8130/1: cpuidle/cpuidle-big_little: fix reading cpu id part number ARM: 8129/1: errata: work around Cortex-A15 erratum 830321 using dummy strex ARM: 8128/1: abort: don't clear the exclusive monitors ARM: 8127/1: module: add support for R_ARM_TARGET1 relocations
2 parents 19ed3eb + eba1c71 commit 94559a4

File tree

10 files changed

+37
-39
lines changed

10 files changed

+37
-39
lines changed

arch/arm/include/asm/cacheflush.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,6 @@ static inline void __sync_cache_range_r(volatile void *p, size_t size)
472472
"mcr p15, 0, r0, c1, c0, 0 @ set SCTLR \n\t" \
473473
"isb \n\t" \
474474
"bl v7_flush_dcache_"__stringify(level)" \n\t" \
475-
"clrex \n\t" \
476475
"mrc p15, 0, r0, c1, c0, 1 @ get ACTLR \n\t" \
477476
"bic r0, r0, #(1 << 6) @ disable local coherency \n\t" \
478477
"mcr p15, 0, r0, c1, c0, 1 @ set ACTLR \n\t" \

arch/arm/include/asm/cputype.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
#define ARM_CPU_PART_CORTEX_A12 0x4100c0d0
7575
#define ARM_CPU_PART_CORTEX_A17 0x4100c0e0
7676
#define ARM_CPU_PART_CORTEX_A15 0x4100c0f0
77+
#define ARM_CPU_PART_MASK 0xff00fff0
7778

7879
#define ARM_CPU_XSCALE_ARCH_MASK 0xe000
7980
#define ARM_CPU_XSCALE_ARCH_V1 0x2000
@@ -179,7 +180,7 @@ static inline unsigned int __attribute_const__ read_cpuid_implementor(void)
179180
*/
180181
static inline unsigned int __attribute_const__ read_cpuid_part(void)
181182
{
182-
return read_cpuid_id() & 0xff00fff0;
183+
return read_cpuid_id() & ARM_CPU_PART_MASK;
183184
}
184185

185186
static inline unsigned int __attribute_const__ __deprecated read_cpuid_part_number(void)

arch/arm/include/asm/elf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ typedef struct user_fp elf_fpregset_t;
5050
#define R_ARM_ABS32 2
5151
#define R_ARM_CALL 28
5252
#define R_ARM_JUMP24 29
53+
#define R_ARM_TARGET1 38
5354
#define R_ARM_V4BX 40
5455
#define R_ARM_PREL31 42
5556
#define R_ARM_MOVW_ABS_NC 43

arch/arm/include/asm/smp_plat.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <linux/cpumask.h>
99
#include <linux/err.h>
1010

11+
#include <asm/cpu.h>
1112
#include <asm/cputype.h>
1213

1314
/*
@@ -25,6 +26,20 @@ static inline bool is_smp(void)
2526
#endif
2627
}
2728

29+
/**
30+
* smp_cpuid_part() - return part id for a given cpu
31+
* @cpu: logical cpu id.
32+
*
33+
* Return: part id of logical cpu passed as argument.
34+
*/
35+
static inline unsigned int smp_cpuid_part(int cpu)
36+
{
37+
struct cpuinfo_arm *cpu_info = &per_cpu(cpu_data, cpu);
38+
39+
return is_smp() ? cpu_info->cpuid & ARM_CPU_PART_MASK :
40+
read_cpuid_part();
41+
}
42+
2843
/* all SMP configurations have the extended CPUID registers */
2944
#ifndef CONFIG_MMU
3045
#define tlb_ops_need_broadcast() 0

arch/arm/kernel/entry-header.S

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -208,26 +208,21 @@
208208
#endif
209209
.endif
210210
msr spsr_cxsf, \rpsr
211-
#if defined(CONFIG_CPU_V6)
212-
ldr r0, [sp]
213-
strex r1, r2, [sp] @ clear the exclusive monitor
214-
ldmib sp, {r1 - pc}^ @ load r1 - pc, cpsr
215-
#elif defined(CONFIG_CPU_32v6K)
216-
clrex @ clear the exclusive monitor
217-
ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr
218-
#else
219-
ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr
211+
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K)
212+
@ We must avoid clrex due to Cortex-A15 erratum #830321
213+
sub r0, sp, #4 @ uninhabited address
214+
strex r1, r2, [r0] @ clear the exclusive monitor
220215
#endif
216+
ldmia sp, {r0 - pc}^ @ load r0 - pc, cpsr
221217
.endm
222218

223219
.macro restore_user_regs, fast = 0, offset = 0
224220
ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr
225221
ldr lr, [sp, #\offset + S_PC]! @ get pc
226222
msr spsr_cxsf, r1 @ save in spsr_svc
227-
#if defined(CONFIG_CPU_V6)
223+
#if defined(CONFIG_CPU_V6) || defined(CONFIG_CPU_32v6K)
224+
@ We must avoid clrex due to Cortex-A15 erratum #830321
228225
strex r1, r2, [sp] @ clear the exclusive monitor
229-
#elif defined(CONFIG_CPU_32v6K)
230-
clrex @ clear the exclusive monitor
231226
#endif
232227
.if \fast
233228
ldmdb sp, {r1 - lr}^ @ get calling r1 - lr
@@ -261,7 +256,10 @@
261256
.endif
262257
ldr lr, [sp, #S_SP] @ top of the stack
263258
ldrd r0, r1, [sp, #S_LR] @ calling lr and pc
264-
clrex @ clear the exclusive monitor
259+
260+
@ We must avoid clrex due to Cortex-A15 erratum #830321
261+
strex r2, r1, [sp, #S_LR] @ clear the exclusive monitor
262+
265263
stmdb lr!, {r0, r1, \rpsr} @ calling lr and rfe context
266264
ldmia sp, {r0 - r12}
267265
mov sp, lr
@@ -282,13 +280,16 @@
282280
.endm
283281
#else /* ifdef CONFIG_CPU_V7M */
284282
.macro restore_user_regs, fast = 0, offset = 0
285-
clrex @ clear the exclusive monitor
286283
mov r2, sp
287284
load_user_sp_lr r2, r3, \offset + S_SP @ calling sp, lr
288285
ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr
289286
ldr lr, [sp, #\offset + S_PC] @ get pc
290287
add sp, sp, #\offset + S_SP
291288
msr spsr_cxsf, r1 @ save in spsr_svc
289+
290+
@ We must avoid clrex due to Cortex-A15 erratum #830321
291+
strex r1, r2, [sp] @ clear the exclusive monitor
292+
292293
.if \fast
293294
ldmdb sp, {r1 - r12} @ get calling r1 - r12
294295
.else

arch/arm/kernel/module.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
9191
break;
9292

9393
case R_ARM_ABS32:
94+
case R_ARM_TARGET1:
9495
*(u32 *)loc += sym->st_value;
9596
break;
9697

arch/arm/mach-exynos/mcpm-exynos.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
"mcr p15, 0, r0, c1, c0, 0 @ set SCTLR\n\t" \
4444
"isb\n\t"\
4545
"bl v7_flush_dcache_"__stringify(level)"\n\t" \
46-
"clrex\n\t"\
4746
"mrc p15, 0, r0, c1, c0, 1 @ get ACTLR\n\t" \
4847
"bic r0, r0, #(1 << 6) @ disable local coherency\n\t" \
4948
/* Dummy Load of a device register to avoid Erratum 799270 */ \

arch/arm/mm/abort-ev6.S

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,6 @@
1717
*/
1818
.align 5
1919
ENTRY(v6_early_abort)
20-
#ifdef CONFIG_CPU_V6
21-
sub r1, sp, #4 @ Get unused stack location
22-
strex r0, r1, [r1] @ Clear the exclusive monitor
23-
#elif defined(CONFIG_CPU_32v6K)
24-
clrex
25-
#endif
2620
mrc p15, 0, r1, c5, c0, 0 @ get FSR
2721
mrc p15, 0, r0, c6, c0, 0 @ get FAR
2822
/*

arch/arm/mm/abort-ev7.S

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,6 @@
1313
*/
1414
.align 5
1515
ENTRY(v7_early_abort)
16-
/*
17-
* The effect of data aborts on on the exclusive access monitor are
18-
* UNPREDICTABLE. Do a CLREX to clear the state
19-
*/
20-
clrex
21-
2216
mrc p15, 0, r1, c5, c0, 0 @ get FSR
2317
mrc p15, 0, r0, c6, c0, 0 @ get FAR
2418

drivers/cpuidle/cpuidle-big_little.c

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -138,25 +138,18 @@ static int bl_enter_powerdown(struct cpuidle_device *dev,
138138
return idx;
139139
}
140140

141-
static int __init bl_idle_driver_init(struct cpuidle_driver *drv, int cpu_id)
141+
static int __init bl_idle_driver_init(struct cpuidle_driver *drv, int part_id)
142142
{
143-
struct cpuinfo_arm *cpu_info;
144143
struct cpumask *cpumask;
145-
unsigned long cpuid;
146144
int cpu;
147145

148146
cpumask = kzalloc(cpumask_size(), GFP_KERNEL);
149147
if (!cpumask)
150148
return -ENOMEM;
151149

152-
for_each_possible_cpu(cpu) {
153-
cpu_info = &per_cpu(cpu_data, cpu);
154-
cpuid = is_smp() ? cpu_info->cpuid : read_cpuid_id();
155-
156-
/* read cpu id part number */
157-
if ((cpuid & 0xFFF0) == cpu_id)
150+
for_each_possible_cpu(cpu)
151+
if (smp_cpuid_part(cpu) == part_id)
158152
cpumask_set_cpu(cpu, cpumask);
159-
}
160153

161154
drv->cpumask = cpumask;
162155

0 commit comments

Comments
 (0)