Commit 0be28863 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm

Pull ARM updates from Russell King:

 - An improvement from Ard Biesheuvel, who noted that the identity map
   setup was taking a long time due to flush_cache_louis().

 - Update a comment about dma_ops from Wolfram Sang.

 - Remove use of "-p" with ld, where this flag has been a no-op since
   2004.

 - Remove the printing of the virtual memory layout, which is no longer
   useful since we hide pointers.

 - Correct SCU help text.

 - Remove legacy TWD registration method.

 - Add pgprot_device() implementation for mapping PCI sysfs resource
   files.

 - Initialise PFN limits earlier for kmemleak.

 - Fix argument count to match macro definition (affects clang builds)

 - Use unified assembler language almost everywhere for clang, and other
   clang improvements (from Stefan Agner, Nathan Chancellor).

 - Support security extension for noMMU and other noMMU cleanups (from
   Vladimir Murzin).

 - Remove unnecessary SMP bringup code (which was incorrectly copy'n'
   pasted from the ARM platform implementations) and remove it from the
   arch code to discourge further copys of it appearing.

 - Add Cortex A9 erratum preventing kexec working on some SoCs.

 - AMBA bus identification updates from Mike Leach.

 - More use of raw spinlocks to avoid -RT kernel issues (from Yang Shi
   and Sebastian Andrzej Siewior).

 - MCPM hyp/svc mode mismatch fixes from Marek Szyprowski.

* tag 'for-linus' of git://git.armlinux.org.uk/~rmk/linux-arm: (32 commits)
  ARM: 8849/1: NOMMU: Fix encodings for PMSAv8's PRBAR4/PRLAR4
  ARM: 8848/1: virt: Align GIC version check with arm64 counterpart
  ARM: 8847/1: pm: fix HYP/SVC mode mismatch when MCPM is used
  ARM: 8845/1: use unified assembler in c files
  ARM: 8844/1: use unified assembler in assembly files
  ARM: 8843/1: use unified assembler in headers
  ARM: 8841/1: use unified assembler in macros
  ARM: 8840/1: use a raw_spinlock_t in unwind
  ARM: 8839/1: kprobe: make patch_lock a raw_spinlock_t
  ARM: 8837/1: coresight: etmv4: Update ID register table to add UCI support
  ARM: 8836/1: drivers: amba: Update component matching to use the CoreSight UCI values.
  ARM: 8838/1: drivers: amba: Updates to component identification for driver matching.
  ARM: 8833/1: Ensure that NEON code always compiles with Clang
  ARM: avoid Cortex-A9 livelock on tight dmb loops
  ARM: smp: remove arch-provided "pen_release"
  ARM: actions: remove boot_lock and pen_release
  ARM: oxnas: remove CPU hotplug implementation
  ARM: qcom: remove unnecessary boot_lock
  ARM: 8832/1: NOMMU: Limit visibility for CONFIG_FLASH_{MEM_BASE,SIZE}
  ARM: 8831/1: NOMMU: pmsa-v8: remove unneeded semicolon
  ...
