Commit e3ff9114 authored by Linus Torvalds's avatar Linus Torvalds

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
parents de6e1317 3e0a07f8
...@@ -1087,6 +1087,20 @@ if !MMU ...@@ -1087,6 +1087,20 @@ if !MMU
source "arch/arm/Kconfig-nommu" source "arch/arm/Kconfig-nommu"
endif endif
config PJ4B_ERRATA_4742
bool "PJ4B Errata 4742: IDLE Wake Up Commands can Cause the CPU Core to Cease Operation"
depends on CPU_PJ4B && MACH_ARMADA_370
default y
help
When coming out of either a Wait for Interrupt (WFI) or a Wait for
Event (WFE) IDLE states, a specific timing sensitivity exists between
the retiring WFI/WFE instructions and the newly issued subsequent
instructions. This sensitivity can result in a CPU hang scenario.
Workaround:
The software must insert either a Data Synchronization Barrier (DSB)
or Data Memory Barrier (DMB) command immediately after the WFI/WFE
instruction
config ARM_ERRATA_326103 config ARM_ERRATA_326103
bool "ARM errata: FSR write bit incorrect on a SWP to read-only memory" bool "ARM errata: FSR write bit incorrect on a SWP to read-only memory"
depends on CPU_V6 depends on CPU_V6
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
#define MPIDR_HWID_BITMASK 0xFFFFFF #define MPIDR_HWID_BITMASK 0xFFFFFF
#define MPIDR_INVALID (~MPIDR_HWID_BITMASK)
#define MPIDR_LEVEL_BITS 8 #define MPIDR_LEVEL_BITS 8
#define MPIDR_LEVEL_MASK ((1 << MPIDR_LEVEL_BITS) - 1) #define MPIDR_LEVEL_MASK ((1 << MPIDR_LEVEL_BITS) - 1)
......
...@@ -230,6 +230,15 @@ ...@@ -230,6 +230,15 @@
# endif # endif
#endif #endif
#ifdef CONFIG_CPU_PJ4B
# ifdef CPU_NAME
# undef MULTI_CPU
# define MULTI_CPU
# else
# define CPU_NAME cpu_pj4b
# endif
#endif
#ifndef MULTI_CPU #ifndef MULTI_CPU
#define cpu_proc_init __glue(CPU_NAME,_proc_init) #define cpu_proc_init __glue(CPU_NAME,_proc_init)
#define cpu_proc_fin __glue(CPU_NAME,_proc_fin) #define cpu_proc_fin __glue(CPU_NAME,_proc_fin)
......
...@@ -49,7 +49,7 @@ static inline int cache_ops_need_broadcast(void) ...@@ -49,7 +49,7 @@ static inline int cache_ops_need_broadcast(void)
/* /*
* Logical CPU mapping. * Logical CPU mapping.
*/ */
extern int __cpu_logical_map[]; extern u32 __cpu_logical_map[];
#define cpu_logical_map(cpu) __cpu_logical_map[cpu] #define cpu_logical_map(cpu) __cpu_logical_map[cpu]
/* /*
* Retrieve logical cpu index corresponding to a given MPIDR[23:0] * Retrieve logical cpu index corresponding to a given MPIDR[23:0]
......
...@@ -82,7 +82,7 @@ void __init arm_dt_init_cpu_maps(void) ...@@ -82,7 +82,7 @@ void __init arm_dt_init_cpu_maps(void)
u32 i, j, cpuidx = 1; u32 i, j, cpuidx = 1;
u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0; u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0;
u32 tmp_map[NR_CPUS] = { [0 ... NR_CPUS-1] = UINT_MAX }; u32 tmp_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
bool bootcpu_valid = false; bool bootcpu_valid = false;
cpus = of_find_node_by_path("/cpus"); cpus = of_find_node_by_path("/cpus");
...@@ -92,6 +92,9 @@ void __init arm_dt_init_cpu_maps(void) ...@@ -92,6 +92,9 @@ void __init arm_dt_init_cpu_maps(void)
for_each_child_of_node(cpus, cpu) { for_each_child_of_node(cpus, cpu) {
u32 hwid; u32 hwid;
if (of_node_cmp(cpu->type, "cpu"))
continue;
pr_debug(" * %s...\n", cpu->full_name); pr_debug(" * %s...\n", cpu->full_name);
/* /*
* A device tree containing CPU nodes with missing "reg" * A device tree containing CPU nodes with missing "reg"
......
...@@ -444,7 +444,7 @@ void notrace cpu_init(void) ...@@ -444,7 +444,7 @@ void notrace cpu_init(void)
: "r14"); : "r14");
} }
int __cpu_logical_map[NR_CPUS]; u32 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
void __init smp_setup_processor_id(void) void __init smp_setup_processor_id(void)
{ {
......
...@@ -57,6 +57,12 @@ void flush_dcache_page(struct page *page) ...@@ -57,6 +57,12 @@ void flush_dcache_page(struct page *page)
} }
EXPORT_SYMBOL(flush_dcache_page); EXPORT_SYMBOL(flush_dcache_page);
void flush_kernel_dcache_page(struct page *page)
{
__cpuc_flush_dcache_area(page_address(page), PAGE_SIZE);
}
EXPORT_SYMBOL(flush_kernel_dcache_page);
void copy_to_user_page(struct vm_area_struct *vma, struct page *page, void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
unsigned long uaddr, void *dst, const void *src, unsigned long uaddr, void *dst, const void *src,
unsigned long len) unsigned long len)
......
...@@ -81,7 +81,6 @@ ENDPROC(cpu_fa526_reset) ...@@ -81,7 +81,6 @@ ENDPROC(cpu_fa526_reset)
*/ */
.align 4 .align 4
ENTRY(cpu_fa526_do_idle) ENTRY(cpu_fa526_do_idle)
mcr p15, 0, r0, c7, c0, 4 @ Wait for interrupt
mov pc, lr mov pc, lr
......
...@@ -333,3 +333,8 @@ ENTRY(\name\()_tlb_fns) ...@@ -333,3 +333,8 @@ ENTRY(\name\()_tlb_fns)
.endif .endif
.size \name\()_tlb_fns, . - \name\()_tlb_fns .size \name\()_tlb_fns, . - \name\()_tlb_fns
.endm .endm
.macro globl_equ x, y
.globl \x
.equ \x, \y
.endm
...@@ -138,6 +138,29 @@ ENTRY(cpu_v7_do_resume) ...@@ -138,6 +138,29 @@ ENTRY(cpu_v7_do_resume)
mov r0, r8 @ control register mov r0, r8 @ control register
b cpu_resume_mmu b cpu_resume_mmu
ENDPROC(cpu_v7_do_resume) ENDPROC(cpu_v7_do_resume)
#endif
#ifdef CONFIG_CPU_PJ4B
globl_equ cpu_pj4b_switch_mm, cpu_v7_switch_mm
globl_equ cpu_pj4b_set_pte_ext, cpu_v7_set_pte_ext
globl_equ cpu_pj4b_proc_init, cpu_v7_proc_init
globl_equ cpu_pj4b_proc_fin, cpu_v7_proc_fin
globl_equ cpu_pj4b_reset, cpu_v7_reset
#ifdef CONFIG_PJ4B_ERRATA_4742
ENTRY(cpu_pj4b_do_idle)
dsb @ WFI may enter a low-power mode
wfi
dsb @barrier
mov pc, lr
ENDPROC(cpu_pj4b_do_idle)
#else
globl_equ cpu_pj4b_do_idle, cpu_v7_do_idle
#endif
globl_equ cpu_pj4b_dcache_clean_area, cpu_v7_dcache_clean_area
globl_equ cpu_pj4b_do_suspend, cpu_v7_do_suspend
globl_equ cpu_pj4b_do_resume, cpu_v7_do_resume
globl_equ cpu_pj4b_suspend_size, cpu_v7_suspend_size
#endif #endif
__CPUINIT __CPUINIT
...@@ -350,6 +373,9 @@ __v7_setup_stack: ...@@ -350,6 +373,9 @@ __v7_setup_stack:
@ define struct processor (see <asm/proc-fns.h> and proc-macros.S) @ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1 define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
#ifdef CONFIG_CPU_PJ4B
define_processor_functions pj4b, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
#endif
.section ".rodata" .section ".rodata"
...@@ -362,7 +388,7 @@ __v7_setup_stack: ...@@ -362,7 +388,7 @@ __v7_setup_stack:
/* /*
* Standard v7 proc info content * Standard v7 proc info content
*/ */
.macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0 .macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0, proc_fns = v7_processor_functions
ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags) PMD_SECT_AF | PMD_FLAGS_SMP | \mm_mmuflags)
ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \ ALT_UP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
...@@ -375,7 +401,7 @@ __v7_setup_stack: ...@@ -375,7 +401,7 @@ __v7_setup_stack:
.long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \ .long HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \
HWCAP_EDSP | HWCAP_TLS | \hwcaps HWCAP_EDSP | HWCAP_TLS | \hwcaps
.long cpu_v7_name .long cpu_v7_name
.long v7_processor_functions .long \proc_fns
.long v7wbi_tlb_fns .long v7wbi_tlb_fns
.long v6_user_fns .long v6_user_fns
.long v7_cache_fns .long v7_cache_fns
...@@ -407,12 +433,14 @@ __v7_ca9mp_proc_info: ...@@ -407,12 +433,14 @@ __v7_ca9mp_proc_info:
/* /*
* Marvell PJ4B processor. * Marvell PJ4B processor.
*/ */
#ifdef CONFIG_CPU_PJ4B
.type __v7_pj4b_proc_info, #object .type __v7_pj4b_proc_info, #object
__v7_pj4b_proc_info: __v7_pj4b_proc_info:
.long 0x560f5800 .long 0x560f5800
.long 0xff0fff00 .long 0xff0fff00
__v7_proc __v7_pj4b_setup __v7_proc __v7_pj4b_setup, proc_fns = pj4b_processor_functions
.size __v7_pj4b_proc_info, . - __v7_pj4b_proc_info .size __v7_pj4b_proc_info, . - __v7_pj4b_proc_info
#endif
/* /*
* ARM Ltd. Cortex A7 processor. * ARM Ltd. Cortex A7 processor.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment