8000 Merge branch 'fixes' of git://git.linaro.org/people/rmk/linux-arm · codeguru85/linux@e3ff911 · GitHub
[go: up one dir, main page]

Skip to content

Commit e3ff911

Browse files
committed
Merge branch 'fixes' of git://git.linaro.org/people/rmk/linux-arm
Pull ARM fixes from Russell King: "Another round of ARM fixes. Largest one is the second half of the PJ4B fix which was pushed in the previous -rc - this one was delayed because its original caused a build regression while trying to fix a regression! As ever, noMMU gets forgotten when fixing problems on MMU, so we have a noMMU fix for a previous fix included in this set. A couple of fixes from Lorenzo for problems with the ARM DT CPU code, and a one liner to remove the buggy 'wait for interrupt' with FA526 cores" * 'fixes' of git://git.linaro.org/people/rmk/linux-arm: ARM: 7773/1: PJ4B: Add support for errata 4742 ARM: 7772/1: Fix missing flush_kernel_dcache_page() for noMMU ARM: 7763/1: kernel: fix __cpu_logical_map default initialization ARM: 7762/1: kernel: fix arm_dt_init_cpu_maps() to skip non-cpu nodes ARM: 7760/1: cpu_fa526_do_idle: remove WFI
2 parents de6e131 + 3e0a07f commit e3ff911

File tree

10 files changed

+73
-7
lines changed

10 files changed

+73
-7
lines changed

arch/arm/Kconfig

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,6 +1087,20 @@ if !MMU
10871087
source "arch/arm/Kconfig-nommu"
10881088
endif
10891089

1090+
config PJ4B_ERRATA_4742
1091+
bool "PJ4B Errata 4742: IDLE Wake Up Commands can Cause the CPU Core to Cease Operation"
1092+
depends on CPU_PJ4B && MACH_ARMADA_370
1093+
default y
1094+
help
1095+
When coming out of either a Wait for Interrupt (WFI) or a Wait for
1096+
Event (WFE) IDLE states, a specific timing sensitivity exists between
1097+
the retiring WFI/WFE instructions and the newly issued subsequent
1098+
instructions. This sensitivity can result in a CPU hang scenario.
1099+
Workaround:
1100+
The software must insert either a Data Synchronization Barrier (DSB)
1101+
or Data Memory Barrier (DMB) command immediately after the WFI/WFE
1102+
instruction
1103+
10901104
config ARM_ERRATA_326103
10911105
bool "ARM errata: FSR write bit incorrect on a SWP to read-only memory"
10921106
depends on CPU_V6

arch/arm/include/asm/cputype.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@
3232

3333
#define MPIDR_HWID_BITMASK 0xFFFFFF
3434

35+
#define MPIDR_INVALID (~MPIDR_HWID_BITMASK)
36+
3537
#define MPIDR_LEVEL_BITS 8
3638
#define MPIDR_LEVEL_MASK ((1 << MPIDR_LEVEL_BITS) - 1)
3739

arch/arm/include/asm/glue-proc.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,15 @@
230230
# endif
231231
#endif
232232

233+
#ifdef CONFIG_CPU_PJ4B
234+
# ifdef CPU_NAME
235+
# undef MULTI_CPU
236+
# define MULTI_CPU
237+
# else
238+
# define CPU_NAME cpu_pj4b
239+
# endif
240+
#endif
241+
233242
#ifndef MULTI_CPU
234243
#define cpu_proc_init __glue(CPU_NAME,_proc_init)
235244
#define cpu_proc_fin __glue(CPU_NAME,_proc_fin)

arch/arm/include/asm/smp_plat.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ static inline int cache_ops_need_broadcast(void)
4949
/*
5050
* Logical CPU mapping.
5151
*/
52-
extern int __cpu_logical_map[];
52+
extern u32 __cpu_logical_map[];
5353
#define cpu_logical_map(cpu) __cpu_logical_map[cpu]
5454
/*
5555
* Retrieve logical cpu index corresponding to a given MPIDR[23:0]

arch/arm/kernel/devtree.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ void __init arm_dt_init_cpu_maps(void)
8282
u32 i, j, cpuidx = 1;
8383
u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0;
8484

85-
u32 tmp_map[NR_CPUS] = { [0 ... NR_CPUS-1] = UINT_MAX };
85+
u32 tmp_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
8686
bool bootcpu_valid = false;
8787
cpus = of_find_node_by_path("/cpus");
8888

@@ -92,6 +92,9 @@ void __init arm_dt_init_cpu_maps(void)
9292
for_each_child_of_node(cpus, cpu) {
9393
u32 hwid;
9494

95+
if (of_node_cmp(cpu->type, "cpu"))
96+
continue;
97+
9598
pr_debug(" * %s...\n", cpu->full_name);
9699
/*
97100
* A device tree containing CPU nodes with missing "reg"

arch/arm/kernel/setup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ void notrace cpu_init(void)
444444
: "r14");
445445
}
446446

447-
int __cpu_logical_map[NR_CPUS];
447+
u32 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
448448

449449
void __init smp_setup_processor_id(void)
450450
{

arch/arm/mm/nommu.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ void flush_dcache_page(struct page *page)
5757
}
5858
EXPORT_SYMBOL(flush_dcache_page);
5959

60+
void flush_kernel_dcache_page(struct page *page)
61+
{
62+
__cpuc_flush_dcache_area(page_address(page), PAGE_SIZE);
63+
}
64+
EXPORT_SYMBOL(flush_kernel_dcache_page);
65+
6066
void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
6167
unsigned long uaddr, void *dst, const void *src,
6268
unsigned long len)

arch/arm/mm/proc-fa526.S

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ ENDPROC(cpu_fa526_reset)
8181
*/
8282
.align 4
8383
ENTRY(cpu_fa526_do_idle)
84-
mcr p15, 0, r0, c7, c0, 4 @ Wait for interrupt
8584
mov pc, lr
8685