parents e8a71a38 4c2741ac
...@@ -6,7 +6,7 @@ TL;DR summary ...@@ -6,7 +6,7 @@ TL;DR summary
* Use only NEON instructions, or VFP instructions that don't rely on support * Use only NEON instructions, or VFP instructions that don't rely on support
code code
* Isolate your NEON code in a separate compilation unit, and compile it with * Isolate your NEON code in a separate compilation unit, and compile it with
'-mfpu=neon -mfloat-abi=softfp' '-march=armv7-a -mfpu=neon -mfloat-abi=softfp'
* Put kernel_neon_begin() and kernel_neon_end() calls around the calls into your * Put kernel_neon_begin() and kernel_neon_end() calls around the calls into your
NEON code NEON code
* Don't sleep in your NEON code, and be aware that it will be executed with * Don't sleep in your NEON code, and be aware that it will be executed with
...@@ -87,7 +87,7 @@ instructions appearing in unexpected places if no special care is taken. ...@@ -87,7 +87,7 @@ instructions appearing in unexpected places if no special care is taken.
Therefore, the recommended and only supported way of using NEON/VFP in the Therefore, the recommended and only supported way of using NEON/VFP in the
kernel is by adhering to the following rules: kernel is by adhering to the following rules:
* isolate the NEON code in a separate compilation unit and compile it with * isolate the NEON code in a separate compilation unit and compile it with
'-mfpu=neon -mfloat-abi=softfp'; '-march=armv7-a -mfpu=neon -mfloat-abi=softfp';
* issue the calls to kernel_neon_begin(), kernel_neon_end() as well as the calls * issue the calls to kernel_neon_begin(), kernel_neon_end() as well as the calls
into the unit containing the NEON code from a compilation unit which is *not* into the unit containing the NEON code from a compilation unit which is *not*
built with the GCC flag '-mfpu=neon' set. built with the GCC flag '-mfpu=neon' set.
......
...@@ -1310,7 +1310,7 @@ config SCHED_SMT ...@@ -1310,7 +1310,7 @@ config SCHED_SMT
config HAVE_ARM_SCU config HAVE_ARM_SCU
bool bool
help help
This option enables support for the ARM system coherency unit This option enables support for the ARM snoop control unit
config HAVE_ARM_ARCH_TIMER config HAVE_ARM_ARCH_TIMER
bool "Architected timer support" bool "Architected timer support"
...@@ -1322,7 +1322,6 @@ config HAVE_ARM_ARCH_TIMER ...@@ -1322,7 +1322,6 @@ config HAVE_ARM_ARCH_TIMER
config HAVE_ARM_TWD config HAVE_ARM_TWD
bool bool
select TIMER_OF if OF
help help
This options enables support for the ARM timer and watchdog unit This options enables support for the ARM timer and watchdog unit
......
...@@ -20,10 +20,12 @@ config DRAM_SIZE ...@@ -20,10 +20,12 @@ config DRAM_SIZE
config FLASH_MEM_BASE config FLASH_MEM_BASE
hex 'FLASH Base Address' if SET_MEM_PARAM hex 'FLASH Base Address' if SET_MEM_PARAM
depends on CPU_ARM740T || CPU_ARM946E || CPU_ARM940T
default 0x00400000 default 0x00400000
config FLASH_SIZE config FLASH_SIZE
hex 'FLASH Size' if SET_MEM_PARAM hex 'FLASH Size' if SET_MEM_PARAM
depends on CPU_ARM740T || CPU_ARM946E || CPU_ARM940T
default 0x00400000 default 0x00400000
config PROCESSOR_ID config PROCESSOR_ID
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
# #
# Copyright (C) 1995-2001 by Russell King # Copyright (C) 1995-2001 by Russell King
LDFLAGS_vmlinux :=-p --no-undefined -X --pic-veneer LDFLAGS_vmlinux := --no-undefined -X --pic-veneer
ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
LDFLAGS_vmlinux += --be8 LDFLAGS_vmlinux += --be8
KBUILD_LDFLAGS_MODULE += --be8 KBUILD_LDFLAGS_MODULE += --be8
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
GCOV_PROFILE := n GCOV_PROFILE := n
LDFLAGS_bootp :=-p --no-undefined -X \ LDFLAGS_bootp := --no-undefined -X \
--defsym initrd_phys=$(INITRD_PHYS) \ --defsym initrd_phys=$(INITRD_PHYS) \
--defsym params_phys=$(PARAMS_PHYS) -T --defsym params_phys=$(PARAMS_PHYS) -T
AFLAGS_initrd.o :=-DINITRD=\"$(INITRD)\" AFLAGS_initrd.o :=-DINITRD=\"$(INITRD)\"
......
...@@ -44,7 +44,7 @@ _start: add lr, pc, #-0x8 @ lr = current load addr ...@@ -44,7 +44,7 @@ _start: add lr, pc, #-0x8 @ lr = current load addr
*/ */
movne r10, #0 @ terminator movne r10, #0 @ terminator
movne r4, #2 @ Size of this entry (2 words) movne r4, #2 @ Size of this entry (2 words)
stmneia r9, {r4, r5, r10} @ Size, ATAG_CORE, terminator stmiane r9, {r4, r5, r10} @ Size, ATAG_CORE, terminator
/* /*
* find the end of the tag list, and then add an INITRD tag on the end. * find the end of the tag list, and then add an INITRD tag on the end.
......
...@@ -132,8 +132,6 @@ endif ...@@ -132,8 +132,6 @@ endif
ifeq ($(CONFIG_CPU_ENDIAN_BE8),y) ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
LDFLAGS_vmlinux += --be8 LDFLAGS_vmlinux += --be8
endif endif
# ?
LDFLAGS_vmlinux += -p
# Report unresolved symbol references # Report unresolved symbol references
LDFLAGS_vmlinux += --no-undefined LDFLAGS_vmlinux += --no-undefined
# Delete all temporary local symbols # Delete all temporary local symbols
......
...@@ -75,7 +75,7 @@ Lrow4bpplp: ...@@ -75,7 +75,7 @@ Lrow4bpplp:
tst r1, #7 @ avoid using r7 directly after tst r1, #7 @ avoid using r7 directly after
str r7, [r0, -r5]! str r7, [r0, -r5]!
subne r1, r1, #1 subne r1, r1, #1
ldrneb r7, [r6, r1] ldrbne r7, [r6, r1]
bne Lrow4bpplp bne Lrow4bpplp
ldmfd sp!, {r4 - r7, pc} ldmfd sp!, {r4 - r7, pc}
...@@ -103,7 +103,7 @@ Lrow8bpplp: ...@@ -103,7 +103,7 @@ Lrow8bpplp:
sub r0, r0, r5 @ avoid ip sub r0, r0, r5 @ avoid ip
stmia r0, {r4, ip} stmia r0, {r4, ip}
subne r1, r1, #1 subne r1, r1, #1
ldrneb r7, [r6, r1] ldrbne r7, [r6, r1]
bne Lrow8bpplp bne Lrow8bpplp
ldmfd sp!, {r4 - r7, pc} ldmfd sp!, {r4 - r7, pc}
......
...@@ -381,7 +381,7 @@ static int __init nocache_trampoline(unsigned long _arg) ...@@ -381,7 +381,7 @@ static int __init nocache_trampoline(unsigned long _arg)
unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
phys_reset_t phys_reset; phys_reset_t phys_reset;
mcpm_set_entry_vector(cpu, cluster, cpu_resume); mcpm_set_entry_vector(cpu, cluster, cpu_resume_no_hyp);
setup_mm_for_reboot(); setup_mm_for_reboot();
__mcpm_cpu_going_down(cpu, cluster); __mcpm_cpu_going_down(cpu, cluster);
......
...@@ -376,9 +376,9 @@ THUMB( orr \reg , \reg , #PSR_T_BIT ) ...@@ -376,9 +376,9 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
.macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=TUSER() .macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=TUSER()
9999: 9999:
.if \inc == 1 .if \inc == 1
\instr\cond\()b\()\t\().w \reg, [\ptr, #\off] \instr\()b\t\cond\().w \reg, [\ptr, #\off]
.elseif \inc == 4 .elseif \inc == 4
\instr\cond\()\t\().w \reg, [\ptr, #\off] \instr\t\cond\().w \reg, [\ptr, #\off]
.else .else
.error "Unsupported inc macro argument" .error "Unsupported inc macro argument"
.endif .endif
...@@ -417,9 +417,9 @@ THUMB( orr \reg , \reg , #PSR_T_BIT ) ...@@ -417,9 +417,9 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
.rept \rept .rept \rept
9999: 9999:
.if \inc == 1 .if \inc == 1
\instr\cond\()b\()\t \reg, [\ptr], #\inc \instr\()b\t\cond \reg, [\ptr], #\inc
.elseif \inc == 4 .elseif \inc == 4
\instr\cond\()\t \reg, [\ptr], #\inc \instr\t\cond \reg, [\ptr], #\inc
.else .else
.error "Unsupported inc macro argument" .error "Unsupported inc macro argument"
.endif .endif
...@@ -460,7 +460,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT ) ...@@ -460,7 +460,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
.macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req .macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req
#ifndef CONFIG_CPU_USE_DOMAINS #ifndef CONFIG_CPU_USE_DOMAINS
adds \tmp, \addr, #\size - 1 adds \tmp, \addr, #\size - 1
sbcccs \tmp, \tmp, \limit sbcscc \tmp, \tmp, \limit
bcs \bad bcs \bad
#ifdef CONFIG_CPU_SPECTRE #ifdef CONFIG_CPU_SPECTRE
movcs \addr, #0 movcs \addr, #0
...@@ -474,7 +474,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT ) ...@@ -474,7 +474,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
sub \tmp, \limit, #1 sub \tmp, \limit, #1
subs \tmp, \tmp, \addr @ tmp = limit - 1 - addr subs \tmp, \tmp, \addr @ tmp = limit - 1 - addr
addhs \tmp, \tmp, #1 @ if (tmp >= 0) { addhs \tmp, \tmp, #1 @ if (tmp >= 0) {
subhss \tmp, \tmp, \size @ tmp = limit - (addr + size) } subshs \tmp, \tmp, \size @ tmp = limit - (addr + size) }
movlo \addr, #0 @ if (tmp < 0) addr = NULL movlo \addr, #0 @ if (tmp < 0) addr = NULL
csdb csdb
#endif #endif
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#define sev() __asm__ __volatile__ ("sev" : : : "memory") #define sev() __asm__ __volatile__ ("sev" : : : "memory")
#define wfe() __asm__ __volatile__ ("wfe" : : : "memory") #define wfe() __asm__ __volatile__ ("wfe" : : : "memory")
#define wfi() __asm__ __volatile__ ("wfi" : : : "memory") #define wfi() __asm__ __volatile__ ("wfi" : : : "memory")
#else
#define wfe() do { } while (0)
#endif #endif
#if __LINUX_ARM_ARCH__ >= 7 #if __LINUX_ARM_ARCH__ >= 7
......
...@@ -16,25 +16,25 @@ ...@@ -16,25 +16,25 @@
ldr \tmp, =irq_prio_h ldr \tmp, =irq_prio_h
teq \irqstat, #0 teq \irqstat, #0
#ifdef IOMD_BASE #ifdef IOMD_BASE
ldreqb \irqstat, [\base, #IOMD_DMAREQ] @ get dma ldrbeq \irqstat, [\base, #IOMD_DMAREQ] @ get dma
addeq \tmp, \tmp, #256 @ irq_prio_h table size addeq \tmp, \tmp, #256 @ irq_prio_h table size
teqeq \irqstat, #0 teqeq \irqstat, #0
bne 2406f bne 2406f
#endif #endif
ldreqb \irqstat, [\base, #IOMD_IRQREQA] @ get low priority ldrbeq \irqstat, [\base, #IOMD_IRQREQA] @ get low priority
addeq \tmp, \tmp, #256 @ irq_prio_d table size addeq \tmp, \tmp, #256 @ irq_prio_d table size
teqeq \irqstat, #0 teqeq \irqstat, #0
#ifdef IOMD_IRQREQC #ifdef IOMD_IRQREQC
ldreqb \irqstat, [\base, #IOMD_IRQREQC] ldrbeq \irqstat, [\base, #IOMD_IRQREQC]
addeq \tmp, \tmp, #256 @ irq_prio_l table size addeq \tmp, \tmp, #256 @ irq_prio_l table size
teqeq \irqstat, #0 teqeq \irqstat, #0
#endif #endif
#ifdef IOMD_IRQREQD #ifdef IOMD_IRQREQD
ldreqb \irqstat, [\base, #IOMD_IRQREQD] ldrbeq \irqstat, [\base, #IOMD_IRQREQD]
addeq \tmp, \tmp, #256 @ irq_prio_lc table size addeq \tmp, \tmp, #256 @ irq_prio_lc table size
teqeq \irqstat, #0 teqeq \irqstat, #0
#endif #endif
2406: ldrneb \irqnr, [\tmp, \irqstat] @ get IRQ number 2406: ldrbne \irqnr, [\tmp, \irqstat] @ get IRQ number
.endm .endm
/* /*
......
...@@ -125,6 +125,9 @@ extern pgprot_t pgprot_s2_device; ...@@ -125,6 +125,9 @@ extern pgprot_t pgprot_s2_device;
#define pgprot_stronglyordered(prot) \ #define pgprot_stronglyordered(prot) \
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED) __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED)
#define pgprot_device(prot) \
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_DEV_SHARED | L_PTE_SHARED | L_PTE_DIRTY | L_PTE_XN)
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE #ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
#define pgprot_dmacoherent(prot) \ #define pgprot_dmacoherent(prot) \
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE | L_PTE_XN) __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE | L_PTE_XN)
......
...@@ -89,7 +89,11 @@ extern void release_thread(struct task_struct *); ...@@ -89,7 +89,11 @@ extern void release_thread(struct task_struct *);
unsigned long get_wchan(struct task_struct *p); unsigned long get_wchan(struct task_struct *p);
#if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327) #if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327)
#define cpu_relax() smp_mb() #define cpu_relax() \
do { \
smp_mb(); \
__asm__ __volatile__("nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;"); \
} while (0)
#else #else
#define cpu_relax() barrier() #define cpu_relax() barrier()
#endif #endif
......
...@@ -67,7 +67,6 @@ struct secondary_data { ...@@ -67,7 +67,6 @@ struct secondary_data {
void *stack; void *stack;
}; };
extern struct secondary_data secondary_data; extern struct secondary_data secondary_data;
extern volatile int pen_release;
extern void secondary_startup(void); extern void secondary_startup(void);
extern void secondary_startup_arm(void); extern void secondary_startup_arm(void);
......
...@@ -19,20 +19,4 @@ ...@@ -19,20 +19,4 @@
#define TWD_TIMER_CONTROL_PERIODIC (1 << 1) #define TWD_TIMER_CONTROL_PERIODIC (1 << 1)
#define TWD_TIMER_CONTROL_IT_ENABLE (1 << 2) #define TWD_TIMER_CONTROL_IT_ENABLE (1 << 2)
#include <linux/ioport.h>
struct twd_local_timer {
struct resource res[2];
};
#define DEFINE_TWD_LOCAL_TIMER(name,base,irq) \
struct twd_local_timer name __initdata = { \
.res = { \
DEFINE_RES_MEM(base, 0x10), \
DEFINE_RES_IRQ(irq), \
}, \
};
int twd_local_timer_register(struct twd_local_timer *);
#endif #endif
...@@ -210,11 +210,12 @@ static inline void arch_read_lock(arch_rwlock_t *rw) ...@@ -210,11 +210,12 @@ static inline void arch_read_lock(arch_rwlock_t *rw)
prefetchw(&rw->lock); prefetchw(&rw->lock);
__asm__ __volatile__( __asm__ __volatile__(
" .syntax unified\n"
"1: ldrex %0, [%2]\n" "1: ldrex %0, [%2]\n"
" adds %0, %0, #1\n" " adds %0, %0, #1\n"
" strexpl %1, %0, [%2]\n" " strexpl %1, %0, [%2]\n"
WFE("mi") WFE("mi")
" rsbpls %0, %1, #0\n" " rsbspl %0, %1, #0\n"
" bmi 1b" " bmi 1b"
: "=&r" (tmp), "=&r" (tmp2) : "=&r" (tmp), "=&r" (tmp2)
: "r" (&rw->lock) : "r" (&rw->lock)
......
...@@ -10,6 +10,7 @@ struct sleep_save_sp { ...@@ -10,6 +10,7 @@ struct sleep_save_sp {
}; };
extern void cpu_resume(void); extern void cpu_resume(void);
extern void cpu_resume_no_hyp(void);
extern void cpu_resume_arm(void); extern void cpu_resume_arm(void);
extern int cpu_suspend(unsigned long, int (*)(unsigned long)); extern int cpu_suspend(unsigned long, int (*)(unsigned long));
......
...@@ -85,7 +85,8 @@ static inline void set_fs(mm_segment_t fs) ...@@ -85,7 +85,8 @@ static inline void set_fs(mm_segment_t fs)
#define __range_ok(addr, size) ({ \ #define __range_ok(addr, size) ({ \
unsigned long flag, roksum; \ unsigned long flag, roksum; \
__chk_user_ptr(addr); \ __chk_user_ptr(addr); \
__asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \ __asm__(".syntax unified\n" \
"adds %1, %2, %3; sbcscc %1, %1, %0; movcc %0, #0" \
: "=&r" (flag), "=&r" (roksum) \ : "=&r" (flag), "=&r" (roksum) \
: "r" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit) \ : "r" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit) \
: "cc"); \ : "cc"); \
......
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
* (0 -> msp; 1 -> psp). Bits [1:0] are fixed to 0b01. * (0 -> msp; 1 -> psp). Bits [1:0] are fixed to 0b01.
*/ */
#define EXC_RET_STACK_MASK 0x00000004 #define EXC_RET_STACK_MASK 0x00000004
#define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd #define EXC_RET_THREADMODE_PROCESSSTACK (3 << 2)
/* Cache related definitions */ /* Cache related definitions */
......
...@@ -29,13 +29,13 @@ ...@@ -29,13 +29,13 @@
ldr \tmp, =elf_hwcap @ may not have MVFR regs ldr \tmp, =elf_hwcap @ may not have MVFR regs
ldr \tmp, [\tmp, #0] ldr \tmp, [\tmp, #0]
tst \tmp, #HWCAP_VFPD32 tst \tmp, #HWCAP_VFPD32
ldcnel p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} ldclne p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
addeq \base, \base, #32*4 @ step over unused register space addeq \base, \base, #32*4 @ step over unused register space
#else #else
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field
cmp \tmp, #2 @ 32 x 64bit registers? cmp \tmp, #2 @ 32 x 64bit registers?
ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31} ldcleq p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
addne \base, \base, #32*4 @ step over unused register space addne \base, \base, #32*4 @ step over unused register space
#endif #endif
#endif #endif
...@@ -53,13 +53,13 @@ ...@@ -53,13 +53,13 @@
ldr \tmp, =elf_hwcap @ may not have MVFR regs ldr \tmp, =elf_hwcap @ may not have MVFR regs
ldr \tmp, [\tmp, #0] ldr \tmp, [\tmp, #0]
tst \tmp, #HWCAP_VFPD32 tst \tmp, #HWCAP_VFPD32
stcnel p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} stclne p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
addeq \base, \base, #32*4 @ step over unused register space addeq \base, \base, #32*4 @ step over unused register space
#else #else
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0 VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field
cmp \tmp, #2 @ 32 x 64bit registers? cmp \tmp, #2 @ 32 x 64bit registers?
stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31} stcleq p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
addne \base, \base, #32*4 @ step over unused register space addne \base, \base, #32*4 @ step over unused register space
#endif #endif
#endif #endif
......
...@@ -173,7 +173,7 @@ ...@@ -173,7 +173,7 @@
.macro senduart, rd, rx .macro senduart, rd, rx
cmp \rx, #0 cmp \rx, #0
strneb \rd, [\rx, #UART_TX << UART_SHIFT] strbne \rd, [\rx, #UART_TX << UART_SHIFT]
1001: 1001:
.endm .endm
......
...@@ -86,7 +86,7 @@ hexbuf_rel: .long hexbuf_addr - . ...@@ -86,7 +86,7 @@ hexbuf_rel: .long hexbuf_addr - .
ENTRY(printascii) ENTRY(printascii)
addruart_current r3, r1, r2 addruart_current r3, r1, r2
1: teq r0, #0 1: teq r0, #0
ldrneb r1, [r0], #1 ldrbne r1, [r0], #1
teqne r1, #0 teqne r1, #0
reteq lr reteq lr
2: teq r1, #'\n' 2: teq r1, #'\n'
......
...@@ -636,7 +636,7 @@ call_fpe: ...@@ -636,7 +636,7 @@ call_fpe:
@ Test if we need to give access to iWMMXt coprocessors @ Test if we need to give access to iWMMXt coprocessors
ldr r5, [r10, #TI_FLAGS] ldr r5, [r10, #TI_FLAGS]
rsbs r7, r8, #(1 << 8) @ CP 0 or 1 only rsbs r7, r8, #(1 << 8) @ CP 0 or 1 only
movcss r7, r5, lsr #(TIF_USING_IWMMXT + 1) movscs r7, r5, lsr #(TIF_USING_IWMMXT + 1)
bcs iwmmxt_task_enable bcs iwmmxt_task_enable
#endif #endif
ARM( add pc, pc, r8, lsr #6 ) ARM( add pc, pc, r8, lsr #6 )
...@@ -872,7 +872,7 @@ __kuser_cmpxchg64: @ 0xffff0f60 ...@@ -872,7 +872,7 @@ __kuser_cmpxchg64: @ 0xffff0f60
smp_dmb arm smp_dmb arm
1: ldrexd r0, r1, [r2] @ load current val 1: ldrexd r0, r1, [r2] @ load current val
eors r3, r0, r4 @ compare with oldval (1) eors r3, r0, r4 @ compare with oldval (1)
eoreqs r3, r1, r5 @ compare with oldval (2) eorseq r3, r1, r5 @ compare with oldval (2)
strexdeq r3, r6, r7, [r2] @ store newval if eq strexdeq r3, r6, r7, [r2] @ store newval if eq
teqeq r3, #1 @ success? teqeq r3, #1 @ success?
beq 1b @ if no then retry beq 1b @ if no then retry
...@@ -896,8 +896,8 @@ __kuser_cmpxchg64: @ 0xffff0f60 ...@@ -896,8 +896,8 @@ __kuser_cmpxchg64: @ 0xffff0f60
ldmia r1, {r6, lr} @ load new val ldmia r1, {r6, lr} @ load new val
1: ldmia r2, {r0, r1} @ load current val 1: ldmia r2, {r0, r1} @ load current val
eors r3, r0, r4 @ compare with oldval (1) eors r3, r0, r4 @ compare with oldval (1)
eoreqs r3, r1, r5 @ compare with oldval (2) eorseq r3, r1, r5 @ compare with oldval (2)
2: stmeqia r2, {r6, lr} @ store newval if eq 2: stmiaeq r2, {r6, lr} @ store newval if eq
rsbs r0, r3, #0 @ set return val and C flag rsbs r0, r3, #0 @ set return val and C flag
ldmfd sp!, {r4, r5, r6, pc} ldmfd sp!, {r4, r5, r6, pc}
...@@ -911,7 +911,7 @@ kuser_cmpxchg64_fixup: ...@@ -911,7 +911,7 @@ kuser_cmpxchg64_fixup:
mov r7, #0xffff0fff mov r7, #0xffff0fff
sub r7, r7, #(0xffff0fff - (0xffff0f60 + (1b - __kuser_cmpxchg64))) sub r7, r7, #(0xffff0fff - (0xffff0f60 + (1b - __kuser_cmpxchg64)))
subs r8, r4, r7 subs r8, r4, r7
rsbcss r8, r8, #(2b - 1b) rsbscs r8, r8, #(2b - 1b)
strcs r7, [sp, #S_PC] strcs r7, [sp, #S_PC]
#if __LINUX_ARM_ARCH__ < 6 #if __LINUX_ARM_ARCH__ < 6
bcc kuser_cmpxchg32_fixup bcc kuser_cmpxchg32_fixup
...@@ -969,7 +969,7 @@ kuser_cmpxchg32_fixup: ...@@ -969,7 +969,7 @@ kuser_cmpxchg32_fixup:
mov r7, #0xffff0fff mov r7, #0xffff0fff
sub r7, r7, #(0xffff0fff - (0xffff0fc0 + (1b - __kuser_cmpxchg))) sub r7, r7, #(0xffff0fff - (0xffff0fc0 + (1b - __kuser_cmpxchg)))
subs r8, r4, r7 subs r8, r4, r7
rsbcss r8, r8, #(2b - 1b) rsbscs r8, r8, #(2b - 1b)
strcs r7, [sp, #S_PC] strcs r7, [sp, #S_PC]
ret lr ret lr
.previous .previous
......
...@@ -373,7 +373,7 @@ sys_syscall: ...@@ -373,7 +373,7 @@ sys_syscall:
movhs scno, #0 movhs scno, #0
csdb csdb
#endif #endif
stmloia sp, {r5, r6} @ shuffle args stmialo sp, {r5, r6} @ shuffle args
movlo r0, r1 movlo r0, r1
movlo r1, r2 movlo r1, r2
movlo r2, r3 movlo r2, r3
......
...@@ -127,7 +127,8 @@ ...@@ -127,7 +127,8 @@
*/ */
.macro v7m_exception_slow_exit ret_r0 .macro v7m_exception_slow_exit ret_r0
cpsid i cpsid i
ldr lr, =EXC_RET_THREADMODE_PROCESSSTACK ldr lr, =exc_ret
ldr lr, [lr]
@ read original r12, sp, lr, pc and xPSR @ read original r12, sp, lr, pc and xPSR
add r12, sp, #S_IP add r12, sp, #S_IP
...@@ -387,8 +388,8 @@ ...@@ -387,8 +388,8 @@
badr lr, \ret @ return address badr lr, \ret @ return address
.if \reload .if \reload
add r1, sp, #S_R0 + S_OFF @ pointer to regs add r1, sp, #S_R0 + S_OFF @ pointer to regs
ldmccia r1, {r0 - r6} @ reload r0-r6 ldmiacc r1, {r0 - r6} @ reload r0-r6
stmccia sp, {r4, r5} @ update stack arguments stmiacc sp, {r4, r5} @ update stack arguments
.endif .endif
ldrcc pc, [\table, \tmp, lsl #2] @ call sys_* routine ldrcc pc, [\table, \tmp, lsl #2] @ call sys_* routine
#else #else
...@@ -396,8 +397,8 @@ ...@@ -396,8 +397,8 @@
badr lr, \ret @ return address badr lr, \ret @ return address
.if \reload .if \reload
add r1, sp, #S_R0 + S_OFF @ pointer to regs add r1, sp, #S_R0 + S_OFF @ pointer to regs
ldmccia r1, {r0 - r6} @ reload r0-r6 ldmiacc r1, {r0 - r6} @ reload r0-r6
stmccia sp, {r4, r5} @ update stack arguments stmiacc sp, {r4, r5} @ update stack arguments
.endif .endif
ldrcc pc, [\table, \nr, lsl #2] @ call sys_* routine ldrcc pc, [\table, \nr, lsl #2] @ call sys_* routine
#endif #endif
......
...@@ -146,3 +146,7 @@ ENTRY(vector_table) ...@@ -146,3 +146,7 @@ ENTRY(vector_table)
.rept CONFIG_CPU_V7M_NUM_IRQ .rept CONFIG_CPU_V7M_NUM_IRQ
.long __irq_entry @ External Interrupts .long __irq_entry @ External Interrupts
.endr .endr
.align 2
.globl exc_ret
exc_ret:
.space 4
...@@ -439,8 +439,8 @@ M_CLASS(str r6, [r12, #PMSAv8_RLAR_A(3)]) ...@@ -439,8 +439,8 @@ M_CLASS(str r6, [r12, #PMSAv8_RLAR_A(3)])
str r5, [r12, #PMSAv8_RBAR_A(0)] str r5, [r12, #PMSAv8_RBAR_A(0)]
str r6, [r12, #PMSAv8_RLAR_A(0)] str r6, [r12, #PMSAv8_RLAR_A(0)]
#else #else
mcr p15, 0, r5, c6, c10, 1 @ PRBAR4 mcr p15, 0, r5, c6, c10, 0 @ PRBAR4
mcr p15, 0, r6, c6, c10, 2 @ PRLAR4 mcr p15, 0, r6, c6, c10, 1 @ PRLAR4
#endif #endif
#endif #endif
ret lr ret lr
......
...@@ -180,8 +180,8 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE ...@@ -180,8 +180,8 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE
@ Check whether GICv3 system registers are available @ Check whether GICv3 system registers are available
mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1 mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1
ubfx r7, r7, #28, #4 ubfx r7, r7, #28, #4
cmp r7, #1 teq r7, #0
bne 2f beq 2f
@ Enable system register accesses @ Enable system register accesses
mrc p15, 4, r7, c12, c9, 5 @ ICC_HSRE mrc p15, 4, r7, c12, c9, 5 @ ICC_HSRE
......
...@@ -91,8 +91,11 @@ void machine_crash_nonpanic_core(void *unused) ...@@ -91,8 +91,11 @@ void machine_crash_nonpanic_core(void *unused)
set_cpu_online(smp_processor_id(), false); set_cpu_online(smp_processor_id(), false);
atomic_dec(&waiting_for_crash_ipi); atomic_dec(&waiting_for_crash_ipi);
while (1)
while (1) {
cpu_relax(); cpu_relax();
wfe();
}
} }
void crash_smp_send_stop(void) void crash_smp_send_stop(void)
......
...@@ -16,7 +16,7 @@ struct patch { ...@@ -16,7 +16,7 @@ struct patch {
unsigned int insn; unsigned int insn;
}; };
static DEFINE_SPINLOCK(patch_lock); static DEFINE_RAW_SPINLOCK(patch_lock);
static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags) static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
__acquires(&patch_lock) __acquires(&patch_lock)
...@@ -33,7 +33,7 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags) ...@@ -33,7 +33,7 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
return addr; return addr;
if (flags) if (flags)
spin_lock_irqsave(&patch_lock, *flags); raw_spin_lock_irqsave(&patch_lock, *flags);
else else
__acquire(&patch_lock); __acquire(&patch_lock);
...@@ -48,7 +48,7 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags) ...@@ -48,7 +48,7 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags)
clear_fixmap(fixmap); clear_fixmap(fixmap);
if (flags) if (flags)
spin_unlock_irqrestore(&patch_lock, *flags); raw_spin_unlock_irqrestore(&patch_lock, *flags);
else else
__release(&patch_lock); __release(&patch_lock);
} }
......
...@@ -120,6 +120,14 @@ ENDPROC(cpu_resume_after_mmu) ...@@ -120,6 +120,14 @@ ENDPROC(cpu_resume_after_mmu)
.text .text
.align .align
#ifdef CONFIG_MCPM
.arm
THUMB( .thumb )
ENTRY(cpu_resume_no_hyp)
ARM_BE8(setend be) @ ensure we are in BE mode
b no_hyp
#endif
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
.arm .arm
ENTRY(cpu_resume_arm) ENTRY(cpu_resume_arm)
...@@ -135,6 +143,7 @@ ARM_BE8(setend be) @ ensure we are in BE mode ...@@ -135,6 +143,7 @@ ARM_BE8(setend be) @ ensure we are in BE mode
bl __hyp_stub_install_secondary bl __hyp_stub_install_secondary
#endif #endif
safe_svcmode_maskall r1 safe_svcmode_maskall r1
no_hyp:
mov r1, #0 mov r1, #0
ALT_SMP(mrc p15, 0, r0, c0, c0, 5) ALT_SMP(mrc p15, 0, r0, c0, c0, 5)
ALT_UP_B(1f) ALT_UP_B(1f)
...@@ -163,6 +172,9 @@ ENDPROC(cpu_resume) ...@@ -163,6 +172,9 @@ ENDPROC(cpu_resume)
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
ENDPROC(cpu_resume_arm) ENDPROC(cpu_resume_arm)
#endif
#ifdef CONFIG_MCPM
ENDPROC(cpu_resume_no_hyp)
#endif #endif
.align 2 .align 2
......
...@@ -62,12 +62,6 @@ ...@@ -62,12 +62,6 @@
*/ */
struct secondary_data secondary_data; struct secondary_data secondary_data;
/*
* control for which core is the next to come out of the secondary
* boot "holding pen"
*/
volatile int pen_release = -1;
enum ipi_msg_type { enum ipi_msg_type {
IPI_WAKEUP, IPI_WAKEUP,
IPI_TIMER, IPI_TIMER,
...@@ -604,8 +598,10 @@ static void ipi_cpu_stop(unsigned int cpu) ...@@ -604,8 +598,10 @@ static void ipi_cpu_stop(unsigned int cpu)
local_fiq_disable(); local_fiq_disable();
local_irq_disable(); local_irq_disable();
while (1) while (1) {
cpu_relax(); cpu_relax();
wfe();
}
} }
static DEFINE_PER_CPU(struct completion *, cpu_completion); static DEFINE_PER_CPU(struct completion *, cpu_completion);
......
...@@ -100,8 +100,6 @@ static void twd_timer_stop(void) ...@@ -100,8 +100,6 @@ static void twd_timer_stop(void)
disable_percpu_irq(clk->irq); disable_percpu_irq(clk->irq);
} }
#ifdef CONFIG_COMMON_CLK
/* /*
* Updates clockevent frequency when the cpu frequency changes. * Updates clockevent frequency when the cpu frequency changes.
* Called on the cpu that is changing frequency with interrupts disabled. * Called on the cpu that is changing frequency with interrupts disabled.
...@@ -143,54 +141,6 @@ static int twd_clk_init(void) ...@@ -143,54 +141,6 @@ static int twd_clk_init(void)
} }
core_initcall(twd_clk_init); core_initcall(twd_clk_init);
#elif defined (CONFIG_CPU_FREQ)
#include <linux/cpufreq.h>
/*
* Updates clockevent frequency when the cpu frequency changes.
* Called on the cpu that is changing frequency with interrupts disabled.
*/
static void twd_update_frequency(void *data)
{
twd_timer_rate = clk_get_rate(twd_clk);
clockevents_update_freq(raw_cpu_ptr(twd_evt), twd_timer_rate);
}
static int twd_cpufreq_transition(struct notifier_block *nb,
unsigned long state, void *data)
{
struct cpufreq_freqs *freqs = data;
/*
* The twd clock events must be reprogrammed to account for the new
* frequency. The timer is local to a cpu, so cross-call to the
* changing cpu.
*/
if (state == CPUFREQ_POSTCHANGE)
smp_call_function_single(freqs->cpu, twd_update_frequency,
NULL, 1);
return NOTIFY_OK;
}
static struct notifier_block twd_cpufreq_nb = {
.notifier_call = twd_cpufreq_transition,
};
static int twd_cpufreq_init(void)
{
if (twd_evt && raw_cpu_ptr(twd_evt) && !IS_ERR(twd_clk))
return cpufreq_register_notifier(&twd_cpufreq_nb,
CPUFREQ_TRANSITION_NOTIFIER);
return 0;
}
core_initcall(twd_cpufreq_init);
#endif
static void twd_calibrate_rate(void) static void twd_calibrate_rate(void)
{ {
unsigned long count; unsigned long count;
...@@ -366,21 +316,6 @@ static int __init twd_local_timer_common_register(struct device_node *np) ...@@ -366,21 +316,6 @@ static int __init twd_local_timer_common_register(struct device_node *np)
return err; return err;
} }
int __init twd_local_timer_register(struct twd_local_timer *tlt)
{
if (twd_base || twd_evt)
return -EBUSY;
twd_ppi = tlt->res[1].start;
twd_base = ioremap(tlt->res[0].start, resource_size(&tlt->res[0]));
if (!twd_base)
return -ENOMEM;
return twd_local_timer_common_register(NULL);
}
#ifdef CONFIG_OF
static int __init twd_local_timer_of_register(struct device_node *np) static int __init twd_local_timer_of_register(struct device_node *np)
{ {
int err; int err;
...@@ -406,4 +341,3 @@ static int __init twd_local_timer_of_register(struct device_node *np) ...@@ -406,4 +341,3 @@ static int __init twd_local_timer_of_register(struct device_node *np)
TIMER_OF_DECLARE(arm_twd_a9, "arm,cortex-a9-twd-timer", twd_local_timer_of_register); TIMER_OF_DECLARE(arm_twd_a9, "arm,cortex-a9-twd-timer", twd_local_timer_of_register);
TIMER_OF_DECLARE(arm_twd_a5, "arm,cortex-a5-twd-timer", twd_local_timer_of_register); TIMER_OF_DECLARE(arm_twd_a5, "arm,cortex-a5-twd-timer", twd_local_timer_of_register);
TIMER_OF_DECLARE(arm_twd_11mp, "arm,arm11mp-twd-timer", twd_local_timer_of_register); TIMER_OF_DECLARE(arm_twd_11mp, "arm,arm11mp-twd-timer", twd_local_timer_of_register);
#endif
...@@ -93,7 +93,7 @@ extern const struct unwind_idx __start_unwind_idx[]; ...@@ -93,7 +93,7 @@ extern const struct unwind_idx __start_unwind_idx[];
static const struct unwind_idx *__origin_unwind_idx; static const struct unwind_idx *__origin_unwind_idx;
extern const struct unwind_idx __stop_unwind_idx[]; extern const struct unwind_idx __stop_unwind_idx[];
static DEFINE_SPINLOCK(unwind_lock); static DEFINE_RAW_SPINLOCK(unwind_lock);
static LIST_HEAD(unwind_tables); static LIST_HEAD(unwind_tables);
/* Convert a prel31 symbol to an absolute address */ /* Convert a prel31 symbol to an absolute address */
...@@ -201,7 +201,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr) ...@@ -201,7 +201,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr)
/* module unwind tables */ /* module unwind tables */
struct unwind_table *table; struct unwind_table *table;
spin_lock_irqsave(&unwind_lock, flags); raw_spin_lock_irqsave(&unwind_lock, flags);
list_for_each_entry(table, &unwind_tables, list) { list_for_each_entry(table, &unwind_tables, list) {
if (addr >= table->begin_addr && if (addr >= table->begin_addr &&
addr < table->end_addr) { addr < table->end_addr) {
...@@ -213,7 +213,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr) ...@@ -213,7 +213,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr)
break; break;
} }
} }
spin_unlock_irqrestore(&unwind_lock, flags); raw_spin_unlock_irqrestore(&unwind_lock, flags);
} }
pr_debug("%s: idx = %p\n", __func__, idx); pr_debug("%s: idx = %p\n", __func__, idx);
...@@ -529,9 +529,9 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size, ...@@ -529,9 +529,9 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size,
tab->begin_addr = text_addr; tab->begin_addr = text_addr;
tab->end_addr = text_addr + text_size; tab->end_addr = text_addr + text_size;
spin_lock_irqsave(&unwind_lock, flags); raw_spin_lock_irqsave(&unwind_lock, flags);
list_add_tail(&tab->list, &unwind_tables); list_add_tail(&tab->list, &unwind_tables);
spin_unlock_irqrestore(&unwind_lock, flags); raw_spin_unlock_irqrestore(&unwind_lock, flags);
return tab; return tab;
} }
...@@ -543,9 +543,9 @@ void unwind_table_del(struct unwind_table *tab) ...@@ -543,9 +543,9 @@ void unwind_table_del(struct unwind_table *tab)
if (!tab) if (!tab)
return; return;
spin_lock_irqsave(&unwind_lock, flags); raw_spin_lock_irqsave(&unwind_lock, flags);
list_del(&tab->list); list_del(&tab->list);
spin_unlock_irqrestore(&unwind_lock, flags); raw_spin_unlock_irqrestore(&unwind_lock, flags);
kfree(tab); kfree(tab);
} }
...@@ -39,7 +39,7 @@ $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S ...@@ -39,7 +39,7 @@ $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S
$(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S $(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S
ifeq ($(CONFIG_KERNEL_MODE_NEON),y) ifeq ($(CONFIG_KERNEL_MODE_NEON),y)
NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon NEON_FLAGS := -march=armv7-a -mfloat-abi=softfp -mfpu=neon
CFLAGS_xor-neon.o += $(NEON_FLAGS) CFLAGS_xor-neon.o += $(NEON_FLAGS)
obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o
endif endif
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
ENTRY( \name ) ENTRY( \name )
UNWIND( .fnstart ) UNWIND( .fnstart )
ands ip, r1, #3 ands ip, r1, #3
strneb r1, [ip] @ assert word-aligned strbne r1, [ip] @ assert word-aligned
mov r2, #1 mov r2, #1
and r3, r0, #31 @ Get bit offset and r3, r0, #31 @ Get bit offset
mov r0, r0, lsr #5 mov r0, r0, lsr #5
...@@ -32,7 +32,7 @@ ENDPROC(\name ) ...@@ -32,7 +32,7 @@ ENDPROC(\name )
ENTRY( \name ) ENTRY( \name )
UNWIND( .fnstart ) UNWIND( .fnstart )
ands ip, r1, #3 ands ip, r1, #3
strneb r1, [ip] @ assert word-aligned strbne r1, [ip] @ assert word-aligned
mov r2, #1 mov r2, #1
and r3, r0, #31 @ Get bit offset and r3, r0, #31 @ Get bit offset
mov r0, r0, lsr #5 mov r0, r0, lsr #5
...@@ -62,7 +62,7 @@ ENDPROC(\name ) ...@@ -62,7 +62,7 @@ ENDPROC(\name )
ENTRY( \name ) ENTRY( \name )
UNWIND( .fnstart ) UNWIND( .fnstart )
ands ip, r1, #3 ands ip, r1, #3
strneb r1, [ip] @ assert word-aligned strbne r1, [ip] @ assert word-aligned
and r2, r0, #31 and r2, r0, #31
mov r0, r0, lsr #5 mov r0, r0, lsr #5
mov r3, #1 mov r3, #1
...@@ -89,7 +89,7 @@ ENDPROC(\name ) ...@@ -89,7 +89,7 @@ ENDPROC(\name )
ENTRY( \name ) ENTRY( \name )
UNWIND( .fnstart ) UNWIND( .fnstart )
ands ip, r1, #3 ands ip, r1, #3
strneb r1, [ip] @ assert word-aligned strbne r1, [ip] @ assert word-aligned
and r3, r0, #31 and r3, r0, #31
mov r0, r0, lsr #5 mov r0, r0, lsr #5
save_and_disable_irqs ip save_and_disable_irqs ip
......
...@@ -44,7 +44,7 @@ UNWIND(.save {r1, lr}) ...@@ -44,7 +44,7 @@ UNWIND(.save {r1, lr})
strusr r2, r0, 1, ne, rept=2 strusr r2, r0, 1, ne, rept=2
tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1 tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1
it ne @ explicit IT needed for the label it ne @ explicit IT needed for the label
USER( strnebt r2, [r0]) USER( strbtne r2, [r0])
mov r0, #0 mov r0, #0
ldmfd sp!, {r1, pc} ldmfd sp!, {r1, pc}
UNWIND(.fnend) UNWIND(.fnend)
......
...@@ -91,7 +91,7 @@ ...@@ -91,7 +91,7 @@
.endm .endm
.macro str1b ptr reg cond=al abort .macro str1b ptr reg cond=al abort
str\cond\()b \reg, [\ptr], #1 strb\cond \reg, [\ptr], #1
.endm .endm
.macro enter reg1 reg2 .macro enter reg1 reg2
......
...@@ -39,9 +39,9 @@ ENTRY(copy_page) ...@@ -39,9 +39,9 @@ ENTRY(copy_page)
.endr .endr
subs r2, r2, #1 @ 1 subs r2, r2, #1 @ 1
stmia r0!, {r3, r4, ip, lr} @ 4 stmia r0!, {r3, r4, ip, lr} @ 4
ldmgtia r1!, {r3, r4, ip, lr} @ 4 ldmiagt r1!, {r3, r4, ip, lr} @ 4
bgt 1b @ 1 bgt 1b @ 1
PLD( ldmeqia r1!, {r3, r4, ip, lr} ) PLD( ldmiaeq r1!, {r3, r4, ip, lr} )
PLD( beq 2b ) PLD( beq 2b )
ldmfd sp!, {r4, pc} @ 3 ldmfd sp!, {r4, pc} @ 3
ENDPROC(copy_page) ENDPROC(copy_page)
...@@ -99,7 +99,7 @@ ...@@ -99,7 +99,7 @@
CALGN( ands ip, r0, #31 ) CALGN( ands ip, r0, #31 )
CALGN( rsb r3, ip, #32 ) CALGN( rsb r3, ip, #32 )
CALGN( sbcnes r4, r3, r2 ) @ C is always set here CALGN( sbcsne r4, r3, r2 ) @ C is always set here
CALGN( bcs 2f ) CALGN( bcs 2f )
CALGN( adr r4, 6f ) CALGN( adr r4, 6f )
CALGN( subs r2, r2, r3 ) @ C gets set CALGN( subs r2, r2, r3 ) @ C gets set
...@@ -204,7 +204,7 @@ ...@@ -204,7 +204,7 @@
CALGN( ands ip, r0, #31 ) CALGN( ands ip, r0, #31 )
CALGN( rsb ip, ip, #32 ) CALGN( rsb ip, ip, #32 )
CALGN( sbcnes r4, ip, r2 ) @ C is always set here CALGN( sbcsne r4, ip, r2 ) @ C is always set here
CALGN( subcc r2, r2, ip ) CALGN( subcc r2, r2, ip )
CALGN( bcc 15f ) CALGN( bcc 15f )
...@@ -241,7 +241,7 @@ ...@@ -241,7 +241,7 @@
orr r9, r9, ip, lspush #\push orr r9, r9, ip, lspush #\push
mov ip, ip, lspull #\pull mov ip, ip, lspull #\pull
orr ip, ip, lr, lspush #\push orr ip, ip, lr, lspush #\push
str8w r0, r3, r4, r5, r6, r7, r8, r9, ip, , abort=19f str8w r0, r3, r4, r5, r6, r7, r8, r9, ip, abort=19f
bge 12b bge 12b
PLD( cmn r2, #96 ) PLD( cmn r2, #96 )
PLD( bge 13b ) PLD( bge 13b )
......
...@@ -49,7 +49,7 @@ ...@@ -49,7 +49,7 @@
.endm .endm
.macro ldr1b ptr reg cond=al abort .macro ldr1b ptr reg cond=al abort
ldr\cond\()b \reg, [\ptr], #1 ldrb\cond \reg, [\ptr], #1
.endm .endm
#ifdef CONFIG_CPU_USE_DOMAINS #ifdef CONFIG_CPU_USE_DOMAINS
......
...@@ -40,9 +40,9 @@ td3 .req lr ...@@ -40,9 +40,9 @@ td3 .req lr
/* we must have at least one byte. */ /* we must have at least one byte. */
tst buf, #1 @ odd address? tst buf, #1 @ odd address?
movne sum, sum, ror #8 movne sum, sum, ror #8
ldrneb td0, [buf], #1 ldrbne td0, [buf], #1
subne len, len, #1 subne len, len, #1
adcnes sum, sum, td0, put_byte_1 adcsne sum, sum, td0, put_byte_1
.Lless4: tst len, #6 .Lless4: tst len, #6
beq .Lless8_byte beq .Lless8_byte
...@@ -68,8 +68,8 @@ td3 .req lr ...@@ -68,8 +68,8 @@ td3 .req lr
bne .Lless8_wordlp bne .Lless8_wordlp
.Lless8_byte: tst len, #1 @ odd number of bytes .Lless8_byte: tst len, #1 @ odd number of bytes
ldrneb td0, [buf], #1 @ include last byte ldrbne td0, [buf], #1 @ include last byte
adcnes sum, sum, td0, put_byte_0 @ update checksum adcsne sum, sum, td0, put_byte_0 @ update checksum
.Ldone: adc r0, sum, #0 @ collect up the last carry .Ldone: adc r0, sum, #0 @ collect up the last carry
ldr td0, [sp], #4 ldr td0, [sp], #4
...@@ -78,17 +78,17 @@ td3 .req lr ...@@ -78,17 +78,17 @@ td3 .req lr
ldr pc, [sp], #4 @ return ldr pc, [sp], #4 @ return
.Lnot_aligned: tst buf, #1 @ odd address .Lnot_aligned: tst buf, #1 @ odd address
ldrneb td0, [buf], #1 @ make even ldrbne td0, [buf], #1 @ make even
subne len, len, #1 subne len, len, #1
adcnes sum, sum, td0, put_byte_1 @ update checksum adcsne sum, sum, td0, put_byte_1 @ update checksum
tst buf, #2 @ 32-bit aligned? tst buf, #2 @ 32-bit aligned?
#if __LINUX_ARM_ARCH__ >= 4 #if __LINUX_ARM_ARCH__ >= 4
ldrneh td0, [buf], #2 @ make 32-bit aligned ldrhne td0, [buf], #2 @ make 32-bit aligned
subne len, len, #2 subne len, len, #2
#else #else
ldrneb td0, [buf], #1 ldrbne td0, [buf], #1
ldrneb ip, [buf], #1 ldrbne ip, [buf], #1
subne len, len, #2 subne len, len, #2
#ifndef __ARMEB__ #ifndef __ARMEB__
orrne td0, td0, ip, lsl #8 orrne td0, td0, ip, lsl #8
...@@ -96,7 +96,7 @@ td3 .req lr ...@@ -96,7 +96,7 @@ td3 .req lr
orrne td0, ip, td0, lsl #8 orrne td0, ip, td0, lsl #8
#endif #endif
#endif #endif
adcnes sum, sum, td0 @ update checksum adcsne sum, sum, td0 @ update checksum
ret lr ret lr
ENTRY(csum_partial) ENTRY(csum_partial)
......
...@@ -148,9 +148,9 @@ FN_ENTRY ...@@ -148,9 +148,9 @@ FN_ENTRY
strb r5, [dst], #1 strb r5, [dst], #1
mov r5, r4, get_byte_2 mov r5, r4, get_byte_2
.Lexit: tst len, #1 .Lexit: tst len, #1
strneb r5, [dst], #1 strbne r5, [dst], #1
andne r5, r5, #255 andne r5, r5, #255
adcnes sum, sum, r5, put_byte_0 adcsne sum, sum, r5, put_byte_0
/* /*
* If the dst pointer was not 16-bit aligned, we * If the dst pointer was not 16-bit aligned, we
......
...@@ -95,7 +95,7 @@ ...@@ -95,7 +95,7 @@
add r2, r2, r1 add r2, r2, r1
mov r0, #0 @ zero the buffer mov r0, #0 @ zero the buffer
9002: teq r2, r1 9002: teq r2, r1
strneb r0, [r1], #1 strbne r0, [r1], #1
bne 9002b bne 9002b
load_regs load_regs
.popsection .popsection
...@@ -88,8 +88,8 @@ UNWIND(.fnstart) ...@@ -88,8 +88,8 @@ UNWIND(.fnstart)
@ Break out early if dividend reaches 0. @ Break out early if dividend reaches 0.
2: cmp xh, yl 2: cmp xh, yl
orrcs yh, yh, ip orrcs yh, yh, ip
subcss xh, xh, yl subscs xh, xh, yl
movnes ip, ip, lsr #1 movsne ip, ip, lsr #1
mov yl, yl, lsr #1 mov yl, yl, lsr #1
bne 2b bne 2b
......
...@@ -14,8 +14,8 @@ ...@@ -14,8 +14,8 @@
.global floppy_fiqin_end .global floppy_fiqin_end
ENTRY(floppy_fiqin_start) ENTRY(floppy_fiqin_start)
subs r9, r9, #1 subs r9, r9, #1
ldrgtb r12, [r11, #-4] ldrbgt r12, [r11, #-4]
ldrleb r12, [r11], #0 ldrble r12, [r11], #0
strb r12, [r10], #1 strb r12, [r10], #1
subs pc, lr, #4 subs pc, lr, #4
floppy_fiqin_end: floppy_fiqin_end:
...@@ -23,10 +23,10 @@ floppy_fiqin_end: ...@@ -23,10 +23,10 @@ floppy_fiqin_end:
.global floppy_fiqout_end .global floppy_fiqout_end
ENTRY(floppy_fiqout_start) ENTRY(floppy_fiqout_start)
subs r9, r9, #1 subs r9, r9, #1
ldrgeb r12, [r10], #1 ldrbge r12, [r10], #1
movlt r12, #0 movlt r12, #0
strleb r12, [r11], #0 strble r12, [r11], #0
subles pc, lr, #4 subsle pc, lr, #4
strb r12, [r11, #-4] strb r12, [r11, #-4]
subs pc, lr, #4 subs pc, lr, #4
floppy_fiqout_end: floppy_fiqout_end:
...@@ -16,10 +16,10 @@ ...@@ -16,10 +16,10 @@
cmp ip, #2 cmp ip, #2
ldrb r3, [r0] ldrb r3, [r0]
strb r3, [r1], #1 strb r3, [r1], #1
ldrgeb r3, [r0] ldrbge r3, [r0]
strgeb r3, [r1], #1 strbge r3, [r1], #1
ldrgtb r3, [r0] ldrbgt r3, [r0]
strgtb r3, [r1], #1 strbgt r3, [r1], #1
subs r2, r2, ip subs r2, r2, ip
bne .Linsb_aligned bne .Linsb_aligned
...@@ -72,7 +72,7 @@ ENTRY(__raw_readsb) ...@@ -72,7 +72,7 @@ ENTRY(__raw_readsb)
bpl .Linsb_16_lp bpl .Linsb_16_lp
tst r2, #15 tst r2, #15
ldmeqfd sp!, {r4 - r6, pc} ldmfdeq sp!, {r4 - r6, pc}
.Linsb_no_16: tst r2, #8 .Linsb_no_16: tst r2, #8
beq .Linsb_no_8 beq .Linsb_no_8
...@@ -109,15 +109,15 @@ ENTRY(__raw_readsb) ...@@ -109,15 +109,15 @@ ENTRY(__raw_readsb)
str r3, [r1], #4 str r3, [r1], #4
.Linsb_no_4: ands r2, r2, #3 .Linsb_no_4: ands r2, r2, #3
ldmeqfd sp!, {r4 - r6, pc} ldmfdeq sp!, {r4 - r6, pc}
cmp r2, #2 cmp r2, #2
ldrb r3, [r0] ldrb r3, [r0]
strb r3, [r1], #1 strb r3, [r1], #1
ldrgeb r3, [r0] ldrbge r3, [r0]
strgeb r3, [r1], #1 strbge r3, [r1], #1
ldrgtb r3, [r0] ldrbgt r3, [r0]
strgtb r3, [r1] strbgt r3, [r1]
ldmfd sp!, {r4 - r6, pc} ldmfd sp!, {r4 - r6, pc}
ENDPROC(__raw_readsb) ENDPROC(__raw_readsb)
...@@ -30,7 +30,7 @@ ENTRY(__raw_readsl) ...@@ -30,7 +30,7 @@ ENTRY(__raw_readsl)
2: movs r2, r2, lsl #31 2: movs r2, r2, lsl #31
ldrcs r3, [r0, #0] ldrcs r3, [r0, #0]
ldrcs ip, [r0, #0] ldrcs ip, [r0, #0]
stmcsia r1!, {r3, ip} stmiacs r1!, {r3, ip}
ldrne r3, [r0, #0] ldrne r3, [r0, #0]
strne r3, [r1, #0] strne r3, [r1, #0]
ret lr ret lr
......
...@@ -68,7 +68,7 @@ ENTRY(__raw_readsw) ...@@ -68,7 +68,7 @@ ENTRY(__raw_readsw)
bpl .Linsw_8_lp bpl .Linsw_8_lp
tst r2, #7 tst r2, #7
ldmeqfd sp!, {r4, r5, r6, pc} ldmfdeq sp!, {r4, r5, r6, pc}
.Lno_insw_8: tst r2, #4 .Lno_insw_8: tst r2, #4
beq .Lno_insw_4 beq .Lno_insw_4
...@@ -97,9 +97,9 @@ ENTRY(__raw_readsw) ...@@ -97,9 +97,9 @@ ENTRY(__raw_readsw)
.Lno_insw_2: tst r2, #1 .Lno_insw_2: tst r2, #1
ldrne r3, [r0] ldrne r3, [r0]
strneb r3, [r1], #1 strbne r3, [r1], #1
movne r3, r3, lsr #8 movne r3, r3, lsr #8
strneb r3, [r1] strbne r3, [r1]
ldmfd sp!, {r4, r5, r6, pc} ldmfd sp!, {r4, r5, r6, pc}
......
...@@ -76,8 +76,8 @@ ENTRY(__raw_readsw) ...@@ -76,8 +76,8 @@ ENTRY(__raw_readsw)
pack r3, r3, ip pack r3, r3, ip
str r3, [r1], #4 str r3, [r1], #4
.Lno_insw_2: ldrneh r3, [r0] .Lno_insw_2: ldrhne r3, [r0]
strneh r3, [r1] strhne r3, [r1]
ldmfd sp!, {r4, r5, pc} ldmfd sp!, {r4, r5, pc}
...@@ -94,7 +94,7 @@ ENTRY(__raw_readsw) ...@@ -94,7 +94,7 @@ ENTRY(__raw_readsw)
#endif #endif
.Linsw_noalign: stmfd sp!, {r4, lr} .Linsw_noalign: stmfd sp!, {r4, lr}
ldrccb ip, [r1, #-1]! ldrbcc ip, [r1, #-1]!
bcc 1f bcc 1f
ldrh ip, [r0] ldrh ip, [r0]
...@@ -121,11 +121,11 @@ ENTRY(__raw_readsw) ...@@ -121,11 +121,11 @@ ENTRY(__raw_readsw)
3: tst r2, #1 3: tst r2, #1
strb ip, [r1], #1 strb ip, [r1], #1
ldrneh ip, [r0] ldrhne ip, [r0]
_BE_ONLY_( movne ip, ip, ror #8 ) _BE_ONLY_( movne ip, ip, ror #8 )
strneb ip, [r1], #1 strbne ip, [r1], #1
_LE_ONLY_( movne ip, ip, lsr #8 ) _LE_ONLY_( movne ip, ip, lsr #8 )
_BE_ONLY_( movne ip, ip, lsr #24 ) _BE_ONLY_( movne ip, ip, lsr #24 )
strneb ip, [r1] strbne ip, [r1]
ldmfd sp!, {r4, pc} ldmfd sp!, {r4, pc}
ENDPROC(__raw_readsw) ENDPROC(__raw_readsw)
...@@ -36,10 +36,10 @@ ...@@ -36,10 +36,10 @@
cmp ip, #2 cmp ip, #2
ldrb r3, [r1], #1 ldrb r3, [r1], #1
strb r3, [r0] strb r3, [r0]
ldrgeb r3, [r1], #1 ldrbge r3, [r1], #1
strgeb r3, [r0] strbge r3, [r0]
ldrgtb r3, [r1], #1 ldrbgt r3, [r1], #1
strgtb r3, [r0] strbgt r3, [r0]
subs r2, r2, ip subs r2, r2, ip
bne .Loutsb_aligned bne .Loutsb_aligned
...@@ -64,7 +64,7 @@ ENTRY(__raw_writesb) ...@@ -64,7 +64,7 @@ ENTRY(__raw_writesb)
bpl .Loutsb_16_lp bpl .Loutsb_16_lp
tst r2, #15 tst r2, #15
ldmeqfd sp!, {r4, r5, pc} ldmfdeq sp!, {r4, r5, pc}
.Loutsb_no_16: tst r2, #8 .Loutsb_no_16: tst r2, #8
beq .Loutsb_no_8 beq .Loutsb_no_8
...@@ -80,15 +80,15 @@ ENTRY(__raw_writesb) ...@@ -80,15 +80,15 @@ ENTRY(__raw_writesb)
outword r3 outword r3
.Loutsb_no_4: ands r2, r2, #3 .Loutsb_no_4: ands r2, r2, #3
ldmeqfd sp!, {r4, r5, pc} ldmfdeq sp!, {r4, r5, pc}
cmp r2, #2 cmp r2, #2
ldrb r3, [r1], #1 ldrb r3, [r1], #1
strb r3, [r0] strb r3, [r0]
ldrgeb r3, [r1], #1 ldrbge r3, [r1], #1
strgeb r3, [r0] strbge r3, [r0]
ldrgtb r3, [r1] ldrbgt r3, [r1]
strgtb r3, [r0] strbgt r3, [r0]
ldmfd sp!, {r4, r5, pc} ldmfd sp!, {r4, r5, pc}
ENDPROC(__raw_writesb) ENDPROC(__raw_writesb)
...@@ -28,7 +28,7 @@ ENTRY(__raw_writesl) ...@@ -28,7 +28,7 @@ ENTRY(__raw_writesl)
bpl 1b bpl 1b
ldmfd sp!, {r4, lr} ldmfd sp!, {r4, lr}
2: movs r2, r2, lsl #31 2: movs r2, r2, lsl #31
ldmcsia r1!, {r3, ip} ldmiacs r1!, {r3, ip}
strcs r3, [r0, #0] strcs r3, [r0, #0]
ldrne r3, [r1, #0] ldrne r3, [r1, #0]
strcs ip, [r0, #0] strcs ip, [r0, #0]
......
...@@ -79,7 +79,7 @@ ENTRY(__raw_writesw) ...@@ -79,7 +79,7 @@ ENTRY(__raw_writesw)
bpl .Loutsw_8_lp bpl .Loutsw_8_lp
tst r2, #7 tst r2, #7
ldmeqfd sp!, {r4, r5, r6, pc} ldmfdeq sp!, {r4, r5, r6, pc}
.Lno_outsw_8: tst r2, #4 .Lno_outsw_8: tst r2, #4
beq .Lno_outsw_4 beq .Lno_outsw_4
......
...@@ -61,8 +61,8 @@ ENTRY(__raw_writesw) ...@@ -61,8 +61,8 @@ ENTRY(__raw_writesw)
ldr r3, [r1], #4 ldr r3, [r1], #4
outword r3 outword r3
.Lno_outsw_2: ldrneh r3, [r1] .Lno_outsw_2: ldrhne r3, [r1]
strneh r3, [r0] strhne r3, [r0]
ldmfd sp!, {r4, r5, pc} ldmfd sp!, {r4, r5, pc}
...@@ -95,6 +95,6 @@ ENTRY(__raw_writesw) ...@@ -95,6 +95,6 @@ ENTRY(__raw_writesw)
tst r2, #1 tst r2, #1
3: movne ip, r3, lsr #8 3: movne ip, r3, lsr #8
strneh ip, [r0] strhne ip, [r0]
ret lr ret lr
ENDPROC(__raw_writesw) ENDPROC(__raw_writesw)
...@@ -96,7 +96,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -96,7 +96,7 @@ Boston, MA 02111-1307, USA. */
subhs \dividend, \dividend, \divisor, lsr #3 subhs \dividend, \dividend, \divisor, lsr #3
orrhs \result, \result, \curbit, lsr #3 orrhs \result, \result, \curbit, lsr #3
cmp \dividend, #0 @ Early termination? cmp \dividend, #0 @ Early termination?
movnes \curbit, \curbit, lsr #4 @ No, any more bits to do? movsne \curbit, \curbit, lsr #4 @ No, any more bits to do?
movne \divisor, \divisor, lsr #4 movne \divisor, \divisor, lsr #4
bne 1b bne 1b
...@@ -182,7 +182,7 @@ Boston, MA 02111-1307, USA. */ ...@@ -182,7 +182,7 @@ Boston, MA 02111-1307, USA. */
subhs \dividend, \dividend, \divisor, lsr #3 subhs \dividend, \dividend, \divisor, lsr #3
cmp \dividend, #1 cmp \dividend, #1
mov \divisor, \divisor, lsr #4 mov \divisor, \divisor, lsr #4
subges \order, \order, #4 subsge \order, \order, #4
bge 1b bge 1b
tst \order, #3 tst \order, #3
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
.endm .endm
.macro ldr1b ptr reg cond=al abort .macro ldr1b ptr reg cond=al abort
ldr\cond\()b \reg, [\ptr], #1 ldrb\cond \reg, [\ptr], #1
.endm .endm
.macro str1w ptr reg abort .macro str1w ptr reg abort
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
.endm .endm
.macro str1b ptr reg cond=al abort .macro str1b ptr reg cond=al abort
str\cond\()b \reg, [\ptr], #1 strb\cond \reg, [\ptr], #1
.endm .endm
.macro enter reg1 reg2 .macro enter reg1 reg2
......
...@@ -59,7 +59,7 @@ ENTRY(memmove) ...@@ -59,7 +59,7 @@ ENTRY(memmove)
blt 5f blt 5f
CALGN( ands ip, r0, #31 ) CALGN( ands ip, r0, #31 )
CALGN( sbcnes r4, ip, r2 ) @ C is always set here CALGN( sbcsne r4, ip, r2 ) @ C is always set here
CALGN( bcs 2f ) CALGN( bcs 2f )
CALGN( adr r4, 6f ) CALGN( adr r4, 6f )
CALGN( subs r2, r2, ip ) @ C is set here CALGN( subs r2, r2, ip ) @ C is set here
...@@ -114,20 +114,20 @@ ENTRY(memmove) ...@@ -114,20 +114,20 @@ ENTRY(memmove)
UNWIND( .save {r0, r4, lr} ) @ still in first stmfd block UNWIND( .save {r0, r4, lr} ) @ still in first stmfd block
8: movs r2, r2, lsl #31 8: movs r2, r2, lsl #31
ldrneb r3, [r1, #-1]! ldrbne r3, [r1, #-1]!
ldrcsb r4, [r1, #-1]! ldrbcs r4, [r1, #-1]!
ldrcsb ip, [r1, #-1] ldrbcs ip, [r1, #-1]
strneb r3, [r0, #-1]! strbne r3, [r0, #-1]!
strcsb r4, [r0, #-1]! strbcs r4, [r0, #-1]!
strcsb ip, [r0, #-1] strbcs ip, [r0, #-1]
ldmfd sp!, {r0, r4, pc} ldmfd sp!, {r0, r4, pc}
9: cmp ip, #2 9: cmp ip, #2
ldrgtb r3, [r1, #-1]! ldrbgt r3, [r1, #-1]!
ldrgeb r4, [r1, #-1]! ldrbge r4, [r1, #-1]!
ldrb lr, [r1, #-1]! ldrb lr, [r1, #-1]!
strgtb r3, [r0, #-1]! strbgt r3, [r0, #-1]!
strgeb r4, [r0, #-1]! strbge r4, [r0, #-1]!
subs r2, r2, ip subs r2, r2, ip
strb lr, [r0, #-1]! strb lr, [r0, #-1]!
blt 8b blt 8b
...@@ -150,7 +150,7 @@ ENTRY(memmove) ...@@ -150,7 +150,7 @@ ENTRY(memmove)
blt 14f blt 14f
CALGN( ands ip, r0, #31 ) CALGN( ands ip, r0, #31 )
CALGN( sbcnes r4, ip, r2 ) @ C is always set here CALGN( sbcsne r4, ip, r2 ) @ C is always set here
CALGN( subcc r2, r2, ip ) CALGN( subcc r2, r2, ip )
CALGN( bcc 15f ) CALGN( bcc 15f )
......
...@@ -44,20 +44,20 @@ UNWIND( .save {r8, lr} ) ...@@ -44,20 +44,20 @@ UNWIND( .save {r8, lr} )
mov lr, r3 mov lr, r3
2: subs r2, r2, #64 2: subs r2, r2, #64
stmgeia ip!, {r1, r3, r8, lr} @ 64 bytes at a time. stmiage ip!, {r1, r3, r8, lr} @ 64 bytes at a time.
stmgeia ip!, {r1, r3, r8, lr} stmiage ip!, {r1, r3, r8, lr}
stmgeia ip!, {r1, r3, r8, lr} stmiage ip!, {r1, r3, r8, lr}
stmgeia ip!, {r1, r3, r8, lr} stmiage ip!, {r1, r3, r8, lr}
bgt 2b bgt 2b
ldmeqfd sp!, {r8, pc} @ Now <64 bytes to go. ldmfdeq sp!, {r8, pc} @ Now <64 bytes to go.
/* /*
* No need to correct the count; we're only testing bits from now on * No need to correct the count; we're only testing bits from now on
*/ */
tst r2, #32 tst r2, #32
stmneia ip!, {r1, r3, r8, lr} stmiane ip!, {r1, r3, r8, lr}
stmneia ip!, {r1, r3, r8, lr} stmiane ip!, {r1, r3, r8, lr}
tst r2, #16 tst r2, #16
stmneia ip!, {r1, r3, r8, lr} stmiane ip!, {r1, r3, r8, lr}
ldmfd sp!, {r8, lr} ldmfd sp!, {r8, lr}
UNWIND( .fnend ) UNWIND( .fnend )
...@@ -87,22 +87,22 @@ UNWIND( .save {r4-r8, lr} ) ...@@ -87,22 +87,22 @@ UNWIND( .save {r4-r8, lr} )
rsb r8, r8, #32 rsb r8, r8, #32
sub r2, r2, r8 sub r2, r2, r8
movs r8, r8, lsl #(32 - 4) movs r8, r8, lsl #(32 - 4)
stmcsia ip!, {r4, r5, r6, r7} stmiacs ip!, {r4, r5, r6, r7}
stmmiia ip!, {r4, r5} stmiami ip!, {r4, r5}
tst r8, #(1 << 30) tst r8, #(1 << 30)
mov r8, r1 mov r8, r1
strne r1, [ip], #4 strne r1, [ip], #4
3: subs r2, r2, #64 3: subs r2, r2, #64
stmgeia ip!, {r1, r3-r8, lr} stmiage ip!, {r1, r3-r8, lr}
stmgeia ip!, {r1, r3-r8, lr} stmiage ip!, {r1, r3-r8, lr}
bgt 3b bgt 3b
ldmeqfd sp!, {r4-r8, pc} ldmfdeq sp!, {r4-r8, pc}
tst r2, #32 tst r2, #32
stmneia ip!, {r1, r3-r8, lr} stmiane ip!, {r1, r3-r8, lr}
tst r2, #16 tst r2, #16
stmneia ip!, {r4-r7} stmiane ip!, {r4-r7}
ldmfd sp!, {r4-r8, lr} ldmfd sp!, {r4-r8, lr}
UNWIND( .fnend ) UNWIND( .fnend )
...@@ -110,7 +110,7 @@ UNWIND( .fnend ) ...@@ -110,7 +110,7 @@ UNWIND( .fnend )
UNWIND( .fnstart ) UNWIND( .fnstart )
4: tst r2, #8 4: tst r2, #8
stmneia ip!, {r1, r3} stmiane ip!, {r1, r3}
tst r2, #4 tst r2, #4
strne r1, [ip], #4 strne r1, [ip], #4
/* /*
...@@ -118,17 +118,17 @@ UNWIND( .fnstart ) ...@@ -118,17 +118,17 @@ UNWIND( .fnstart )
* may have an unaligned pointer as well. * may have an unaligned pointer as well.
*/ */
5: tst r2, #2 5: tst r2, #2
strneb r1, [ip], #1 strbne r1, [ip], #1
strneb r1, [ip], #1 strbne r1, [ip], #1
tst r2, #1 tst r2, #1
strneb r1, [ip], #1 strbne r1, [ip], #1
ret lr ret lr
6: subs r2, r2, #4 @ 1 do we have enough 6: subs r2, r2, #4 @ 1 do we have enough
blt 5b @ 1 bytes to align with? blt 5b @ 1 bytes to align with?
cmp r3, #2 @ 1 cmp r3, #2 @ 1
strltb r1, [ip], #1 @ 1 strblt r1, [ip], #1 @ 1
strleb r1, [ip], #1 @ 1 strble r1, [ip], #1 @ 1
strb r1, [ip], #1 @ 1 strb r1, [ip], #1 @ 1
add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3)) add r2, r2, r3 @ 1 (r2 = r2 - (4 - r3))
b 1b b 1b
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
#ifndef __ARM_NEON__ #ifndef __ARM_NEON__
#error You should compile this file with '-mfloat-abi=softfp -mfpu=neon' #error You should compile this file with '-march=armv7-a -mfloat-abi=softfp -mfpu=neon'
#endif #endif
/* /*
......
...@@ -39,10 +39,6 @@ static void __iomem *sps_base_addr; ...@@ -39,10 +39,6 @@ static void __iomem *sps_base_addr;
static void __iomem *timer_base_addr; static void __iomem *timer_base_addr;
static int ncores; static int ncores;
static DEFINE_SPINLOCK(boot_lock);
void owl_secondary_startup(void);
static int s500_wakeup_secondary(unsigned int cpu) static int s500_wakeup_secondary(unsigned int cpu)
{ {
int ret; int ret;
...@@ -84,7 +80,6 @@ static int s500_wakeup_secondary(unsigned int cpu) ...@@ -84,7 +80,6 @@ static int s500_wakeup_secondary(unsigned int cpu)
static int s500_smp_boot_secondary(unsigned int cpu, struct task_struct *idle) static int s500_smp_boot_secondary(unsigned int cpu, struct task_struct *idle)
{ {
unsigned long timeout;
int ret; int ret;
ret = s500_wakeup_secondary(cpu); ret = s500_wakeup_secondary(cpu);
...@@ -93,21 +88,11 @@ static int s500_smp_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -93,21 +88,11 @@ static int s500_smp_boot_secondary(unsigned int cpu, struct task_struct *idle)
udelay(10); udelay(10);
spin_lock(&boot_lock);
smp_send_reschedule(cpu); smp_send_reschedule(cpu);
timeout = jiffies + (1 * HZ);
while (time_before(jiffies, timeout)) {
if (pen_release == -1)
break;
}
writel(0, timer_base_addr + OWL_CPU1_ADDR + (cpu - 1) * 4); writel(0, timer_base_addr + OWL_CPU1_ADDR + (cpu - 1) * 4);
writel(0, timer_base_addr + OWL_CPU1_FLAG + (cpu - 1) * 4); writel(0, timer_base_addr + OWL_CPU1_FLAG + (cpu - 1) * 4);
spin_unlock(&boot_lock);
return 0; return 0;
} }
......
...@@ -36,4 +36,4 @@ ENDPROC(exynos4_secondary_startup) ...@@ -36,4 +36,4 @@ ENDPROC(exynos4_secondary_startup)
.align 2 .align 2
1: .long . 1: .long .
.long pen_release .long exynos_pen_release
...@@ -28,6 +28,9 @@ ...@@ -28,6 +28,9 @@
extern void exynos4_secondary_startup(void); extern void exynos4_secondary_startup(void);
/* XXX exynos_pen_release is cargo culted code - DO NOT COPY XXX */
volatile int exynos_pen_release = -1;
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
static inline void cpu_leave_lowpower(u32 core_id) static inline void cpu_leave_lowpower(u32 core_id)
{ {
...@@ -57,7 +60,7 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious) ...@@ -57,7 +60,7 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
wfi(); wfi();
if (pen_release == core_id) { if (exynos_pen_release == core_id) {
/* /*
* OK, proper wakeup, we're done * OK, proper wakeup, we're done
*/ */
...@@ -228,15 +231,17 @@ void exynos_core_restart(u32 core_id) ...@@ -228,15 +231,17 @@ void exynos_core_restart(u32 core_id)
} }
/* /*
* Write pen_release in a way that is guaranteed to be visible to all * XXX CARGO CULTED CODE - DO NOT COPY XXX
* observers, irrespective of whether they're taking part in coherency *
* Write exynos_pen_release in a way that is guaranteed to be visible to
* all observers, irrespective of whether they're taking part in coherency
* or not. This is necessary for the hotplug code to work reliably. * or not. This is necessary for the hotplug code to work reliably.
*/ */
static void write_pen_release(int val) static void exynos_write_pen_release(int val)
{ {
pen_release = val; exynos_pen_release = val;
smp_wmb(); smp_wmb();
sync_cache_w(&pen_release); sync_cache_w(&exynos_pen_release);
} }
static DEFINE_SPINLOCK(boot_lock); static DEFINE_SPINLOCK(boot_lock);
...@@ -247,7 +252,7 @@ static void exynos_secondary_init(unsigned int cpu) ...@@ -247,7 +252,7 @@ static void exynos_secondary_init(unsigned int cpu)
* let the primary processor know we're out of the * let the primary processor know we're out of the
* pen, then head off into the C entry point * pen, then head off into the C entry point
*/ */
write_pen_release(-1); exynos_write_pen_release(-1);
/* /*
* Synchronise with the boot thread. * Synchronise with the boot thread.
...@@ -322,12 +327,12 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -322,12 +327,12 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
/* /*
* The secondary processor is waiting to be released from * The secondary processor is waiting to be released from
* the holding pen - release it, then wait for it to flag * the holding pen - release it, then wait for it to flag
* that it has been released by resetting pen_release. * that it has been released by resetting exynos_pen_release.
* *
* Note that "pen_release" is the hardware CPU core ID, whereas * Note that "exynos_pen_release" is the hardware CPU core ID, whereas
* "cpu" is Linux's internal ID. * "cpu" is Linux's internal ID.
*/ */
write_pen_release(core_id); exynos_write_pen_release(core_id);
if (!exynos_cpu_power_state(core_id)) { if (!exynos_cpu_power_state(core_id)) {
exynos_cpu_power_up(core_id); exynos_cpu_power_up(core_id);
...@@ -376,13 +381,13 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -376,13 +381,13 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
else else
arch_send_wakeup_ipi_mask(cpumask_of(cpu)); arch_send_wakeup_ipi_mask(cpumask_of(cpu));
if (pen_release == -1) if (exynos_pen_release == -1)
break; break;
udelay(10); udelay(10);
} }
if (pen_release != -1) if (exynos_pen_release != -1)
ret = -ETIMEDOUT; ret = -ETIMEDOUT;
/* /*
...@@ -392,7 +397,7 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -392,7 +397,7 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
fail: fail:
spin_unlock(&boot_lock); spin_unlock(&boot_lock);
return pen_release != -1 ? ret : 0; return exynos_pen_release != -1 ? ret : 0;
} }
static void __init exynos_smp_prepare_cpus(unsigned int max_cpus) static void __init exynos_smp_prepare_cpus(unsigned int max_cpus)
......
...@@ -42,6 +42,6 @@ ...@@ -42,6 +42,6 @@
moveq \irqstat, \irqstat, lsr #2 moveq \irqstat, \irqstat, lsr #2
addeq \irqnr, \irqnr, #2 addeq \irqnr, \irqnr, #2
tst \irqstat, #0x01 tst \irqstat, #0x01
addeqs \irqnr, \irqnr, #1 addseq \irqnr, \irqnr, #1
1001: 1001:
.endm .endm
...@@ -523,8 +523,10 @@ void omap_prm_reset_system(void) ...@@ -523,8 +523,10 @@ void omap_prm_reset_system(void)
prm_ll_data->reset_system(); prm_ll_data->reset_system();
while (1) while (1) {
cpu_relax(); cpu_relax();
wfe();
}
} }
/** /**
......
obj-$(CONFIG_SMP) += platsmp.o headsmp.o obj-$(CONFIG_SMP) += platsmp.o headsmp.o
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
/*
* Copyright (C) 2002 ARM Ltd.
* All Rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/smp.h>
#include <asm/cp15.h>
#include <asm/smp_plat.h>
static inline void cpu_enter_lowpower(void)
{
unsigned int v;
asm volatile(
" mcr p15, 0, %1, c7, c5, 0\n"
" mcr p15, 0, %1, c7, c10, 4\n"
/*
* Turn off coherency
*/
" mrc p15, 0, %0, c1, c0, 1\n"
" bic %0, %0, #0x20\n"
" mcr p15, 0, %0, c1, c0, 1\n"
" mrc p15, 0, %0, c1, c0, 0\n"
" bic %0, %0, %2\n"
" mcr p15, 0, %0, c1, c0, 0\n"
: "=&r" (v)
: "r" (0), "Ir" (CR_C)
: "cc");
}
static inline void cpu_leave_lowpower(void)
{
unsigned int v;
asm volatile( "mrc p15, 0, %0, c1, c0, 0\n"
" orr %0, %0, %1\n"
" mcr p15, 0, %0, c1, c0, 0\n"
" mrc p15, 0, %0, c1, c0, 1\n"
" orr %0, %0, #0x20\n"
" mcr p15, 0, %0, c1, c0, 1\n"
: "=&r" (v)
: "Ir" (CR_C)
: "cc");
}
static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
{
/*
* there is no power-control hardware on this platform, so all
* we can do is put the core into WFI; this is safe as the calling
* code will have already disabled interrupts
*/
for (;;) {
/*
* here's the WFI
*/
asm(".word 0xe320f003\n"
:
:
: "memory", "cc");
if (pen_release == cpu_logical_map(cpu)) {
/*
* OK, proper wakeup, we're done
*/
break;
}
/*
* Getting here, means that we have come out of WFI without
* having been woken up - this shouldn't happen
*
* Just note it happening - when we're woken, we can report
* its occurrence.
*/
(*spurious)++;
}
}
/*
* platform-specific code to shutdown a CPU
*
* Called with IRQs disabled
*/
void ox820_cpu_die(unsigned int cpu)
{
int spurious = 0;
/*
* we're ready for shutdown now, so do it
*/
cpu_enter_lowpower();
platform_do_lowpower(cpu, &spurious);
/*
* bring this CPU back into the world of cache
* coherency, and then restore interrupts
*/
cpu_leave_lowpower();
if (spurious)
pr_warn("CPU%u: %u spurious wakeup calls\n", cpu, spurious);
}
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include <asm/smp_scu.h> #include <asm/smp_scu.h>
extern void ox820_secondary_startup(void); extern void ox820_secondary_startup(void);
extern void ox820_cpu_die(unsigned int cpu);
static void __iomem *cpu_ctrl; static void __iomem *cpu_ctrl;
static void __iomem *gic_cpu_ctrl; static void __iomem *gic_cpu_ctrl;
...@@ -94,9 +93,6 @@ static void __init ox820_smp_prepare_cpus(unsigned int max_cpus) ...@@ -94,9 +93,6 @@ static void __init ox820_smp_prepare_cpus(unsigned int max_cpus)
static const struct smp_operations ox820_smp_ops __initconst = { static const struct smp_operations ox820_smp_ops __initconst = {
.smp_prepare_cpus = ox820_smp_prepare_cpus, .smp_prepare_cpus = ox820_smp_prepare_cpus,
.smp_boot_secondary = ox820_boot_secondary, .smp_boot_secondary = ox820_boot_secondary,
#ifdef CONFIG_HOTPLUG_CPU
.cpu_die = ox820_cpu_die,
#endif
}; };
CPU_METHOD_OF_DECLARE(ox820_smp, "oxsemi,ox820-smp", &ox820_smp_ops); CPU_METHOD_OF_DECLARE(ox820_smp, "oxsemi,ox820-smp", &ox820_smp_ops);
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include <asm/mach/time.h> #include <asm/mach/time.h>
#include <asm/exception.h> #include <asm/exception.h>
extern volatile int prima2_pen_release;
extern const struct smp_operations sirfsoc_smp_ops; extern const struct smp_operations sirfsoc_smp_ops;
extern void sirfsoc_secondary_startup(void); extern void sirfsoc_secondary_startup(void);
extern void sirfsoc_cpu_die(unsigned int cpu); extern void sirfsoc_cpu_die(unsigned int cpu);
......
...@@ -34,4 +34,4 @@ ENDPROC(sirfsoc_secondary_startup) ...@@ -34,4 +34,4 @@ ENDPROC(sirfsoc_secondary_startup)
.align .align
1: .long . 1: .long .
.long pen_release .long prima2_pen_release
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <linux/smp.h> #include <linux/smp.h>
#include <asm/smp_plat.h> #include <asm/smp_plat.h>
#include "common.h"
static inline void platform_do_lowpower(unsigned int cpu) static inline void platform_do_lowpower(unsigned int cpu)
{ {
...@@ -18,7 +19,7 @@ static inline void platform_do_lowpower(unsigned int cpu) ...@@ -18,7 +19,7 @@ static inline void platform_do_lowpower(unsigned int cpu)
for (;;) { for (;;) {
__asm__ __volatile__("dsb\n\t" "wfi\n\t" __asm__ __volatile__("dsb\n\t" "wfi\n\t"
: : : "memory"); : : : "memory");
if (pen_release == cpu_logical_map(cpu)) { if (prima2_pen_release == cpu_logical_map(cpu)) {
/* /*
* OK, proper wakeup, we're done * OK, proper wakeup, we're done
*/ */
......
...@@ -24,13 +24,16 @@ static void __iomem *clk_base; ...@@ -24,13 +24,16 @@ static void __iomem *clk_base;
static DEFINE_SPINLOCK(boot_lock); static DEFINE_SPINLOCK(boot_lock);
/* XXX prima2_pen_release is cargo culted code - DO NOT COPY XXX */
volatile int prima2_pen_release = -1;
static void sirfsoc_secondary_init(unsigned int cpu) static void sirfsoc_secondary_init(unsigned int cpu)
{ {
/* /*
* let the primary processor know we're out of the * let the primary processor know we're out of the
* pen, then head off into the C entry point * pen, then head off into the C entry point
*/ */
pen_release = -1; prima2_pen_release = -1;
smp_wmb(); smp_wmb();
/* /*
...@@ -80,13 +83,13 @@ static int sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -80,13 +83,13 @@ static int sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle)
/* /*
* The secondary processor is waiting to be released from * The secondary processor is waiting to be released from
* the holding pen - release it, then wait for it to flag * the holding pen - release it, then wait for it to flag
* that it has been released by resetting pen_release. * that it has been released by resetting prima2_pen_release.
* *
* Note that "pen_release" is the hardware CPU ID, whereas * Note that "prima2_pen_release" is the hardware CPU ID, whereas
* "cpu" is Linux's internal ID. * "cpu" is Linux's internal ID.
*/ */
pen_release = cpu_logical_map(cpu); prima2_pen_release = cpu_logical_map(cpu);
sync_cache_w(&pen_release); sync_cache_w(&prima2_pen_release);
/* /*
* Send the secondary CPU SEV, thereby causing the boot monitor to read * Send the secondary CPU SEV, thereby causing the boot monitor to read
...@@ -97,7 +100,7 @@ static int sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -97,7 +100,7 @@ static int sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle)
timeout = jiffies + (1 * HZ); timeout = jiffies + (1 * HZ);
while (time_before(jiffies, timeout)) { while (time_before(jiffies, timeout)) {
smp_rmb(); smp_rmb();
if (pen_release == -1) if (prima2_pen_release == -1)
break; break;
udelay(10); udelay(10);
...@@ -109,7 +112,7 @@ static int sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -109,7 +112,7 @@ static int sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle)
*/ */
spin_unlock(&boot_lock); spin_unlock(&boot_lock);
return pen_release != -1 ? -ENOSYS : 0; return prima2_pen_release != -1 ? -ENOSYS : 0;
} }
const struct smp_operations sirfsoc_smp_ops __initconst = { const struct smp_operations sirfsoc_smp_ops __initconst = {
......
...@@ -46,8 +46,6 @@ ...@@ -46,8 +46,6 @@
extern void secondary_startup_arm(void); extern void secondary_startup_arm(void);
static DEFINE_SPINLOCK(boot_lock);
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
static void qcom_cpu_die(unsigned int cpu) static void qcom_cpu_die(unsigned int cpu)
{ {
...@@ -55,15 +53,6 @@ static void qcom_cpu_die(unsigned int cpu) ...@@ -55,15 +53,6 @@ static void qcom_cpu_die(unsigned int cpu)
} }
#endif #endif
static void qcom_secondary_init(unsigned int cpu)
{
/*
* Synchronise with the boot thread.
*/
spin_lock(&boot_lock);
spin_unlock(&boot_lock);
}
static int scss_release_secondary(unsigned int cpu) static int scss_release_secondary(unsigned int cpu)
{ {
struct device_node *node; struct device_node *node;
...@@ -280,12 +269,6 @@ static int qcom_boot_secondary(unsigned int cpu, int (*func)(unsigned int)) ...@@ -280,12 +269,6 @@ static int qcom_boot_secondary(unsigned int cpu, int (*func)(unsigned int))
per_cpu(cold_boot_done, cpu) = true; per_cpu(cold_boot_done, cpu) = true;
} }
/*
* set synchronisation state between this boot processor
* and the secondary one
*/
spin_lock(&boot_lock);
/* /*
* Send the secondary CPU a soft interrupt, thereby causing * Send the secondary CPU a soft interrupt, thereby causing
* the boot monitor to read the system wide flags register, * the boot monitor to read the system wide flags register,
...@@ -293,12 +276,6 @@ static int qcom_boot_secondary(unsigned int cpu, int (*func)(unsigned int)) ...@@ -293,12 +276,6 @@ static int qcom_boot_secondary(unsigned int cpu, int (*func)(unsigned int))
*/ */
arch_send_wakeup_ipi_mask(cpumask_of(cpu)); arch_send_wakeup_ipi_mask(cpumask_of(cpu));
/*
* now the secondary core is starting up let it run its
* calibrations, then wait for it to finish
*/
spin_unlock(&boot_lock);
return ret; return ret;
} }
...@@ -334,7 +311,6 @@ static void __init qcom_smp_prepare_cpus(unsigned int max_cpus) ...@@ -334,7 +311,6 @@ static void __init qcom_smp_prepare_cpus(unsigned int max_cpus)
static const struct smp_operations smp_msm8660_ops __initconst = { static const struct smp_operations smp_msm8660_ops __initconst = {
.smp_prepare_cpus = qcom_smp_prepare_cpus, .smp_prepare_cpus = qcom_smp_prepare_cpus,
.smp_secondary_init = qcom_secondary_init,
.smp_boot_secondary = msm8660_boot_secondary, .smp_boot_secondary = msm8660_boot_secondary,
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
.cpu_die = qcom_cpu_die, .cpu_die = qcom_cpu_die,
...@@ -344,7 +320,6 @@ CPU_METHOD_OF_DECLARE(qcom_smp, "qcom,gcc-msm8660", &smp_msm8660_ops); ...@@ -344,7 +320,6 @@ CPU_METHOD_OF_DECLARE(qcom_smp, "qcom,gcc-msm8660", &smp_msm8660_ops);
static const struct smp_operations qcom_smp_kpssv1_ops __initconst = { static const struct smp_operations qcom_smp_kpssv1_ops __initconst = {
.smp_prepare_cpus = qcom_smp_prepare_cpus, .smp_prepare_cpus = qcom_smp_prepare_cpus,
.smp_secondary_init = qcom_secondary_init,
.smp_boot_secondary = kpssv1_boot_secondary, .smp_boot_secondary = kpssv1_boot_secondary,
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
.cpu_die = qcom_cpu_die, .cpu_die = qcom_cpu_die,
...@@ -354,7 +329,6 @@ CPU_METHOD_OF_DECLARE(qcom_smp_kpssv1, "qcom,kpss-acc-v1", &qcom_smp_kpssv1_ops) ...@@ -354,7 +329,6 @@ CPU_METHOD_OF_DECLARE(qcom_smp_kpssv1, "qcom,kpss-acc-v1", &qcom_smp_kpssv1_ops)
static const struct smp_operations qcom_smp_kpssv2_ops __initconst = { static const struct smp_operations qcom_smp_kpssv2_ops __initconst = {
.smp_prepare_cpus = qcom_smp_prepare_cpus, .smp_prepare_cpus = qcom_smp_prepare_cpus,
.smp_secondary_init = qcom_secondary_init,
.smp_boot_secondary = kpssv2_boot_secondary, .smp_boot_secondary = kpssv2_boot_secondary,
#ifdef CONFIG_HOTPLUG_CPU #ifdef CONFIG_HOTPLUG_CPU
.cpu_die = qcom_cpu_die, .cpu_die = qcom_cpu_die,
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
#include <asm/mach/time.h> #include <asm/mach/time.h>
extern volatile int spear_pen_release;
extern void spear13xx_timer_init(void); extern void spear13xx_timer_init(void);
extern void spear3xx_timer_init(void); extern void spear3xx_timer_init(void);
extern struct pl022_ssp_controller pl022_plat_data; extern struct pl022_ssp_controller pl022_plat_data;
......
...@@ -43,5 +43,5 @@ pen: ldr r7, [r6] ...@@ -43,5 +43,5 @@ pen: ldr r7, [r6]
.align .align
1: .long . 1: .long .
.long pen_release .long spear_pen_release
ENDPROC(spear13xx_secondary_startup) ENDPROC(spear13xx_secondary_startup)
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#include <asm/cp15.h> #include <asm/cp15.h>
#include <asm/smp_plat.h> #include <asm/smp_plat.h>
#include "generic.h"
static inline void cpu_enter_lowpower(void) static inline void cpu_enter_lowpower(void)
{ {
unsigned int v; unsigned int v;
...@@ -57,7 +59,7 @@ static inline void spear13xx_do_lowpower(unsigned int cpu, int *spurious) ...@@ -57,7 +59,7 @@ static inline void spear13xx_do_lowpower(unsigned int cpu, int *spurious)
for (;;) { for (;;) {
wfi(); wfi();
if (pen_release == cpu) { if (spear_pen_release == cpu) {
/* /*
* OK, proper wakeup, we're done * OK, proper wakeup, we're done
*/ */
......
...@@ -20,16 +20,21 @@ ...@@ -20,16 +20,21 @@
#include <mach/spear.h> #include <mach/spear.h>
#include "generic.h" #include "generic.h"
/* XXX spear_pen_release is cargo culted code - DO NOT COPY XXX */
volatile int spear_pen_release = -1;
/* /*
* Write pen_release in a way that is guaranteed to be visible to all * XXX CARGO CULTED CODE - DO NOT COPY XXX
* observers, irrespective of whether they're taking part in coherency *
* Write spear_pen_release in a way that is guaranteed to be visible to
* all observers, irrespective of whether they're taking part in coherency
* or not. This is necessary for the hotplug code to work reliably. * or not. This is necessary for the hotplug code to work reliably.
*/ */
static void write_pen_release(int val) static void spear_write_pen_release(int val)
{ {
pen_release = val; spear_pen_release = val;
smp_wmb(); smp_wmb();
sync_cache_w(&pen_release); sync_cache_w(&spear_pen_release);
} }
static DEFINE_SPINLOCK(boot_lock); static DEFINE_SPINLOCK(boot_lock);
...@@ -42,7 +47,7 @@ static void spear13xx_secondary_init(unsigned int cpu) ...@@ -42,7 +47,7 @@ static void spear13xx_secondary_init(unsigned int cpu)
* let the primary processor know we're out of the * let the primary processor know we're out of the
* pen, then head off into the C entry point * pen, then head off into the C entry point
*/ */
write_pen_release(-1); spear_write_pen_release(-1);
/* /*
* Synchronise with the boot thread. * Synchronise with the boot thread.
...@@ -64,17 +69,17 @@ static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -64,17 +69,17 @@ static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle)
/* /*
* The secondary processor is waiting to be released from * The secondary processor is waiting to be released from
* the holding pen - release it, then wait for it to flag * the holding pen - release it, then wait for it to flag
* that it has been released by resetting pen_release. * that it has been released by resetting spear_pen_release.
* *
* Note that "pen_release" is the hardware CPU ID, whereas * Note that "spear_pen_release" is the hardware CPU ID, whereas
* "cpu" is Linux's internal ID. * "cpu" is Linux's internal ID.
*/ */
write_pen_release(cpu); spear_write_pen_release(cpu);
timeout = jiffies + (1 * HZ); timeout = jiffies + (1 * HZ);
while (time_before(jiffies, timeout)) { while (time_before(jiffies, timeout)) {
smp_rmb(); smp_rmb();
if (pen_release == -1) if (spear_pen_release == -1)
break; break;
udelay(10); udelay(10);
...@@ -86,7 +91,7 @@ static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle) ...@@ -86,7 +91,7 @@ static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle)
*/ */
spin_unlock(&boot_lock); spin_unlock(&boot_lock);
return pen_release != -1 ? -ENOSYS : 0; return spear_pen_release != -1 ? -ENOSYS : 0;
} }
/* /*
......
...@@ -172,7 +172,7 @@ after_errata: ...@@ -172,7 +172,7 @@ after_errata:
mov32 r5, TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET mov32 r5, TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET
mov r0, #CPU_NOT_RESETTABLE mov r0, #CPU_NOT_RESETTABLE
cmp r10, #0 cmp r10, #0
strneb r0, [r5, #__tegra20_cpu1_resettable_status_offset] strbne r0, [r5, #__tegra20_cpu1_resettable_status_offset]
1: 1:
#endif #endif
......
...@@ -215,8 +215,8 @@ v6_dma_inv_range: ...@@ -215,8 +215,8 @@ v6_dma_inv_range:
#endif #endif
tst r1, #D_CACHE_LINE_SIZE - 1 tst r1, #D_CACHE_LINE_SIZE - 1
#ifdef CONFIG_DMA_CACHE_RWFO #ifdef CONFIG_DMA_CACHE_RWFO
ldrneb r2, [r1, #-1] @ read for ownership ldrbne r2, [r1, #-1] @ read for ownership
strneb r2, [r1, #-1] @ write for ownership strbne r2, [r1, #-1] @ write for ownership
#endif #endif
bic r1, r1, #D_CACHE_LINE_SIZE - 1 bic r1, r1, #D_CACHE_LINE_SIZE - 1
#ifdef HARVARD_CACHE #ifdef HARVARD_CACHE
...@@ -284,8 +284,8 @@ ENTRY(v6_dma_flush_range) ...@@ -284,8 +284,8 @@ ENTRY(v6_dma_flush_range)
add r0, r0, #D_CACHE_LINE_SIZE add r0, r0, #D_CACHE_LINE_SIZE
cmp r0, r1 cmp r0, r1
#ifdef CONFIG_DMA_CACHE_RWFO #ifdef CONFIG_DMA_CACHE_RWFO
ldrlob r2, [r0] @ read for ownership ldrblo r2, [r0] @ read for ownership
strlob r2, [r0] @ write for ownership strblo r2, [r0] @ write for ownership
#endif #endif
blo 1b blo 1b
mov r0, #0 mov r0, #0
......
...@@ -45,6 +45,7 @@ static void mc_copy_user_page(void *from, void *to) ...@@ -45,6 +45,7 @@ static void mc_copy_user_page(void *from, void *to)
int tmp; int tmp;
asm volatile ("\ asm volatile ("\
.syntax unified\n\
ldmia %0!, {r2, r3, ip, lr} @ 4\n\ ldmia %0!, {r2, r3, ip, lr} @ 4\n\
1: mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\ 1: mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\
stmia %1!, {r2, r3, ip, lr} @ 4\n\ stmia %1!, {r2, r3, ip, lr} @ 4\n\
...@@ -56,7 +57,7 @@ static void mc_copy_user_page(void *from, void *to) ...@@ -56,7 +57,7 @@ static void mc_copy_user_page(void *from, void *to)
ldmia %0!, {r2, r3, ip, lr} @ 4\n\ ldmia %0!, {r2, r3, ip, lr} @ 4\n\
subs %2, %2, #1 @ 1\n\ subs %2, %2, #1 @ 1\n\
stmia %1!, {r2, r3, ip, lr} @ 4\n\ stmia %1!, {r2, r3, ip, lr} @ 4\n\
ldmneia %0!, {r2, r3, ip, lr} @ 4\n\ ldmiane %0!, {r2, r3, ip, lr} @ 4\n\
bne 1b @ " bne 1b @ "
: "+&r" (from), "+&r" (to), "=&r" (tmp) : "+&r" (from), "+&r" (to), "=&r" (tmp)
: "2" (PAGE_SIZE / 64) : "2" (PAGE_SIZE / 64)
......
...@@ -27,6 +27,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom) ...@@ -27,6 +27,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom)
int tmp; int tmp;
asm volatile ("\ asm volatile ("\
.syntax unified\n\
ldmia %1!, {r3, r4, ip, lr} @ 4\n\ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
1: mcr p15, 0, %0, c7, c6, 1 @ 1 invalidate D line\n\ 1: mcr p15, 0, %0, c7, c6, 1 @ 1 invalidate D line\n\
stmia %0!, {r3, r4, ip, lr} @ 4\n\ stmia %0!, {r3, r4, ip, lr} @ 4\n\
...@@ -38,7 +39,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom) ...@@ -38,7 +39,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom)
ldmia %1!, {r3, r4, ip, lr} @ 4\n\ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
subs %2, %2, #1 @ 1\n\ subs %2, %2, #1 @ 1\n\
stmia %0!, {r3, r4, ip, lr} @ 4\n\ stmia %0!, {r3, r4, ip, lr} @ 4\n\
ldmneia %1!, {r3, r4, ip, lr} @ 4\n\ ldmiane %1!, {r3, r4, ip, lr} @ 4\n\
bne 1b @ 1\n\ bne 1b @ 1\n\
mcr p15, 0, %1, c7, c10, 4 @ 1 drain WB" mcr p15, 0, %1, c7, c10, 4 @ 1 drain WB"
: "+&r" (kto), "+&r" (kfrom), "=&r" (tmp) : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
......
...@@ -25,6 +25,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom) ...@@ -25,6 +25,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom)
int tmp; int tmp;
asm volatile ("\ asm volatile ("\
.syntax unified\n\
ldmia %1!, {r3, r4, ip, lr} @ 4\n\ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
1: stmia %0!, {r3, r4, ip, lr} @ 4\n\ 1: stmia %0!, {r3, r4, ip, lr} @ 4\n\
ldmia %1!, {r3, r4, ip, lr} @ 4+1\n\ ldmia %1!, {r3, r4, ip, lr} @ 4+1\n\
...@@ -34,7 +35,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom) ...@@ -34,7 +35,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom)
ldmia %1!, {r3, r4, ip, lr} @ 4\n\ ldmia %1!, {r3, r4, ip, lr} @ 4\n\
subs %2, %2, #1 @ 1\n\ subs %2, %2, #1 @ 1\n\
stmia %0!, {r3, r4, ip, lr} @ 4\n\ stmia %0!, {r3, r4, ip, lr} @ 4\n\
ldmneia %1!, {r3, r4, ip, lr} @ 4\n\ ldmiane %1!, {r3, r4, ip, lr} @ 4\n\
bne 1b @ 1\n\ bne 1b @ 1\n\
mcr p15, 0, %2, c7, c7, 0 @ flush ID cache" mcr p15, 0, %2, c7, c7, 0 @ flush ID cache"
: "+&r" (kto), "+&r" (kfrom), "=&r" (tmp) : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
......
...@@ -2279,7 +2279,7 @@ EXPORT_SYMBOL_GPL(arm_iommu_attach_device); ...@@ -2279,7 +2279,7 @@ EXPORT_SYMBOL_GPL(arm_iommu_attach_device);
* @dev: valid struct device pointer * @dev: valid struct device pointer
* *
* Detaches the provided device from a previously attached map. * Detaches the provided device from a previously attached map.
* This voids the dma operations (dma_map_ops pointer) * This overwrites the dma_ops pointer with appropriate non-IOMMU ops.
*/ */
void arm_iommu_detach_device(struct device *dev) void arm_iommu_detach_device(struct device *dev)
{ {
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <asm/cputype.h> #include <asm/cputype.h>
#include <asm/idmap.h> #include <asm/idmap.h>
#include <asm/hwcap.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/sections.h> #include <asm/sections.h>
...@@ -110,6 +111,7 @@ static int __init init_static_idmap(void) ...@@ -110,6 +111,7 @@ static int __init init_static_idmap(void)
__idmap_text_end, 0); __idmap_text_end, 0);
/* Flush L1 for the hardware to see this page table content */ /* Flush L1 for the hardware to see this page table content */
if (!(elf_hwcap & HWCAP_LPAE))
flush_cache_louis(); flush_cache_louis();
return 0; return 0;
......
...@@ -282,15 +282,12 @@ void __init arm_memblock_init(const struct machine_desc *mdesc) ...@@ -282,15 +282,12 @@ void __init arm_memblock_init(const struct machine_desc *mdesc)
void __init bootmem_init(void) void __init bootmem_init(void)
{ {
unsigned long min, max_low, max_high;
memblock_allow_resize(); memblock_allow_resize();
max_low = max_high = 0;
find_limits(&min, &max_low, &max_high); find_limits(&min_low_pfn, &max_low_pfn, &max_pfn);
early_memtest((phys_addr_t)min << PAGE_SHIFT, early_memtest((phys_addr_t)min_low_pfn << PAGE_SHIFT,
(phys_addr_t)max_low << PAGE_SHIFT); (phys_addr_t)max_low_pfn << PAGE_SHIFT);
/* /*
* Sparsemem tries to allocate bootmem in memory_present(), * Sparsemem tries to allocate bootmem in memory_present(),
...@@ -308,16 +305,7 @@ void __init bootmem_init(void) ...@@ -308,16 +305,7 @@ void __init bootmem_init(void)
* the sparse mem_map arrays initialized by sparse_init() * the sparse mem_map arrays initialized by sparse_init()
* for memmap_init_zone(), otherwise all PFNs are invalid. * for memmap_init_zone(), otherwise all PFNs are invalid.
*/ */
zone_sizes_init(min, max_low, max_high); zone_sizes_init(min_low_pfn, max_low_pfn, max_pfn);
/*
* This doesn't seem to be used by the Linux memory manager any
* more, but is used by ll_rw_block. If we can get rid of it, we
* also get rid of some of the stuff above as well.
*/
min_low_pfn = min;
max_low_pfn = max_low;
max_pfn = max_high;
} }
/* /*
...@@ -498,55 +486,6 @@ void __init mem_init(void) ...@@ -498,55 +486,6 @@ void __init mem_init(void)
mem_init_print_info(NULL); mem_init_print_info(NULL);
#define MLK(b, t) b, t, ((t) - (b)) >> 10
#define MLM(b, t) b, t, ((t) - (b)) >> 20
#define MLK_ROUNDUP(b, t) b, t, DIV_ROUND_UP(((t) - (b)), SZ_1K)
pr_notice("Virtual kernel memory layout:\n"
" vector : 0x%08lx - 0x%08lx (%4ld kB)\n"
#ifdef CONFIG_HAVE_TCM
" DTCM : 0x%08lx - 0x%08lx (%4ld kB)\n"
" ITCM : 0x%08lx - 0x%08lx (%4ld kB)\n"
#endif
" fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n"
" vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n"
" lowmem : 0x%08lx - 0x%08lx (%4ld MB)\n"
#ifdef CONFIG_HIGHMEM
" pkmap : 0x%08lx - 0x%08lx (%4ld MB)\n"
#endif
#ifdef CONFIG_MODULES
" modules : 0x%08lx - 0x%08lx (%4ld MB)\n"
#endif
" .text : 0x%p" " - 0x%p" " (%4td kB)\n"
" .init : 0x%p" " - 0x%p" " (%4td kB)\n"
" .data : 0x%p" " - 0x%p" " (%4td kB)\n"
" .bss : 0x%p" " - 0x%p" " (%4td kB)\n",
MLK(VECTORS_BASE, VECTORS_BASE + PAGE_SIZE),
#ifdef CONFIG_HAVE_TCM
MLK(DTCM_OFFSET, (unsigned long) dtcm_end),
MLK(ITCM_OFFSET, (unsigned long) itcm_end),
#endif
MLK(FIXADDR_START, FIXADDR_END),
MLM(VMALLOC_START, VMALLOC_END),
MLM(PAGE_OFFSET, (unsigned long)high_memory),
#ifdef CONFIG_HIGHMEM
MLM(PKMAP_BASE, (PKMAP_BASE) + (LAST_PKMAP) *
(PAGE_SIZE)),
#endif
#ifdef CONFIG_MODULES
MLM(MODULES_VADDR, MODULES_END),
#endif
MLK_ROUNDUP(_text, _etext),
MLK_ROUNDUP(__init_begin, __init_end),
MLK_ROUNDUP(_sdata, _edata),
MLK_ROUNDUP(__bss_start, __bss_stop));
#undef MLK
#undef MLM
#undef MLK_ROUNDUP
/* /*
* Check boundaries twice: Some fundamental inconsistencies can * Check boundaries twice: Some fundamental inconsistencies can
* be detected at build time already. * be detected at build time already.
......
...@@ -165,7 +165,7 @@ static int __init pmsav8_setup_ram(unsigned int number, phys_addr_t start,phys_a ...@@ -165,7 +165,7 @@ static int __init pmsav8_setup_ram(unsigned int number, phys_addr_t start,phys_a
return -EINVAL; return -EINVAL;
bar = start; bar = start;
lar = (end - 1) & ~(PMSAv8_MINALIGN - 1);; lar = (end - 1) & ~(PMSAv8_MINALIGN - 1);
bar |= PMSAv8_AP_PL1RW_PL0RW | PMSAv8_RGN_SHARED; bar |= PMSAv8_AP_PL1RW_PL0RW | PMSAv8_RGN_SHARED;
lar |= PMSAv8_LAR_IDX(PMSAv8_RGN_NORMAL) | PMSAv8_LAR_EN; lar |= PMSAv8_LAR_IDX(PMSAv8_RGN_NORMAL) | PMSAv8_LAR_EN;
...@@ -181,7 +181,7 @@ static int __init pmsav8_setup_io(unsigned int number, phys_addr_t start,phys_ad ...@@ -181,7 +181,7 @@ static int __init pmsav8_setup_io(unsigned int number, phys_addr_t start,phys_ad
return -EINVAL; return -EINVAL;
bar = start; bar = start;
lar = (end - 1) & ~(PMSAv8_MINALIGN - 1);; lar = (end - 1) & ~(PMSAv8_MINALIGN - 1);
bar |= PMSAv8_AP_PL1RW_PL0RW | PMSAv8_RGN_SHARED | PMSAv8_BAR_XN; bar |= PMSAv8_AP_PL1RW_PL0RW | PMSAv8_RGN_SHARED | PMSAv8_BAR_XN;
lar |= PMSAv8_LAR_IDX(PMSAv8_RGN_DEVICE_nGnRnE) | PMSAv8_LAR_EN; lar |= PMSAv8_LAR_IDX(PMSAv8_RGN_DEVICE_nGnRnE) | PMSAv8_LAR_EN;
......
...@@ -139,6 +139,9 @@ __v7m_setup_cont: ...@@ -139,6 +139,9 @@ __v7m_setup_cont:
cpsie i cpsie i
svc #0 svc #0
1: cpsid i 1: cpsid i
ldr r0, =exc_ret
orr lr, lr, #EXC_RET_THREADMODE_PROCESSSTACK
str lr, [r0]
ldmia sp, {r0-r3, r12} ldmia sp, {r0-r3, r12}
str r5, [r12, #11 * 4] @ restore the original SVC vector entry str r5, [r12, #11 * 4] @ restore the original SVC vector entry
mov lr, r6 @ restore LR mov lr, r6 @ restore LR
...@@ -149,10 +152,10 @@ __v7m_setup_cont: ...@@ -149,10 +152,10 @@ __v7m_setup_cont:
@ Configure caches (if implemented) @ Configure caches (if implemented)
teq r8, #0 teq r8, #0
stmneia sp, {r0-r6, lr} @ v7m_invalidate_l1 touches r0-r6 stmiane sp, {r0-r6, lr} @ v7m_invalidate_l1 touches r0-r6
blne v7m_invalidate_l1 blne v7m_invalidate_l1
teq r8, #0 @ re-evalutae condition teq r8, #0 @ re-evalutae condition
ldmneia sp, {r0-r6, lr} ldmiane sp, {r0-r6, lr}
@ Configure the System Control Register to ensure 8-byte stack alignment @ Configure the System Control Register to ensure 8-byte stack alignment
@ Note the STKALIGN bit is either RW or RAO. @ Note the STKALIGN bit is either RW or RAO.
......
...@@ -26,19 +26,36 @@ ...@@ -26,19 +26,36 @@
#define to_amba_driver(d) container_of(d, struct amba_driver, drv) #define to_amba_driver(d) container_of(d, struct amba_driver, drv)
static const struct amba_id * /* called on periphid match and class 0x9 coresight device. */
amba_lookup(const struct amba_id *table, struct amba_device *dev) static int
amba_cs_uci_id_match(const struct amba_id *table, struct amba_device *dev)
{ {
int ret = 0; int ret = 0;
struct amba_cs_uci_id *uci;
uci = table->data;
/* no table data or zero mask - return match on periphid */
if (!uci || (uci->devarch_mask == 0))
return 1;
/* test against read devtype and masked devarch value */
ret = (dev->uci.devtype == uci->devtype) &&
((dev->uci.devarch & uci->devarch_mask) == uci->devarch);
return ret;
}
static const struct amba_id *
amba_lookup(const struct amba_id *table, struct amba_device *dev)
{
while (table->mask) { while (table->mask) {
ret = (dev->periphid & table->mask) == table->id; if (((dev->periphid & table->mask) == table->id) &&
if (ret) ((dev->cid != CORESIGHT_CID) ||
break; (amba_cs_uci_id_match(table, dev))))
return table;
table++; table++;
} }
return NULL;
return ret ? table : NULL;
} }
static int amba_match(struct device *dev, struct device_driver *drv) static int amba_match(struct device *dev, struct device_driver *drv)
...@@ -399,10 +416,22 @@ static int amba_device_try_add(struct amba_device *dev, struct resource *parent) ...@@ -399,10 +416,22 @@ static int amba_device_try_add(struct amba_device *dev, struct resource *parent)
cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) << cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) <<
(i * 8); (i * 8);
if (cid == CORESIGHT_CID) {
/* set the base to the start of the last 4k block */
void __iomem *csbase = tmp + size - 4096;
dev->uci.devarch =
readl(csbase + UCI_REG_DEVARCH_OFFSET);
dev->uci.devtype =
readl(csbase + UCI_REG_DEVTYPE_OFFSET) & 0xff;
}
amba_put_disable_pclk(dev); amba_put_disable_pclk(dev);
if (cid == AMBA_CID || cid == CORESIGHT_CID) if (cid == AMBA_CID || cid == CORESIGHT_CID) {
dev->periphid = pid; dev->periphid = pid;
dev->cid = cid;
}
if (!dev->periphid) if (!dev->periphid)
ret = -ENODEV; ret = -ENODEV;
......
...@@ -871,7 +871,7 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -871,7 +871,7 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id)
} }
pm_runtime_put(&adev->dev); pm_runtime_put(&adev->dev);
dev_info(dev, "%s initialized\n", (char *)id->data); dev_info(dev, "%s initialized\n", (char *)coresight_get_uci_data(id));
if (boot_enable) { if (boot_enable) {
coresight_enable(drvdata->csdev); coresight_enable(drvdata->csdev);
drvdata->boot_enable = true; drvdata->boot_enable = true;
...@@ -915,36 +915,18 @@ static const struct dev_pm_ops etm_dev_pm_ops = { ...@@ -915,36 +915,18 @@ static const struct dev_pm_ops etm_dev_pm_ops = {
}; };
static const struct amba_id etm_ids[] = { static const struct amba_id etm_ids[] = {
{ /* ETM 3.3 */ /* ETM 3.3 */
.id = 0x000bb921, CS_AMBA_ID_DATA(0x000bb921, "ETM 3.3"),
.mask = 0x000fffff, /* ETM 3.5 - Cortex-A5 */
.data = "ETM 3.3", CS_AMBA_ID_DATA(0x000bb955, "ETM 3.5"),
}, /* ETM 3.5 */
{ /* ETM 3.5 - Cortex-A5 */ CS_AMBA_ID_DATA(0x000bb956, "ETM 3.5"),
.id = 0x000bb955, /* PTM 1.0 */
.mask = 0x000fffff, CS_AMBA_ID_DATA(0x000bb950, "PTM 1.0"),
.data = "ETM 3.5", /* PTM 1.1 */
}, CS_AMBA_ID_DATA(0x000bb95f, "PTM 1.1"),
{ /* ETM 3.5 */ /* PTM 1.1 Qualcomm */
.id = 0x000bb956, CS_AMBA_ID_DATA(0x000b006f, "PTM 1.1"),
.mask = 0x000fffff,
.data = "ETM 3.5",
},
{ /* PTM 1.0 */
.id = 0x000bb950,
.mask = 0x000fffff,
.data = "PTM 1.0",
},
{ /* PTM 1.1 */
.id = 0x000bb95f,
.mask = 0x000fffff,
.data = "PTM 1.1",
},
{ /* PTM 1.1 Qualcomm */
.id = 0x000b006f,
.mask = 0x000fffff,
.data = "PTM 1.1",
},
{ 0, 0}, { 0, 0},
}; };
......
...@@ -1068,18 +1068,21 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -1068,18 +1068,21 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
return ret; return ret;
} }
#define ETM4x_AMBA_ID(pid) \ static struct amba_cs_uci_id uci_id_etm4[] = {
{ \ {
.id = pid, \ /* ETMv4 UCI data */
.mask = 0x000fffff, \ .devarch = 0x47704a13,
.devarch_mask = 0xfff0ffff,
.devtype = 0x00000013,
} }
};
static const struct amba_id etm4_ids[] = { static const struct amba_id etm4_ids[] = {
ETM4x_AMBA_ID(0x000bb95d), /* Cortex-A53 */ CS_AMBA_ID(0x000bb95d), /* Cortex-A53 */
ETM4x_AMBA_ID(0x000bb95e), /* Cortex-A57 */ CS_AMBA_ID(0x000bb95e), /* Cortex-A57 */
ETM4x_AMBA_ID(0x000bb95a), /* Cortex-A72 */ CS_AMBA_ID(0x000bb95a), /* Cortex-A72 */
ETM4x_AMBA_ID(0x000bb959), /* Cortex-A73 */ CS_AMBA_ID(0x000bb959), /* Cortex-A73 */
ETM4x_AMBA_ID(0x000bb9da), /* Cortex-A35 */ CS_AMBA_UCI_ID(0x000bb9da, uci_id_etm4), /* Cortex-A35 */
{}, {},
}; };
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#ifndef _CORESIGHT_PRIV_H #ifndef _CORESIGHT_PRIV_H
#define _CORESIGHT_PRIV_H #define _CORESIGHT_PRIV_H
#include <linux/amba/bus.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/coresight.h> #include <linux/coresight.h>
...@@ -160,4 +161,43 @@ static inline int etm_readl_cp14(u32 off, unsigned int *val) { return 0; } ...@@ -160,4 +161,43 @@ static inline int etm_readl_cp14(u32 off, unsigned int *val) { return 0; }
static inline int etm_writel_cp14(u32 off, u32 val) { return 0; } static inline int etm_writel_cp14(u32 off, u32 val) { return 0; }
#endif #endif
/*
* Macros and inline functions to handle CoreSight UCI data and driver
* private data in AMBA ID table entries, and extract data values.
*/
/* coresight AMBA ID, no UCI, no driver data: id table entry */
#define CS_AMBA_ID(pid) \
{ \
.id = pid, \
.mask = 0x000fffff, \
}
/* coresight AMBA ID, UCI with driver data only: id table entry. */
#define CS_AMBA_ID_DATA(pid, dval) \
{ \
.id = pid, \
.mask = 0x000fffff, \
.data = (void *)&(struct amba_cs_uci_id) \
{ \
.data = (void *)dval, \
} \
}
/* coresight AMBA ID, full UCI structure: id table entry. */
#define CS_AMBA_UCI_ID(pid, uci_ptr) \
{ \
.id = pid, \
.mask = 0x000fffff, \
.data = uci_ptr \
}
/* extract the data value from a UCI structure given amba_id pointer. */
static inline void *coresight_get_uci_data(const struct amba_id *id)
{
if (id->data)
return ((struct amba_cs_uci_id *)(id->data))->data;
return 0;
}
#endif #endif
...@@ -870,7 +870,7 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -870,7 +870,7 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id)
pm_runtime_put(&adev->dev); pm_runtime_put(&adev->dev);
dev_info(dev, "%s initialized\n", (char *)id->data); dev_info(dev, "%s initialized\n", (char *)coresight_get_uci_data(id));
return 0; return 0;
stm_unregister: stm_unregister:
...@@ -905,16 +905,8 @@ static const struct dev_pm_ops stm_dev_pm_ops = { ...@@ -905,16 +905,8 @@ static const struct dev_pm_ops stm_dev_pm_ops = {
}; };
static const struct amba_id stm_ids[] = { static const struct amba_id stm_ids[] = {
{ CS_AMBA_ID_DATA(0x000bb962, "STM32"),
.id = 0x000bb962, CS_AMBA_ID_DATA(0x000bb963, "STM500"),
.mask = 0x000fffff,
.data = "STM32",
},
{
.id = 0x000bb963,
.mask = 0x000fffff,
.data = "STM500",
},
{ 0, 0}, { 0, 0},
}; };
......
...@@ -443,7 +443,8 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -443,7 +443,8 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
desc.type = CORESIGHT_DEV_TYPE_SINK; desc.type = CORESIGHT_DEV_TYPE_SINK;
desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER; desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER;
desc.ops = &tmc_etr_cs_ops; desc.ops = &tmc_etr_cs_ops;
ret = tmc_etr_setup_caps(drvdata, devid, id->data); ret = tmc_etr_setup_caps(drvdata, devid,
coresight_get_uci_data(id));
if (ret) if (ret)
goto out; goto out;
break; break;
...@@ -475,26 +476,13 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id) ...@@ -475,26 +476,13 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
} }
static const struct amba_id tmc_ids[] = { static const struct amba_id tmc_ids[] = {
{ CS_AMBA_ID(0x000bb961),
.id = 0x000bb961,
.mask = 0x000fffff,
},
{
/* Coresight SoC 600 TMC-ETR/ETS */ /* Coresight SoC 600 TMC-ETR/ETS */
.id = 0x000bb9e8, CS_AMBA_ID_DATA(0x000bb9e8, (unsigned long)CORESIGHT_SOC_600_ETR_CAPS),
.mask = 0x000fffff,
.data = (void *)(unsigned long)CORESIGHT_SOC_600_ETR_CAPS,
},
{
/* Coresight SoC 600 TMC-ETB */ /* Coresight SoC 600 TMC-ETB */
.id = 0x000bb9e9, CS_AMBA_ID(0x000bb9e9),
.mask = 0x000fffff,
},
{
/* Coresight SoC 600 TMC-ETF */ /* Coresight SoC 600 TMC-ETF */
.id = 0x000bb9ea, CS_AMBA_ID(0x000bb9ea),
.mask = 0x000fffff,
},
{ 0, 0}, { 0, 0},
}; };
......
...@@ -25,6 +25,43 @@ ...@@ -25,6 +25,43 @@
#define AMBA_CID 0xb105f00d #define AMBA_CID 0xb105f00d
#define CORESIGHT_CID 0xb105900d #define CORESIGHT_CID 0xb105900d
/*
* CoreSight Architecture specification updates the ID specification
* for components on the AMBA bus. (ARM IHI 0029E)
*
* Bits 15:12 of the CID are the device class.
*
* Class 0xF remains for PrimeCell and legacy components. (AMBA_CID above)
* Class 0x9 defines the component as CoreSight (CORESIGHT_CID above)
* Class 0x0, 0x1, 0xB, 0xE define components that do not have driver support
* at present.
* Class 0x2-0x8,0xA and 0xD-0xD are presently reserved.
*
* Remaining CID bits stay as 0xb105-00d
*/
/**
* Class 0x9 components use additional values to form a Unique Component
* Identifier (UCI), where peripheral ID values are identical for different
* components. Passed to the amba bus code from the component driver via
* the amba_id->data pointer.
* @devarch : coresight devarch register value
* @devarch_mask: mask bits used for matching. 0 indicates UCI not used.
* @devtype : coresight device type value
* @data : additional driver data. As we have usurped the original
* pointer some devices may still need additional data
*/
struct amba_cs_uci_id {
unsigned int devarch;
unsigned int devarch_mask;
unsigned int devtype;
void *data;
};
/* define offsets for registers used by UCI */
#define UCI_REG_DEVTYPE_OFFSET 0xFCC
#define UCI_REG_DEVARCH_OFFSET 0xFBC
struct clk; struct clk;
struct amba_device { struct amba_device {
...@@ -32,6 +69,8 @@ struct amba_device { ...@@ -32,6 +69,8 @@ struct amba_device {
struct resource res; struct resource res;
struct clk *pclk; struct clk *pclk;
unsigned int periphid; unsigned int periphid;
unsigned int cid;
struct amba_cs_uci_id uci;
unsigned int irq[AMBA_NR_IRQS]; unsigned int irq[AMBA_NR_IRQS];
char *driver_override; char *driver_override;
}; };
......
...@@ -39,7 +39,7 @@ endif ...@@ -39,7 +39,7 @@ endif
ifeq ($(CONFIG_KERNEL_MODE_NEON),y) ifeq ($(CONFIG_KERNEL_MODE_NEON),y)
NEON_FLAGS := -ffreestanding NEON_FLAGS := -ffreestanding
ifeq ($(ARCH),arm) ifeq ($(ARCH),arm)
NEON_FLAGS += -mfloat-abi=softfp -mfpu=neon NEON_FLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon
endif endif
CFLAGS_recov_neon_inner.o += $(NEON_FLAGS) CFLAGS_recov_neon_inner.o += $(NEON_FLAGS)
ifeq ($(ARCH),arm64) ifeq ($(ARCH),arm64)
......
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