8786

arch/arm/mm/proc-macros.S

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,3 +333,8 @@ ENTRY(\name\()_tlb_fns)
333333
.endif
334334
.size \name\()_tlb_fns, . - \name\()_tlb_fns
335335
.endm
336+
337+
.macro globl_equ x, y
338+
.globl \x
339+
.equ \x, \y
340+
.endm

arch/arm/mm/proc-v7.S

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,29 @@ ENTRY(cpu_v7_do_resume)
138138
mov r0, r8 @ control register
139139
b cpu_resume_mmu
140140
ENDPROC(cpu_v7_do_resume)
141+
#endif
142+
143+
#ifdef CONFIG_CPU_PJ4B
144+
globl_equ cpu_pj4b_switch_mm, cpu_v7_switch_mm
145+
globl_equ cpu_pj4b_set_pte_ext, cpu_v7_set_pte_ext
146+
globl_equ cpu_pj4b_proc_init, cpu_v7_proc_init
147+
globl_equ cpu_pj4b_proc_fin, cpu_v7_proc_fin
148+
globl_equ cpu_pj4b_reset, cpu_v7_reset
149+
#ifdef CONFIG_PJ4B_ERRATA_4742
150+
ENTRY(cpu_pj4b_do_idle)
151+
dsb @ WFI may enter a low-power mode
152+
wfi
153+
dsb @barrier
154+
mov pc, lr
155+
ENDPROC(cpu_pj4b_do_idle)
156+
#else
157+
globl_equ cpu_pj4b_do_idle, cpu_v7_do_idle
158+
#endif
159+
globl_equ cpu_pj4b_dcache_clean_area, cpu_v7_dcache_clean_area
160+
globl_equ cpu_pj4b_do_suspend, cpu_v7_do_suspend
161+
globl_equ cpu_pj4b_do_resume, cpu_v7_do_resume
162+
globl_equ cpu_pj4b_suspend_size, cpu_v7_suspend_size
163+
141164
#endif
142165

143166
__CPUINIT
@@ -350,6 +373,9 @@ __v7_setup_stack:
350373

351374
@ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
352375
define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
376+
#ifdef CONFIG_CPU_PJ4B
377+
define_processor_functions pj4b, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
378+
#endif
353379

354380
.section ".rodata"
355381

@@ -362,7 +388,7 @@ __v7_setup_stack:
362388
/*
363389
* Standard v7 proc info content
364390
*/
365-
.macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0
391+
.macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0, proc_fns = v7_processor_functions
366392
ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
367393
PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags)
368394
ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
@@ -375,7 +401,7 @@ __v7_setup_stack:
375401
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \
376402
HWCAP_EDSP | HWCAP_TLS | \hwcaps
377403
.long cpu_v7_name
378-
.long v7_processor_functions
404+
.long \proc_fns
379405
.long v7wbi_tlb_fns
380406
.long v6_user_fns
381407
.long v7_cache_fns
@@ -407,12 +433,14 @@ __v7_ca9mp_proc_info:
407433
/*
408434
* Marvell PJ4B processor.
409435
*/
436+
#ifdef CONFIG_CPU_PJ4B
410437
.type __v7_pj4b_proc_info, #object
411438
__v7_pj4b_proc_info:
412439
.long 0x560f5800
413440
.long 0xff0fff00
414-
__v7_proc __v7_pj4b_setup
441+
__v7_proc __v7_pj4b_setup, proc_fns = pj4b_processor_functions
415442
.size __v7_pj4b_proc_info, . - __v7_pj4b_proc_info
443+
#endif
416444

417445
/*
418446
* ARM Ltd. Cortex A7 processor.

0 commit comments

Comments
 (0)
0