Merge branches 'fixes', 'misc' and 'smp-hotplug' into for-next
authorRussell King <rmk+kernel@armlinux.org.uk>
Fri, 15 Mar 2019 15:12:56 +0000 (15:12 +0000)
committerRussell King <rmk+kernel@armlinux.org.uk>
Fri, 15 Mar 2019 15:12:56 +0000 (15:12 +0000)
89 files changed:
Documentation/arm/kernel_mode_neon.txt
arch/arm/Kconfig
arch/arm/Kconfig-nommu
arch/arm/Makefile
arch/arm/boot/bootp/Makefile
arch/arm/boot/bootp/init.S
arch/arm/boot/compressed/Makefile
arch/arm/boot/compressed/ll_char_wr.S
arch/arm/include/asm/assembler.h
arch/arm/include/asm/barrier.h
arch/arm/include/asm/hardware/entry-macro-iomd.S
arch/arm/include/asm/pgtable.h
arch/arm/include/asm/processor.h
arch/arm/include/asm/smp.h
arch/arm/include/asm/smp_twd.h
arch/arm/include/asm/spinlock.h
arch/arm/include/asm/uaccess.h
arch/arm/include/asm/v7m.h
arch/arm/include/asm/vfpmacros.h
arch/arm/include/debug/tegra.S
arch/arm/kernel/debug.S
arch/arm/kernel/entry-armv.S
arch/arm/kernel/entry-common.S
arch/arm/kernel/entry-header.S
arch/arm/kernel/entry-v7m.S
arch/arm/kernel/hyp-stub.S
arch/arm/kernel/machine_kexec.c
arch/arm/kernel/smp.c
arch/arm/kernel/smp_twd.c
arch/arm/lib/Makefile
arch/arm/lib/bitops.h
arch/arm/lib/clear_user.S
arch/arm/lib/copy_from_user.S
arch/arm/lib/copy_page.S
arch/arm/lib/copy_template.S
arch/arm/lib/copy_to_user.S
arch/arm/lib/csumpartial.S
arch/arm/lib/csumpartialcopygeneric.S
arch/arm/lib/csumpartialcopyuser.S
arch/arm/lib/div64.S
arch/arm/lib/floppydma.S
arch/arm/lib/io-readsb.S
arch/arm/lib/io-readsl.S
arch/arm/lib/io-readsw-armv3.S
arch/arm/lib/io-readsw-armv4.S
arch/arm/lib/io-writesb.S
arch/arm/lib/io-writesl.S
arch/arm/lib/io-writesw-armv3.S
arch/arm/lib/io-writesw-armv4.S
arch/arm/lib/lib1funcs.S
arch/arm/lib/memcpy.S
arch/arm/lib/memmove.S
arch/arm/lib/memset.S
arch/arm/lib/xor-neon.c
arch/arm/mach-actions/platsmp.c
arch/arm/mach-exynos/headsmp.S
arch/arm/mach-exynos/platsmp.c
arch/arm/mach-ks8695/include/mach/entry-macro.S
arch/arm/mach-omap2/prm_common.c
arch/arm/mach-oxnas/Makefile
arch/arm/mach-oxnas/hotplug.c [deleted file]
arch/arm/mach-oxnas/platsmp.c
arch/arm/mach-prima2/common.h
arch/arm/mach-prima2/headsmp.S
arch/arm/mach-prima2/hotplug.c
arch/arm/mach-prima2/platsmp.c
arch/arm/mach-qcom/platsmp.c
arch/arm/mach-spear/generic.h
arch/arm/mach-spear/headsmp.S
arch/arm/mach-spear/hotplug.c
arch/arm/mach-spear/platsmp.c
arch/arm/mach-tegra/reset-handler.S
arch/arm/mm/cache-v6.S
arch/arm/mm/copypage-v4mc.c
arch/arm/mm/copypage-v4wb.c
arch/arm/mm/copypage-v4wt.c
arch/arm/mm/dma-mapping.c
arch/arm/mm/idmap.c
arch/arm/mm/init.c
arch/arm/mm/pmsa-v8.c
arch/arm/mm/proc-v7m.S
drivers/amba/bus.c
drivers/hwtracing/coresight/coresight-etm3x.c
drivers/hwtracing/coresight/coresight-etm4x.c
drivers/hwtracing/coresight/coresight-priv.h
drivers/hwtracing/coresight/coresight-stm.c
drivers/hwtracing/coresight/coresight-tmc.c
include/linux/amba/bus.h
lib/raid6/Makefile

index 5254527..b9e060c 100644 (file)
@@ -6,7 +6,7 @@ TL;DR summary
 * Use only NEON instructions, or VFP instructions that don't rely on support
   code
 * 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
   NEON code
 * 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.
 Therefore, the recommended and only supported way of using NEON/VFP in the
 kernel is by adhering to the following rules:
 * 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
   into the unit containing the NEON code from a compilation unit which is *not*
   built with the GCC flag '-mfpu=neon' set.
index 26524b7..813d042 100644 (file)
@@ -1304,7 +1304,7 @@ config SCHED_SMT
 config HAVE_ARM_SCU
        bool
        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
        bool "Architected timer support"
@@ -1316,7 +1316,6 @@ config HAVE_ARM_ARCH_TIMER
 
 config HAVE_ARM_TWD
        bool
-       select TIMER_OF if OF
        help
          This options enables support for the ARM timer and watchdog unit
 
index 1168a03..36c80d3 100644 (file)
@@ -20,10 +20,12 @@ config DRAM_SIZE
 
 config FLASH_MEM_BASE
        hex 'FLASH Base Address' if SET_MEM_PARAM
+       depends on CPU_ARM740T || CPU_ARM946E || CPU_ARM940T
        default 0x00400000
 
 config FLASH_SIZE
        hex 'FLASH Size' if SET_MEM_PARAM
+       depends on CPU_ARM740T || CPU_ARM946E || CPU_ARM940T
        default 0x00400000
 
 config PROCESSOR_ID
index 9db3c58..ac0187c 100644 (file)
@@ -10,7 +10,7 @@
 #
 # 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)
 LDFLAGS_vmlinux        += --be8
 KBUILD_LDFLAGS_MODULE  += --be8
index 83e1a07..981a8d0 100644 (file)
@@ -8,7 +8,7 @@
 
 GCOV_PROFILE   := n
 
-LDFLAGS_bootp  :=-p --no-undefined -X \
+LDFLAGS_bootp  := --no-undefined -X \
                 --defsym initrd_phys=$(INITRD_PHYS) \
                 --defsym params_phys=$(PARAMS_PHYS) -T
 AFLAGS_initrd.o :=-DINITRD=\"$(INITRD)\"
index 78b5080..142927e 100644 (file)
@@ -44,7 +44,7 @@ _start:               add     lr, pc, #-0x8           @ lr = current load addr
  */
                movne   r10, #0                 @ terminator
                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.
index 6114ae6..9219389 100644 (file)
@@ -132,8 +132,6 @@ endif
 ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
 LDFLAGS_vmlinux += --be8
 endif
-# ?
-LDFLAGS_vmlinux += -p
 # Report unresolved symbol references
 LDFLAGS_vmlinux += --no-undefined
 # Delete all temporary local symbols
index 8517c86..b1dcdb9 100644 (file)
@@ -75,7 +75,7 @@ Lrow4bpplp:
        tst     r1, #7                          @ avoid using r7 directly after
        str     r7, [r0, -r5]!
        subne   r1, r1, #1
-       ldrneb  r7, [r6, r1]
+       ldrbne  r7, [r6, r1]
        bne     Lrow4bpplp
        ldmfd   sp!, {r4 - r7, pc}
 
@@ -103,7 +103,7 @@ Lrow8bpplp:
        sub     r0, r0, r5                      @ avoid ip
        stmia   r0, {r4, ip}
        subne   r1, r1, #1
-       ldrneb  r7, [r6, r1]
+       ldrbne  r7, [r6, r1]
        bne     Lrow8bpplp
        ldmfd   sp!, {r4 - r7, pc}
 
index 28a48e0..b59921a 100644 (file)
@@ -376,9 +376,9 @@ THUMB(      orr     \reg , \reg , #PSR_T_BIT        )
        .macro  usraccoff, instr, reg, ptr, inc, off, cond, abort, t=TUSER()
 9999:
        .if     \inc == 1
-       \instr\cond\()b\()\t\().w \reg, [\ptr, #\off]
+       \instr\()b\t\cond\().w \reg, [\ptr, #\off]
        .elseif \inc == 4
-       \instr\cond\()\t\().w \reg, [\ptr, #\off]
+       \instr\t\cond\().w \reg, [\ptr, #\off]
        .else
        .error  "Unsupported inc macro argument"
        .endif
@@ -417,9 +417,9 @@ THUMB(      orr     \reg , \reg , #PSR_T_BIT        )
        .rept   \rept
 9999:
        .if     \inc == 1
-       \instr\cond\()b\()\t \reg, [\ptr], #\inc
+       \instr\()b\t\cond \reg, [\ptr], #\inc
        .elseif \inc == 4
-       \instr\cond\()\t \reg, [\ptr], #\inc
+       \instr\t\cond \reg, [\ptr], #\inc
        .else
        .error  "Unsupported inc macro argument"
        .endif
@@ -460,7 +460,7 @@ THUMB(      orr     \reg , \reg , #PSR_T_BIT        )
        .macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req
 #ifndef CONFIG_CPU_USE_DOMAINS
        adds    \tmp, \addr, #\size - 1
-       sbcccs  \tmp, \tmp, \limit
+       sbcscc  \tmp, \tmp, \limit
        bcs     \bad
 #ifdef CONFIG_CPU_SPECTRE
        movcs   \addr, #0
@@ -474,7 +474,7 @@ THUMB(      orr     \reg , \reg , #PSR_T_BIT        )
        sub     \tmp, \limit, #1
        subs    \tmp, \tmp, \addr       @ tmp = limit - 1 - addr
        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
        csdb
 #endif
index 69772e7..83ae97c 100644 (file)
@@ -11,6 +11,8 @@
 #define sev()  __asm__ __volatile__ ("sev" : : : "memory")
 #define wfe()  __asm__ __volatile__ ("wfe" : : : "memory")
 #define wfi()  __asm__ __volatile__ ("wfi" : : : "memory")
+#else
+#define wfe()  do { } while (0)
 #endif
 
 #if __LINUX_ARM_ARCH__ >= 7
index 8c215ac..f769273 100644 (file)
                ldr     \tmp, =irq_prio_h
                teq     \irqstat, #0
 #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
                teqeq   \irqstat, #0
                bne     2406f
 #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
                teqeq   \irqstat, #0
 #ifdef IOMD_IRQREQC
-               ldreqb  \irqstat, [\base, #IOMD_IRQREQC]
+               ldrbeq  \irqstat, [\base, #IOMD_IRQREQC]
                addeq   \tmp, \tmp, #256                @ irq_prio_l table size
                teqeq   \irqstat, #0
 #endif
 #ifdef IOMD_IRQREQD
-               ldreqb  \irqstat, [\base, #IOMD_IRQREQD]
+               ldrbeq  \irqstat, [\base, #IOMD_IRQREQD]
                addeq   \tmp, \tmp, #256                @ irq_prio_lc table size
                teqeq   \irqstat, #0
 #endif
-2406:          ldrneb  \irqnr, [\tmp, \irqstat]        @ get IRQ number
+2406:          ldrbne  \irqnr, [\tmp, \irqstat]        @ get IRQ number
                .endm
 
 /*
index a757401..48ce1b1 100644 (file)
@@ -125,6 +125,9 @@ extern pgprot_t             pgprot_s2_device;
 #define pgprot_stronglyordered(prot) \
        __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
 #define pgprot_dmacoherent(prot) \
        __pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE | L_PTE_XN)
index 120f4c9..57fe73e 100644 (file)
@@ -89,7 +89,11 @@ extern void release_thread(struct task_struct *);
 unsigned long get_wchan(struct task_struct *p);
 
 #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
 #define cpu_relax()                    barrier()
 #endif
index 709a559..451ae68 100644 (file)
@@ -67,7 +67,6 @@ struct secondary_data {
        void *stack;
 };
 extern struct secondary_data secondary_data;
-extern volatile int pen_release;
 extern void secondary_startup(void);
 extern void secondary_startup_arm(void);
 
index 312784e..c729d21 100644 (file)
 #define TWD_TIMER_CONTROL_PERIODIC     (1 << 1)
 #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
index 099c78f..8f009e7 100644 (file)
@@ -210,11 +210,12 @@ static inline void arch_read_lock(arch_rwlock_t *rw)
 
        prefetchw(&rw->lock);
        __asm__ __volatile__(
+"      .syntax unified\n"
 "1:    ldrex   %0, [%2]\n"
 "      adds    %0, %0, #1\n"
 "      strexpl %1, %0, [%2]\n"
        WFE("mi")
-"      rsbpls  %0, %1, #0\n"
+"      rsbspl  %0, %1, #0\n"
 "      bmi     1b"
        : "=&r" (tmp), "=&r" (tmp2)
        : "r" (&rw->lock)
index 42aa4a2..89a2868 100644 (file)
@@ -86,7 +86,8 @@ static inline void set_fs(mm_segment_t fs)
 #define __range_ok(addr, size) ({ \
        unsigned long flag, roksum; \
        __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" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit) \
                : "cc"); \
index 187ccf6..2cb00d1 100644 (file)
@@ -49,7 +49,7 @@
  * (0 -> msp; 1 -> psp). Bits [1:0] are fixed to 0b01.
  */
 #define EXC_RET_STACK_MASK                     0x00000004
-#define EXC_RET_THREADMODE_PROCESSSTACK                0xfffffffd
+#define EXC_RET_THREADMODE_PROCESSSTACK                (3 << 2)
 
 /* Cache related definitions */
 
index ef5dfed..628c336 100644 (file)
        ldr     \tmp, =elf_hwcap                    @ may not have MVFR regs
        ldr     \tmp, [\tmp, #0]
        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
 #else
        VFPFMRX \tmp, MVFR0                         @ Media and VFP Feature Register 0
        and     \tmp, \tmp, #MVFR0_A_SIMD_MASK      @ A_SIMD field
        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
 #endif
 #endif
        ldr     \tmp, =elf_hwcap                    @ may not have MVFR regs
        ldr     \tmp, [\tmp, #0]
        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
 #else
        VFPFMRX \tmp, MVFR0                         @ Media and VFP Feature Register 0
        and     \tmp, \tmp, #MVFR0_A_SIMD_MASK      @ A_SIMD field
        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
 #endif
 #endif
index 3bc8059..4a5a645 100644 (file)
 
                .macro  senduart, rd, rx
                cmp     \rx, #0
-               strneb  \rd, [\rx, #UART_TX << UART_SHIFT]
+               strbne  \rd, [\rx, #UART_TX << UART_SHIFT]
 1001:
                .endm
 
index b795dc2..b9f94e0 100644 (file)
@@ -86,7 +86,7 @@ hexbuf_rel:   .long   hexbuf_addr - .
 ENTRY(printascii)
                addruart_current r3, r1, r2
 1:             teq     r0, #0
-               ldrneb  r1, [r0], #1
+               ldrbne  r1, [r0], #1
                teqne   r1, #0
                reteq   lr
 2:             teq     r1, #'\n'
index e85a3af..ce4aea5 100644 (file)
@@ -636,7 +636,7 @@ call_fpe:
        @ Test if we need to give access to iWMMXt coprocessors
        ldr     r5, [r10, #TI_FLAGS]
        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
 #endif
  ARM(  add     pc, pc, r8, lsr #6      )
@@ -872,7 +872,7 @@ __kuser_cmpxchg64:                          @ 0xffff0f60
        smp_dmb arm
 1:     ldrexd  r0, r1, [r2]                    @ load current val
        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
        teqeq   r3, #1                          @ success?
        beq     1b                              @ if no then retry
@@ -896,8 +896,8 @@ __kuser_cmpxchg64:                          @ 0xffff0f60
        ldmia   r1, {r6, lr}                    @ load new val
 1:     ldmia   r2, {r0, r1}                    @ load current val
        eors    r3, r0, r4                      @ compare with oldval (1)
-       eoreqs  r3, r1, r5                      @ compare with oldval (2)
-2:     stmeqia r2, {r6, lr}                    @ store newval if eq
+       eorseq  r3, r1, r5                      @ compare with oldval (2)
+2:     stmiaeq r2, {r6, lr}                    @ store newval if eq
        rsbs    r0, r3, #0                      @ set return val and C flag
        ldmfd   sp!, {r4, r5, r6, pc}
 
@@ -911,7 +911,7 @@ kuser_cmpxchg64_fixup:
        mov     r7, #0xffff0fff
        sub     r7, r7, #(0xffff0fff - (0xffff0f60 + (1b - __kuser_cmpxchg64)))
        subs    r8, r4, r7
-       rsbcss  r8, r8, #(2b - 1b)
+       rsbscs  r8, r8, #(2b - 1b)
        strcs   r7, [sp, #S_PC]
 #if __LINUX_ARM_ARCH__ < 6
        bcc     kuser_cmpxchg32_fixup
@@ -969,7 +969,7 @@ kuser_cmpxchg32_fixup:
        mov     r7, #0xffff0fff
        sub     r7, r7, #(0xffff0fff - (0xffff0fc0 + (1b - __kuser_cmpxchg)))
        subs    r8, r4, r7
-       rsbcss  r8, r8, #(2b - 1b)
+       rsbscs  r8, r8, #(2b - 1b)
        strcs   r7, [sp, #S_PC]
        ret     lr
        .previous
index 0465d65..f7649ad 100644 (file)
@@ -373,7 +373,7 @@ sys_syscall:
                movhs   scno, #0
                csdb
 #endif
-               stmloia sp, {r5, r6}            @ shuffle args
+               stmialo sp, {r5, r6}            @ shuffle args
                movlo   r0, r1
                movlo   r1, r2
                movlo   r2, r3
index 7734248..32051ec 100644 (file)
          */
        .macro  v7m_exception_slow_exit ret_r0
        cpsid   i
-       ldr     lr, =EXC_RET_THREADMODE_PROCESSSTACK
+       ldr     lr, =exc_ret
+       ldr     lr, [lr]
 
        @ read original r12, sp, lr, pc and xPSR
        add     r12, sp, #S_IP
        badr    lr, \ret                        @ return address
        .if     \reload
        add     r1, sp, #S_R0 + S_OFF           @ pointer to regs
-       ldmccia r1, {r0 - r6}                   @ reload r0-r6
-       stmccia sp, {r4, r5}                    @ update stack arguments
+       ldmiacc r1, {r0 - r6}                   @ reload r0-r6
+       stmiacc sp, {r4, r5}                    @ update stack arguments
        .endif
        ldrcc   pc, [\table, \tmp, lsl #2]      @ call sys_* routine
 #else
        badr    lr, \ret                        @ return address
        .if     \reload
        add     r1, sp, #S_R0 + S_OFF           @ pointer to regs
-       ldmccia r1, {r0 - r6}                   @ reload r0-r6
-       stmccia sp, {r4, r5}                    @ update stack arguments
+       ldmiacc r1, {r0 - r6}                   @ reload r0-r6
+       stmiacc sp, {r4, r5}                    @ update stack arguments
        .endif
        ldrcc   pc, [\table, \nr, lsl #2]       @ call sys_* routine
 #endif
index abcf478..19d2dcd 100644 (file)
@@ -146,3 +146,7 @@ ENTRY(vector_table)
        .rept   CONFIG_CPU_V7M_NUM_IRQ
        .long   __irq_entry             @ External Interrupts
        .endr
+       .align  2
+       .globl  exc_ret
+exc_ret:
+       .space  4
index 60146e3..82a9428 100644 (file)
@@ -180,8 +180,8 @@ ARM_BE8(orr r7, r7, #(1 << 25))     @ HSCTLR.EE
        @ Check whether GICv3 system registers are available
        mrc     p15, 0, r7, c0, c1, 1   @ ID_PFR1
        ubfx    r7, r7, #28, #4
-       cmp     r7, #1
-       bne     2f
+       teq     r7, #0
+       beq     2f
 
        @ Enable system register accesses
        mrc     p15, 4, r7, c12, c9, 5  @ ICC_HSRE
index dd2eb5f..76300f3 100644 (file)
@@ -91,8 +91,11 @@ void machine_crash_nonpanic_core(void *unused)
 
        set_cpu_online(smp_processor_id(), false);
        atomic_dec(&waiting_for_crash_ipi);
-       while (1)
+
+       while (1) {
                cpu_relax();
+               wfe();
+       }
 }
 
 void crash_smp_send_stop(void)
index 1d6f5ea..facd424 100644 (file)
  */
 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 {
        IPI_WAKEUP,
        IPI_TIMER,
@@ -604,8 +598,10 @@ static void ipi_cpu_stop(unsigned int cpu)
        local_fiq_disable();
        local_irq_disable();
 
-       while (1)
+       while (1) {
                cpu_relax();
+               wfe();
+       }
 }
 
 static DEFINE_PER_CPU(struct completion *, cpu_completion);
index b30eafe..3cdc399 100644 (file)
@@ -100,8 +100,6 @@ static void twd_timer_stop(void)
        disable_percpu_irq(clk->irq);
 }
 
-#ifdef CONFIG_COMMON_CLK
-
 /*
  * Updates clockevent frequency when the cpu frequency changes.
  * Called on the cpu that is changing frequency with interrupts disabled.
@@ -143,54 +141,6 @@ static int twd_clk_init(void)
 }
 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)
 {
        unsigned long count;
@@ -366,21 +316,6 @@ out_free:
        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)
 {
        int err;
@@ -406,4 +341,3 @@ out:
 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_11mp, "arm,arm11mp-twd-timer", twd_local_timer_of_register);
-#endif
index ad25fd1..0bff017 100644 (file)
@@ -39,7 +39,7 @@ $(obj)/csumpartialcopy.o:     $(obj)/csumpartialcopygeneric.S
 $(obj)/csumpartialcopyuser.o:  $(obj)/csumpartialcopygeneric.S
 
 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)
   obj-$(CONFIG_XOR_BLOCKS)     += xor-neon.o
 endif
index 93cddab..95bd359 100644 (file)
@@ -7,7 +7,7 @@
 ENTRY( \name           )
 UNWIND(        .fnstart        )
        ands    ip, r1, #3
-       strneb  r1, [ip]                @ assert word-aligned
+       strbne  r1, [ip]                @ assert word-aligned
        mov     r2, #1
        and     r3, r0, #31             @ Get bit offset
        mov     r0, r0, lsr #5
@@ -32,7 +32,7 @@ ENDPROC(\name         )
 ENTRY( \name           )
 UNWIND(        .fnstart        )
        ands    ip, r1, #3
-       strneb  r1, [ip]                @ assert word-aligned
+       strbne  r1, [ip]                @ assert word-aligned
        mov     r2, #1
        and     r3, r0, #31             @ Get bit offset
        mov     r0, r0, lsr #5
@@ -62,7 +62,7 @@ ENDPROC(\name         )
 ENTRY( \name           )
 UNWIND(        .fnstart        )
        ands    ip, r1, #3
-       strneb  r1, [ip]                @ assert word-aligned
+       strbne  r1, [ip]                @ assert word-aligned
        and     r2, r0, #31
        mov     r0, r0, lsr #5
        mov     r3, #1
@@ -89,7 +89,7 @@ ENDPROC(\name         )
 ENTRY( \name           )
 UNWIND(        .fnstart        )
        ands    ip, r1, #3
-       strneb  r1, [ip]                @ assert word-aligned
+       strbne  r1, [ip]                @ assert word-aligned
        and     r3, r0, #31
        mov     r0, r0, lsr #5
        save_and_disable_irqs ip
index e936352..55946e3 100644 (file)
@@ -44,7 +44,7 @@ UNWIND(.save {r1, lr})
                strusr  r2, r0, 1, ne, rept=2
                tst     r1, #1                  @ x1 x0 x1 x0 x1 x0 x1
                it      ne                      @ explicit IT needed for the label
-USER(          strnebt r2, [r0])
+USER(          strbtne r2, [r0])
                mov     r0, #0
                ldmfd   sp!, {r1, pc}
 UNWIND(.fnend)
index 0d4c189..6a3419e 100644 (file)
@@ -91,7 +91,7 @@
        .endm
 
        .macro str1b ptr reg cond=al abort
-       str\cond\()b \reg, [\ptr], #1
+       strb\cond \reg, [\ptr], #1
        .endm
 
        .macro enter reg1 reg2
index 6ee2f67..b84ce17 100644 (file)
@@ -39,9 +39,9 @@ ENTRY(copy_page)
        .endr
                subs    r2, r2, #1                      @       1
                stmia   r0!, {r3, r4, ip, lr}           @       4
-               ldmgtia r1!, {r3, r4, ip, lr}           @       4
+               ldmiagt r1!, {r3, r4, ip, lr}           @       4
                bgt     1b                              @       1
-       PLD(    ldmeqia r1!, {r3, r4, ip, lr}   )
+       PLD(    ldmiaeq r1!, {r3, r4, ip, lr}   )
        PLD(    beq     2b                      )
                ldmfd   sp!, {r4, pc}                   @       3
 ENDPROC(copy_page)
index 652e4d9..a11f2c2 100644 (file)
@@ -99,7 +99,7 @@
 
        CALGN(  ands    ip, r0, #31             )
        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(  adr     r4, 6f                  )
        CALGN(  subs    r2, r2, r3              )  @ C gets set
 
        CALGN(  ands    ip, r0, #31             )
        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(  bcc     15f                     )
 
                orr     r9, r9, ip, lspush #\push
                mov     ip, ip, lspull #\pull
                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
        PLD(    cmn     r2, #96                 )
        PLD(    bge     13b                     )
index 97a6ff4..c7d0809 100644 (file)
@@ -49,7 +49,7 @@
        .endm
 
        .macro ldr1b ptr reg cond=al abort
-       ldr\cond\()b \reg, [\ptr], #1
+       ldrb\cond \reg, [\ptr], #1
        .endm
 
 #ifdef CONFIG_CPU_USE_DOMAINS
index 984e0f2..bd84e2d 100644 (file)
@@ -40,9 +40,9 @@ td3   .req    lr
                /* we must have at least one byte. */
                tst     buf, #1                 @ odd address?
                movne   sum, sum, ror #8
-               ldrneb  td0, [buf], #1
+               ldrbne  td0, [buf], #1
                subne   len, len, #1
-               adcnes  sum, sum, td0, put_byte_1
+               adcsne  sum, sum, td0, put_byte_1
 
 .Lless4:               tst     len, #6
                beq     .Lless8_byte
@@ -68,8 +68,8 @@ td3   .req    lr
                bne     .Lless8_wordlp
 
 .Lless8_byte:  tst     len, #1                 @ odd number of bytes
-               ldrneb  td0, [buf], #1          @ include last byte
-               adcnes  sum, sum, td0, put_byte_0       @ update checksum
+               ldrbne  td0, [buf], #1          @ include last byte
+               adcsne  sum, sum, td0, put_byte_0       @ update checksum
 
 .Ldone:                adc     r0, sum, #0             @ collect up the last carry
                ldr     td0, [sp], #4
@@ -78,17 +78,17 @@ td3 .req    lr
                ldr     pc, [sp], #4            @ return
 
 .Lnot_aligned: tst     buf, #1                 @ odd address
-               ldrneb  td0, [buf], #1          @ make even
+               ldrbne  td0, [buf], #1          @ make even
                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?
 #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
 #else
-               ldrneb  td0, [buf], #1
-               ldrneb  ip, [buf], #1
+               ldrbne  td0, [buf], #1
+               ldrbne  ip, [buf], #1
                subne   len, len, #2
 #ifndef __ARMEB__
                orrne   td0, td0, ip, lsl #8
@@ -96,7 +96,7 @@ td3   .req    lr
                orrne   td0, ip, td0, lsl #8
 #endif
 #endif
-               adcnes  sum, sum, td0           @ update checksum
+               adcsne  sum, sum, td0           @ update checksum
                ret     lr
 
 ENTRY(csum_partial)
index 10b4590..08e1775 100644 (file)
@@ -148,9 +148,9 @@ FN_ENTRY
                strb    r5, [dst], #1
                mov     r5, r4, get_byte_2
 .Lexit:                tst     len, #1
-               strneb  r5, [dst], #1
+               strbne  r5, [dst], #1
                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
index b83fdc0..f4716d9 100644 (file)
@@ -95,7 +95,7 @@
                add     r2, r2, r1
                mov     r0, #0                  @ zero the buffer
 9002:          teq     r2, r1
-               strneb  r0, [r1], #1
+               strbne  r0, [r1], #1
                bne     9002b
                load_regs
                .popsection
index a9eafe4..4d80f69 100644 (file)
@@ -88,8 +88,8 @@ UNWIND(.fnstart)
        @ Break out early if dividend reaches 0.
 2:     cmp     xh, yl
        orrcs   yh, yh, ip
-       subcss  xh, xh, yl
-       movnes  ip, ip, lsr #1
+       subscs  xh, xh, yl
+       movsne  ip, ip, lsr #1
        mov     yl, yl, lsr #1
        bne     2b
 
index 617150b..de68d3b 100644 (file)
@@ -14,8 +14,8 @@
                .global floppy_fiqin_end
 ENTRY(floppy_fiqin_start)
                subs    r9, r9, #1
-               ldrgtb  r12, [r11, #-4]
-               ldrleb  r12, [r11], #0
+               ldrbgt  r12, [r11, #-4]
+               ldrble  r12, [r11], #0
                strb    r12, [r10], #1
                subs    pc, lr, #4
 floppy_fiqin_end:
@@ -23,10 +23,10 @@ floppy_fiqin_end:
                .global floppy_fiqout_end
 ENTRY(floppy_fiqout_start)
                subs    r9, r9, #1
-               ldrgeb  r12, [r10], #1
+               ldrbge  r12, [r10], #1
                movlt   r12, #0
-               strleb  r12, [r11], #0
-               subles  pc, lr, #4
+               strble  r12, [r11], #0
+               subsle  pc, lr, #4
                strb    r12, [r11, #-4]
                subs    pc, lr, #4
 floppy_fiqout_end:
index c31b2f3..91038a0 100644 (file)
                cmp     ip, #2
                ldrb    r3, [r0]
                strb    r3, [r1], #1
-               ldrgeb  r3, [r0]
-               strgeb  r3, [r1], #1
-               ldrgtb  r3, [r0]
-               strgtb  r3, [r1], #1
+               ldrbge  r3, [r0]
+               strbge  r3, [r1], #1
+               ldrbgt  r3, [r0]
+               strbgt  r3, [r1], #1
                subs    r2, r2, ip
                bne     .Linsb_aligned
 
@@ -72,7 +72,7 @@ ENTRY(__raw_readsb)
                bpl     .Linsb_16_lp
 
                tst     r2, #15
-               ldmeqfd sp!, {r4 - r6, pc}
+               ldmfdeq sp!, {r4 - r6, pc}
 
 .Linsb_no_16:  tst     r2, #8
                beq     .Linsb_no_8
@@ -109,15 +109,15 @@ ENTRY(__raw_readsb)
                str     r3, [r1], #4
 
 .Linsb_no_4:   ands    r2, r2, #3
-               ldmeqfd sp!, {r4 - r6, pc}
+               ldmfdeq sp!, {r4 - r6, pc}
 
                cmp     r2, #2
                ldrb    r3, [r0]
                strb    r3, [r1], #1
-               ldrgeb  r3, [r0]
-               strgeb  r3, [r1], #1
-               ldrgtb  r3, [r0]
-               strgtb  r3, [r1]
+               ldrbge  r3, [r0]
+               strbge  r3, [r1], #1
+               ldrbgt  r3, [r0]
+               strbgt  r3, [r1]
 
                ldmfd   sp!, {r4 - r6, pc}
 ENDPROC(__raw_readsb)
index 2ed86fa..f2e2064 100644 (file)
@@ -30,7 +30,7 @@ ENTRY(__raw_readsl)
 2:             movs    r2, r2, lsl #31
                ldrcs   r3, [r0, #0]
                ldrcs   ip, [r0, #0]
-               stmcsia r1!, {r3, ip}
+               stmiacs r1!, {r3, ip}
                ldrne   r3, [r0, #0]
                strne   r3, [r1, #0]
                ret     lr
index 413da99..8b25b69 100644 (file)
@@ -68,7 +68,7 @@ ENTRY(__raw_readsw)
                bpl     .Linsw_8_lp
 
                tst     r2, #7
-               ldmeqfd sp!, {r4, r5, r6, pc}
+               ldmfdeq sp!, {r4, r5, r6, pc}
 
 .Lno_insw_8:   tst     r2, #4
                beq     .Lno_insw_4
@@ -97,9 +97,9 @@ ENTRY(__raw_readsw)
 
 .Lno_insw_2:   tst     r2, #1
                ldrne   r3, [r0]
-               strneb  r3, [r1], #1
+               strbne  r3, [r1], #1
                movne   r3, r3, lsr #8
-               strneb  r3, [r1]
+               strbne  r3, [r1]
 
                ldmfd   sp!, {r4, r5, r6, pc}
 
index d9a45e9..5efdd66 100644 (file)
@@ -76,8 +76,8 @@ ENTRY(__raw_readsw)
                pack    r3, r3, ip
                str     r3, [r1], #4
 
-.Lno_insw_2:   ldrneh  r3, [r0]
-               strneh  r3, [r1]
+.Lno_insw_2:   ldrhne  r3, [r0]
+               strhne  r3, [r1]
 
                ldmfd   sp!, {r4, r5, pc}
 
@@ -94,7 +94,7 @@ ENTRY(__raw_readsw)
 #endif
 
 .Linsw_noalign:        stmfd   sp!, {r4, lr}
-               ldrccb  ip, [r1, #-1]!
+               ldrbcc  ip, [r1, #-1]!
                bcc     1f
 
                ldrh    ip, [r0]
@@ -121,11 +121,11 @@ ENTRY(__raw_readsw)
 
 3:             tst     r2, #1
                strb    ip, [r1], #1
-               ldrneh  ip, [r0]
+               ldrhne  ip, [r0]
    _BE_ONLY_(  movne   ip, ip, ror #8          )
-               strneb  ip, [r1], #1
+               strbne  ip, [r1], #1
    _LE_ONLY_(  movne   ip, ip, lsr #8          )
    _BE_ONLY_(  movne   ip, ip, lsr #24         )
-               strneb  ip, [r1]
+               strbne  ip, [r1]
                ldmfd   sp!, {r4, pc}
 ENDPROC(__raw_readsw)
index a46bbc9..7d2881a 100644 (file)
                cmp     ip, #2
                ldrb    r3, [r1], #1
                strb    r3, [r0]
-               ldrgeb  r3, [r1], #1
-               strgeb  r3, [r0]
-               ldrgtb  r3, [r1], #1
-               strgtb  r3, [r0]
+               ldrbge  r3, [r1], #1
+               strbge  r3, [r0]
+               ldrbgt  r3, [r1], #1
+               strbgt  r3, [r0]
                subs    r2, r2, ip
                bne     .Loutsb_aligned
 
@@ -64,7 +64,7 @@ ENTRY(__raw_writesb)
                bpl     .Loutsb_16_lp
 
                tst     r2, #15
-               ldmeqfd sp!, {r4, r5, pc}
+               ldmfdeq sp!, {r4, r5, pc}
 
 .Loutsb_no_16: tst     r2, #8
                beq     .Loutsb_no_8
@@ -80,15 +80,15 @@ ENTRY(__raw_writesb)
                outword r3
 
 .Loutsb_no_4:  ands    r2, r2, #3
-               ldmeqfd sp!, {r4, r5, pc}
+               ldmfdeq sp!, {r4, r5, pc}
 
                cmp     r2, #2
                ldrb    r3, [r1], #1
                strb    r3, [r0]
-               ldrgeb  r3, [r1], #1
-               strgeb  r3, [r0]
-               ldrgtb  r3, [r1]
-               strgtb  r3, [r0]
+               ldrbge  r3, [r1], #1
+               strbge  r3, [r0]
+               ldrbgt  r3, [r1]
+               strbgt  r3, [r0]
 
                ldmfd   sp!, {r4, r5, pc}
 ENDPROC(__raw_writesb)
index 4ea2435..7596ac0 100644 (file)
@@ -28,7 +28,7 @@ ENTRY(__raw_writesl)
                bpl     1b
                ldmfd   sp!, {r4, lr}
 2:             movs    r2, r2, lsl #31
-               ldmcsia r1!, {r3, ip}
+               ldmiacs r1!, {r3, ip}
                strcs   r3, [r0, #0]
                ldrne   r3, [r1, #0]
                strcs   ip, [r0, #0]
index 121789e..cb94b9b 100644 (file)
@@ -79,7 +79,7 @@ ENTRY(__raw_writesw)
                bpl     .Loutsw_8_lp
 
                tst     r2, #7
-               ldmeqfd sp!, {r4, r5, r6, pc}
+               ldmfdeq sp!, {r4, r5, r6, pc}
 
 .Lno_outsw_8:  tst     r2, #4
                beq     .Lno_outsw_4
index 269f90c..e6645b2 100644 (file)
@@ -61,8 +61,8 @@ ENTRY(__raw_writesw)
                ldr     r3, [r1], #4
                outword r3
 
-.Lno_outsw_2:  ldrneh  r3, [r1]
-               strneh  r3, [r0]
+.Lno_outsw_2:  ldrhne  r3, [r1]
+               strhne  r3, [r0]
 
                ldmfd   sp!, {r4, r5, pc}
 
@@ -95,6 +95,6 @@ ENTRY(__raw_writesw)
 
                tst     r2, #1
 3:             movne   ip, r3, lsr #8
-               strneh  ip, [r0]
+               strhne  ip, [r0]
                ret     lr
 ENDPROC(__raw_writesw)
index 9397b2e..c23f9d9 100644 (file)
@@ -96,7 +96,7 @@ Boston, MA 02111-1307, USA.  */
        subhs   \dividend, \dividend, \divisor, lsr #3
        orrhs   \result,   \result,   \curbit,  lsr #3
        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
        bne     1b
 
@@ -182,7 +182,7 @@ Boston, MA 02111-1307, USA.  */
        subhs   \dividend, \dividend, \divisor, lsr #3
        cmp     \dividend, #1
        mov     \divisor, \divisor, lsr #4
-       subges  \order, \order, #4
+       subsge  \order, \order, #4
        bge     1b
 
        tst     \order, #3
index 64111bd..4a6997b 100644 (file)
@@ -30,7 +30,7 @@
        .endm
 
        .macro ldr1b ptr reg cond=al abort
-       ldr\cond\()b \reg, [\ptr], #1
+       ldrb\cond \reg, [\ptr], #1
        .endm
 
        .macro str1w ptr reg abort
@@ -42,7 +42,7 @@
        .endm
 
        .macro str1b ptr reg cond=al abort
-       str\cond\()b \reg, [\ptr], #1
+       strb\cond \reg, [\ptr], #1
        .endm
 
        .macro enter reg1 reg2
index 69a9d47..d70304c 100644 (file)
@@ -59,7 +59,7 @@ ENTRY(memmove)
                blt     5f
 
        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(  adr     r4, 6f                  )
        CALGN(  subs    r2, r2, ip              )  @ C is set here
@@ -114,20 +114,20 @@ ENTRY(memmove)
        UNWIND( .save   {r0, r4, lr}            ) @ still in first stmfd block
 
 8:             movs    r2, r2, lsl #31
-               ldrneb  r3, [r1, #-1]!
-               ldrcsb  r4, [r1, #-1]!
-               ldrcsb  ip, [r1, #-1]
-               strneb  r3, [r0, #-1]!
-               strcsb  r4, [r0, #-1]!
-               strcsb  ip, [r0, #-1]
+               ldrbne  r3, [r1, #-1]!
+               ldrbcs  r4, [r1, #-1]!
+               ldrbcs  ip, [r1, #-1]
+               strbne  r3, [r0, #-1]!
+               strbcs  r4, [r0, #-1]!
+               strbcs  ip, [r0, #-1]
                ldmfd   sp!, {r0, r4, pc}
 
 9:             cmp     ip, #2
-               ldrgtb  r3, [r1, #-1]!
-               ldrgeb  r4, [r1, #-1]!
+               ldrbgt  r3, [r1, #-1]!
+               ldrbge  r4, [r1, #-1]!
                ldrb    lr, [r1, #-1]!
-               strgtb  r3, [r0, #-1]!
-               strgeb  r4, [r0, #-1]!
+               strbgt  r3, [r0, #-1]!
+               strbge  r4, [r0, #-1]!
                subs    r2, r2, ip
                strb    lr, [r0, #-1]!
                blt     8b
@@ -150,7 +150,7 @@ ENTRY(memmove)
                blt     14f
 
        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(  bcc     15f                     )
 
index ed6d35d..5593a45 100644 (file)
@@ -44,20 +44,20 @@ UNWIND( .save {r8, lr}      )
        mov     lr, r3
 
 2:     subs    r2, r2, #64
-       stmgeia ip!, {r1, r3, r8, lr}   @ 64 bytes at a time.
-       stmgeia ip!, {r1, r3, r8, lr}
-       stmgeia ip!, {r1, r3, r8, lr}
-       stmgeia ip!, {r1, r3, r8, lr}
+       stmiage ip!, {r1, r3, r8, lr}   @ 64 bytes at a time.
+       stmiage ip!, {r1, r3, r8, lr}
+       stmiage ip!, {r1, r3, r8, lr}
+       stmiage ip!, {r1, r3, r8, lr}
        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
  */
        tst     r2, #32
-       stmneia ip!, {r1, r3, r8, lr}
-       stmneia ip!, {r1, r3, r8, lr}
+       stmiane ip!, {r1, r3, r8, lr}
+       stmiane ip!, {r1, r3, r8, lr}
        tst     r2, #16
-       stmneia ip!, {r1, r3, r8, lr}
+       stmiane ip!, {r1, r3, r8, lr}
        ldmfd   sp!, {r8, lr}
 UNWIND( .fnend              )
 
@@ -87,22 +87,22 @@ UNWIND( .save {r4-r8, lr}      )
        rsb     r8, r8, #32
        sub     r2, r2, r8
        movs    r8, r8, lsl #(32 - 4)
-       stmcsia ip!, {r4, r5, r6, r7}
-       stmmiia ip!, {r4, r5}
+       stmiacs ip!, {r4, r5, r6, r7}
+       stmiami ip!, {r4, r5}
        tst     r8, #(1 << 30)
        mov     r8, r1
        strne   r1, [ip], #4
 
 3:     subs    r2, r2, #64
-       stmgeia ip!, {r1, r3-r8, lr}
-       stmgeia ip!, {r1, r3-r8, lr}
+       stmiage ip!, {r1, r3-r8, lr}
+       stmiage ip!, {r1, r3-r8, lr}
        bgt     3b
-       ldmeqfd sp!, {r4-r8, pc}
+       ldmfdeq sp!, {r4-r8, pc}
 
        tst     r2, #32
-       stmneia ip!, {r1, r3-r8, lr}
+       stmiane ip!, {r1, r3-r8, lr}
        tst     r2, #16
-       stmneia ip!, {r4-r7}
+       stmiane ip!, {r4-r7}
        ldmfd   sp!, {r4-r8, lr}
 UNWIND( .fnend                 )
 
@@ -110,7 +110,7 @@ UNWIND( .fnend                 )
 
 UNWIND( .fnstart            )
 4:     tst     r2, #8
-       stmneia ip!, {r1, r3}
+       stmiane ip!, {r1, r3}
        tst     r2, #4
        strne   r1, [ip], #4
 /*
@@ -118,17 +118,17 @@ UNWIND( .fnstart            )
  * may have an unaligned pointer as well.
  */
 5:     tst     r2, #2
-       strneb  r1, [ip], #1
-       strneb  r1, [ip], #1
+       strbne  r1, [ip], #1
+       strbne  r1, [ip], #1
        tst     r2, #1
-       strneb  r1, [ip], #1
+       strbne  r1, [ip], #1
        ret     lr
 
 6:     subs    r2, r2, #4              @ 1 do we have enough
        blt     5b                      @ 1 bytes to align with?
        cmp     r3, #2                  @ 1
-       strltb  r1, [ip], #1            @ 1
-       strleb  r1, [ip], #1            @ 1
+       strblt  r1, [ip], #1            @ 1
+       strble  r1, [ip], #1            @ 1
        strb    r1, [ip], #1            @ 1
        add     r2, r2, r3              @ 1 (r2 = r2 - (4 - r3))
        b       1b
index 2c40aea..c691b90 100644 (file)
@@ -14,7 +14,7 @@
 MODULE_LICENSE("GPL");
 
 #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
 
 /*
index 3efaa10..4fd479c 100644 (file)
@@ -39,10 +39,6 @@ static void __iomem *sps_base_addr;
 static void __iomem *timer_base_addr;
 static int ncores;
 
-static DEFINE_SPINLOCK(boot_lock);
-
-void owl_secondary_startup(void);
-
 static int s500_wakeup_secondary(unsigned int cpu)
 {
        int ret;
@@ -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)
 {
-       unsigned long timeout;
        int ret;
 
        ret = s500_wakeup_secondary(cpu);
@@ -93,21 +88,11 @@ static int s500_smp_boot_secondary(unsigned int cpu, struct task_struct *idle)
 
        udelay(10);
 
-       spin_lock(&boot_lock);
-
        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_FLAG + (cpu - 1) * 4);
 
-       spin_unlock(&boot_lock);
-
        return 0;
 }
 
index 005695c..0ac2cb9 100644 (file)
@@ -36,4 +36,4 @@ ENDPROC(exynos4_secondary_startup)
 
        .align 2
 1:     .long   .
-       .long   pen_release
+       .long   exynos_pen_release
index c39ffd2..3795412 100644 (file)
@@ -28,6 +28,9 @@
 
 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
 static inline void cpu_leave_lowpower(u32 core_id)
 {
@@ -57,7 +60,7 @@ static inline void platform_do_lowpower(unsigned int cpu, int *spurious)
 
                wfi();
 
-               if (pen_release == core_id) {
+               if (exynos_pen_release == core_id) {
                        /*
                         * OK, proper wakeup, we're done
                         */
@@ -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
- * observers, irrespective of whether they're taking part in coherency
+ * XXX CARGO CULTED CODE - DO NOT COPY XXX
+ *
+ * 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.
  */
-static void write_pen_release(int val)
+static void exynos_write_pen_release(int val)
 {
-       pen_release = val;
+       exynos_pen_release = val;
        smp_wmb();
-       sync_cache_w(&pen_release);
+       sync_cache_w(&exynos_pen_release);
 }
 
 static DEFINE_SPINLOCK(boot_lock);
@@ -247,7 +252,7 @@ static void exynos_secondary_init(unsigned int cpu)
         * let the primary processor know we're out of the
         * pen, then head off into the C entry point
         */
-       write_pen_release(-1);
+       exynos_write_pen_release(-1);
 
        /*
         * Synchronise with the boot thread.
@@ -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 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.
         */
-       write_pen_release(core_id);
+       exynos_write_pen_release(core_id);
 
        if (!exynos_cpu_power_state(core_id)) {
                exynos_cpu_power_up(core_id);
@@ -376,13 +381,13 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
                else
                        arch_send_wakeup_ipi_mask(cpumask_of(cpu));
 
-               if (pen_release == -1)
+               if (exynos_pen_release == -1)
                        break;
 
                udelay(10);
        }
 
-       if (pen_release != -1)
+       if (exynos_pen_release != -1)
                ret = -ETIMEDOUT;
 
        /*
@@ -392,7 +397,7 @@ static int exynos_boot_secondary(unsigned int cpu, struct task_struct *idle)
 fail:
        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)
index 8315b34..7ff812c 100644 (file)
@@ -42,6 +42,6 @@
                moveq   \irqstat, \irqstat, lsr #2
                addeq   \irqnr, \irqnr, #2
                tst     \irqstat, #0x01
-               addeqs  \irqnr, \irqnr, #1
+               addseq  \irqnr, \irqnr, #1
 1001:
        .endm
index 058a37e..fd6e067 100644 (file)
@@ -523,8 +523,10 @@ void omap_prm_reset_system(void)
 
        prm_ll_data->reset_system();
 
-       while (1)
+       while (1) {
                cpu_relax();
+               wfe();
+       }
 }
 
 /**
index b625906..61a34e1 100644 (file)
@@ -1,2 +1 @@
 obj-$(CONFIG_SMP)              += platsmp.o headsmp.o
-obj-$(CONFIG_HOTPLUG_CPU)      += hotplug.o
diff --git a/arch/arm/mach-oxnas/hotplug.c b/arch/arm/mach-oxnas/hotplug.c
deleted file mode 100644 (file)
index 854f29b..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  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);
-}
index 442cc8a..735141c 100644 (file)
@@ -19,7 +19,6 @@
 #include <asm/smp_scu.h>
 
 extern void ox820_secondary_startup(void);
-extern void ox820_cpu_die(unsigned int cpu);
 
 static void __iomem *cpu_ctrl;
 static void __iomem *gic_cpu_ctrl;
@@ -94,9 +93,6 @@ unmap_scu:
 static const struct smp_operations ox820_smp_ops __initconst = {
        .smp_prepare_cpus       = ox820_smp_prepare_cpus,
        .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);
index 6d77b62..457eb7b 100644 (file)
@@ -15,6 +15,8 @@
 #include <asm/mach/time.h>
 #include <asm/exception.h>
 
+extern volatile int prima2_pen_release;
+
 extern const struct smp_operations sirfsoc_smp_ops;
 extern void sirfsoc_secondary_startup(void);
 extern void sirfsoc_cpu_die(unsigned int cpu);
index 209d9fc..6cf4fc6 100644 (file)
@@ -34,4 +34,4 @@ ENDPROC(sirfsoc_secondary_startup)
 
         .align
 1:      .long   .
-        .long   pen_release
+        .long   prima2_pen_release
index a728c78..b6cf152 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/smp.h>
 
 #include <asm/smp_plat.h>
+#include "common.h"
 
 static inline void platform_do_lowpower(unsigned int cpu)
 {
@@ -18,7 +19,7 @@ static inline void platform_do_lowpower(unsigned int cpu)
        for (;;) {
                __asm__ __volatile__("dsb\n\t" "wfi\n\t"
                        : : : "memory");
-               if (pen_release == cpu_logical_map(cpu)) {
+               if (prima2_pen_release == cpu_logical_map(cpu)) {
                        /*
                         * OK, proper wakeup, we're done
                         */
index 75ef5d4..d1f8b51 100644 (file)
@@ -24,13 +24,16 @@ static void __iomem *clk_base;
 
 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)
 {
        /*
         * let the primary processor know we're out of the
         * pen, then head off into the C entry point
         */
-       pen_release = -1;
+       prima2_pen_release = -1;
        smp_wmb();
 
        /*
@@ -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 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.
         */
-       pen_release = cpu_logical_map(cpu);
-       sync_cache_w(&pen_release);
+       prima2_pen_release = cpu_logical_map(cpu);
+       sync_cache_w(&prima2_pen_release);
 
        /*
         * 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)
        timeout = jiffies + (1 * HZ);
        while (time_before(jiffies, timeout)) {
                smp_rmb();
-               if (pen_release == -1)
+               if (prima2_pen_release == -1)
                        break;
 
                udelay(10);
@@ -109,7 +112,7 @@ static int sirfsoc_boot_secondary(unsigned int cpu, struct task_struct *idle)
         */
        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 = {
index 5494c9e..99a6a5e 100644 (file)
@@ -46,8 +46,6 @@
 
 extern void secondary_startup_arm(void);
 
-static DEFINE_SPINLOCK(boot_lock);
-
 #ifdef CONFIG_HOTPLUG_CPU
 static void qcom_cpu_die(unsigned int cpu)
 {
@@ -55,15 +53,6 @@ static void qcom_cpu_die(unsigned int cpu)
 }
 #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)
 {
        struct device_node *node;
@@ -280,12 +269,6 @@ static int qcom_boot_secondary(unsigned int cpu, int (*func)(unsigned int))
                        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
         * 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))
         */
        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;
 }
 
@@ -334,7 +311,6 @@ static void __init qcom_smp_prepare_cpus(unsigned int max_cpus)
 
 static const struct smp_operations smp_msm8660_ops __initconst = {
        .smp_prepare_cpus       = qcom_smp_prepare_cpus,
-       .smp_secondary_init     = qcom_secondary_init,
        .smp_boot_secondary     = msm8660_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_die                = qcom_cpu_die,
@@ -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 = {
        .smp_prepare_cpus       = qcom_smp_prepare_cpus,
-       .smp_secondary_init     = qcom_secondary_init,
        .smp_boot_secondary     = kpssv1_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_die                = qcom_cpu_die,
@@ -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 = {
        .smp_prepare_cpus       = qcom_smp_prepare_cpus,
-       .smp_secondary_init     = qcom_secondary_init,
        .smp_boot_secondary     = kpssv2_boot_secondary,
 #ifdef CONFIG_HOTPLUG_CPU
        .cpu_die                = qcom_cpu_die,
index 909b97c..25b4c5e 100644 (file)
@@ -20,6 +20,8 @@
 
 #include <asm/mach/time.h>
 
+extern volatile int spear_pen_release;
+
 extern void spear13xx_timer_init(void);
 extern void spear3xx_timer_init(void);
 extern struct pl022_ssp_controller pl022_plat_data;
index c52192d..6e250b6 100644 (file)
@@ -43,5 +43,5 @@ pen:  ldr     r7, [r6]
 
        .align
 1:     .long   .
-       .long   pen_release
+       .long   spear_pen_release
 ENDPROC(spear13xx_secondary_startup)
index 12edd1c..0dd84f6 100644 (file)
@@ -16,6 +16,8 @@
 #include <asm/cp15.h>
 #include <asm/smp_plat.h>
 
+#include "generic.h"
+
 static inline void cpu_enter_lowpower(void)
 {
        unsigned int v;
@@ -57,7 +59,7 @@ static inline void spear13xx_do_lowpower(unsigned int cpu, int *spurious)
        for (;;) {
                wfi();
 
-               if (pen_release == cpu) {
+               if (spear_pen_release == cpu) {
                        /*
                         * OK, proper wakeup, we're done
                         */
index 39038a0..b1ff4bb 100644 (file)
 #include <mach/spear.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
- * observers, irrespective of whether they're taking part in coherency
+ * XXX CARGO CULTED CODE - DO NOT COPY XXX
+ *
+ * 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.
  */
-static void write_pen_release(int val)
+static void spear_write_pen_release(int val)
 {
-       pen_release = val;
+       spear_pen_release = val;
        smp_wmb();
-       sync_cache_w(&pen_release);
+       sync_cache_w(&spear_pen_release);
 }
 
 static DEFINE_SPINLOCK(boot_lock);
@@ -42,7 +47,7 @@ static void spear13xx_secondary_init(unsigned int cpu)
         * let the primary processor know we're out of the
         * pen, then head off into the C entry point
         */
-       write_pen_release(-1);
+       spear_write_pen_release(-1);
 
        /*
         * Synchronise with the boot thread.
@@ -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 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.
         */
-       write_pen_release(cpu);
+       spear_write_pen_release(cpu);
 
        timeout = jiffies + (1 * HZ);
        while (time_before(jiffies, timeout)) {
                smp_rmb();
-               if (pen_release == -1)
+               if (spear_pen_release == -1)
                        break;
 
                udelay(10);
@@ -86,7 +91,7 @@ static int spear13xx_boot_secondary(unsigned int cpu, struct task_struct *idle)
         */
        spin_unlock(&boot_lock);
 
-       return pen_release != -1 ? -ENOSYS : 0;
+       return spear_pen_release != -1 ? -ENOSYS : 0;
 }
 
 /*
index 805f306..e22ccf8 100644 (file)
@@ -172,7 +172,7 @@ after_errata:
        mov32   r5, TEGRA_IRAM_BASE + TEGRA_IRAM_RESET_HANDLER_OFFSET
        mov     r0, #CPU_NOT_RESETTABLE
        cmp     r10, #0
-       strneb  r0, [r5, #__tegra20_cpu1_resettable_status_offset]
+       strbne  r0, [r5, #__tegra20_cpu1_resettable_status_offset]
 1:
 #endif
 
index 2465995..be68d62 100644 (file)
@@ -215,8 +215,8 @@ v6_dma_inv_range:
 #endif
        tst     r1, #D_CACHE_LINE_SIZE - 1
 #ifdef CONFIG_DMA_CACHE_RWFO
-       ldrneb  r2, [r1, #-1]                   @ read for ownership
-       strneb  r2, [r1, #-1]                   @ write for ownership
+       ldrbne  r2, [r1, #-1]                   @ read for ownership
+       strbne  r2, [r1, #-1]                   @ write for ownership
 #endif
        bic     r1, r1, #D_CACHE_LINE_SIZE - 1
 #ifdef HARVARD_CACHE
@@ -284,8 +284,8 @@ ENTRY(v6_dma_flush_range)
        add     r0, r0, #D_CACHE_LINE_SIZE
        cmp     r0, r1
 #ifdef CONFIG_DMA_CACHE_RWFO
-       ldrlob  r2, [r0]                        @ read for ownership
-       strlob  r2, [r0]                        @ write for ownership
+       ldrblo  r2, [r0]                        @ read for ownership
+       strblo  r2, [r0]                        @ write for ownership
 #endif
        blo     1b
        mov     r0, #0
index b03202c..f74cdce 100644 (file)
@@ -45,6 +45,7 @@ static void mc_copy_user_page(void *from, void *to)
        int tmp;
 
        asm volatile ("\
+       .syntax unified\n\
        ldmia   %0!, {r2, r3, ip, lr}           @ 4\n\
 1:     mcr     p15, 0, %1, c7, c6, 1           @ 1   invalidate D line\n\
        stmia   %1!, {r2, r3, ip, lr}           @ 4\n\
@@ -56,7 +57,7 @@ static void mc_copy_user_page(void *from, void *to)
        ldmia   %0!, {r2, r3, ip, lr}           @ 4\n\
        subs    %2, %2, #1                      @ 1\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                              @ "
        : "+&r" (from), "+&r" (to), "=&r" (tmp)
        : "2" (PAGE_SIZE / 64)
index cd3e165..6d33674 100644 (file)
@@ -27,6 +27,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom)
        int tmp;
 
        asm volatile ("\
+       .syntax unified\n\
        ldmia   %1!, {r3, r4, ip, lr}           @ 4\n\
 1:     mcr     p15, 0, %0, c7, c6, 1           @ 1   invalidate D line\n\
        stmia   %0!, {r3, r4, ip, lr}           @ 4\n\
@@ -38,7 +39,7 @@ static void v4wb_copy_user_page(void *kto, const void *kfrom)
        ldmia   %1!, {r3, r4, ip, lr}           @ 4\n\
        subs    %2, %2, #1                      @ 1\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\
        mcr     p15, 0, %1, c7, c10, 4          @ 1   drain WB"
        : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
index 8614572..3851bb3 100644 (file)
@@ -25,6 +25,7 @@ static void v4wt_copy_user_page(void *kto, const void *kfrom)
        int tmp;
 
        asm volatile ("\
+       .syntax unified\n\
        ldmia   %1!, {r3, r4, ip, lr}           @ 4\n\
 1:     stmia   %0!, {r3, r4, ip, lr}           @ 4\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)
        ldmia   %1!, {r3, r4, ip, lr}           @ 4\n\
        subs    %2, %2, #1                      @ 1\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\
        mcr     p15, 0, %2, c7, c7, 0           @ flush ID cache"
        : "+&r" (kto), "+&r" (kfrom), "=&r" (tmp)
index 1e3e08a..9376f85 100644 (file)
@@ -2277,7 +2277,7 @@ EXPORT_SYMBOL_GPL(arm_iommu_attach_device);
  * @dev: valid struct device pointer
  *
  * 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)
 {
index 1d1edd0..a033f61 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <asm/cputype.h>
 #include <asm/idmap.h>
+#include <asm/hwcap.h>
 #include <asm/pgalloc.h>
 #include <asm/pgtable.h>
 #include <asm/sections.h>
@@ -110,7 +111,8 @@ static int __init init_static_idmap(void)
                             __idmap_text_end, 0);
 
        /* Flush L1 for the hardware to see this page table content */
-       flush_cache_louis();
+       if (!(elf_hwcap & HWCAP_LPAE))
+               flush_cache_louis();
 
        return 0;
 }
index 478ea8b..a6b0805 100644 (file)
@@ -278,15 +278,12 @@ void __init arm_memblock_init(const struct machine_desc *mdesc)
 
 void __init bootmem_init(void)
 {
-       unsigned long min, max_low, max_high;
-
        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,
-                     (phys_addr_t)max_low << PAGE_SHIFT);
+       early_memtest((phys_addr_t)min_low_pfn << PAGE_SHIFT,
+                     (phys_addr_t)max_low_pfn << PAGE_SHIFT);
 
        /*
         * Sparsemem tries to allocate bootmem in memory_present(),
@@ -304,16 +301,7 @@ void __init bootmem_init(void)
         * the sparse mem_map arrays initialized by sparse_init()
         * for memmap_init_zone(), otherwise all PFNs are invalid.
         */
-       zone_sizes_init(min, max_low, max_high);
-
-       /*
-        * 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;
+       zone_sizes_init(min_low_pfn, max_low_pfn, max_pfn);
 }
 
 /*
@@ -494,55 +482,6 @@ void __init mem_init(void)
 
        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
         * be detected at build time already.
index 617a83d..0d7d5fb 100644 (file)
@@ -165,7 +165,7 @@ static int __init pmsav8_setup_ram(unsigned int number, phys_addr_t start,phys_a
                return -EINVAL;
 
        bar = start;
-       lar = (end - 1) & ~(PMSAv8_MINALIGN - 1);;
+       lar = (end - 1) & ~(PMSAv8_MINALIGN - 1);
 
        bar |= PMSAv8_AP_PL1RW_PL0RW | PMSAv8_RGN_SHARED;
        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
                return -EINVAL;
 
        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;
        lar |= PMSAv8_LAR_IDX(PMSAv8_RGN_DEVICE_nGnRnE) | PMSAv8_LAR_EN;
index 47a5acc..acd5a66 100644 (file)
@@ -139,6 +139,9 @@ __v7m_setup_cont:
        cpsie   i
        svc     #0
 1:     cpsid   i
+       ldr     r0, =exc_ret
+       orr     lr, lr, #EXC_RET_THREADMODE_PROCESSSTACK
+       str     lr, [r0]
        ldmia   sp, {r0-r3, r12}
        str     r5, [r12, #11 * 4]      @ restore the original SVC vector entry
        mov     lr, r6                  @ restore LR
@@ -149,10 +152,10 @@ __v7m_setup_cont:
 
        @ Configure caches (if implemented)
        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
        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
        @ Note the STKALIGN bit is either RW or RAO.
index 41b7064..b4dae62 100644 (file)
 
 #define to_amba_driver(d)      container_of(d, struct amba_driver, drv)
 
-static const struct amba_id *
-amba_lookup(const struct amba_id *table, struct amba_device *dev)
+/* called on periphid match and class 0x9 coresight device. */
+static int
+amba_cs_uci_id_match(const struct amba_id *table, struct amba_device *dev)
 {
        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) {
-               ret = (dev->periphid & table->mask) == table->id;
-               if (ret)
-                       break;
+               if (((dev->periphid & table->mask) == table->id) &&
+                       ((dev->cid != CORESIGHT_CID) ||
+                        (amba_cs_uci_id_match(table, dev))))
+                       return table;
                table++;
        }
-
-       return ret ? table : NULL;
+       return NULL;
 }
 
 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)
                        cid |= (readl(tmp + size - 0x10 + 4 * i) & 255) <<
                                (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);
 
-               if (cid == AMBA_CID || cid == CORESIGHT_CID)
+               if (cid == AMBA_CID || cid == CORESIGHT_CID) {
                        dev->periphid = pid;
+                       dev->cid = cid;
+               }
 
                if (!dev->periphid)
                        ret = -ENODEV;
index 9a63e87..be302ec 100644 (file)
@@ -871,7 +871,7 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id)
        }
 
        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) {
                coresight_enable(drvdata->csdev);
                drvdata->boot_enable = true;
@@ -915,36 +915,18 @@ static const struct dev_pm_ops etm_dev_pm_ops = {
 };
 
 static const struct amba_id etm_ids[] = {
-       {       /* ETM 3.3 */
-               .id     = 0x000bb921,
-               .mask   = 0x000fffff,
-               .data   = "ETM 3.3",
-       },
-       {       /* ETM 3.5 - Cortex-A5 */
-               .id     = 0x000bb955,
-               .mask   = 0x000fffff,
-               .data   = "ETM 3.5",
-       },
-       {       /* ETM 3.5 */
-               .id     = 0x000bb956,
-               .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",
-       },
+       /* ETM 3.3 */
+       CS_AMBA_ID_DATA(0x000bb921, "ETM 3.3"),
+       /* ETM 3.5 - Cortex-A5 */
+       CS_AMBA_ID_DATA(0x000bb955, "ETM 3.5"),
+       /* ETM 3.5 */
+       CS_AMBA_ID_DATA(0x000bb956, "ETM 3.5"),
+       /* PTM 1.0 */
+       CS_AMBA_ID_DATA(0x000bb950, "PTM 1.0"),
+       /* PTM 1.1 */
+       CS_AMBA_ID_DATA(0x000bb95f, "PTM 1.1"),
+       /* PTM 1.1 Qualcomm */
+       CS_AMBA_ID_DATA(0x000b006f, "PTM 1.1"),
        { 0, 0},
 };
 
index 53e2fb6..dd9b9b5 100644 (file)
@@ -1067,18 +1067,21 @@ err_arch_supported:
        return ret;
 }
 
-#define ETM4x_AMBA_ID(pid)                     \
-       {                                       \
-               .id     = pid,                  \
-               .mask   = 0x000fffff,           \
+static struct amba_cs_uci_id uci_id_etm4[] = {
+       {
+               /*  ETMv4 UCI data */
+               .devarch        = 0x47704a13,
+               .devarch_mask   = 0xfff0ffff,
+               .devtype        = 0x00000013,
        }
+};
 
 static const struct amba_id etm4_ids[] = {
-       ETM4x_AMBA_ID(0x000bb95d),              /* Cortex-A53 */
-       ETM4x_AMBA_ID(0x000bb95e),              /* Cortex-A57 */
-       ETM4x_AMBA_ID(0x000bb95a),              /* Cortex-A72 */
-       ETM4x_AMBA_ID(0x000bb959),              /* Cortex-A73 */
-       ETM4x_AMBA_ID(0x000bb9da),              /* Cortex-A35 */
+       CS_AMBA_ID(0x000bb95d),         /* Cortex-A53 */
+       CS_AMBA_ID(0x000bb95e),         /* Cortex-A57 */
+       CS_AMBA_ID(0x000bb95a),         /* Cortex-A72 */
+       CS_AMBA_ID(0x000bb959),         /* Cortex-A73 */
+       CS_AMBA_UCI_ID(0x000bb9da, uci_id_etm4),        /* Cortex-A35 */
        {},
 };
 
index 579f349..fd69ad2 100644 (file)
@@ -6,6 +6,7 @@
 #ifndef _CORESIGHT_PRIV_H
 #define _CORESIGHT_PRIV_H
 
+#include <linux/amba/bus.h>
 #include <linux/bitops.h>
 #include <linux/io.h>
 #include <linux/coresight.h>
@@ -159,4 +160,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; }
 #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
index ef339ff..2a70cdd 100644 (file)
@@ -874,7 +874,7 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id)
 
        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;
 
 stm_unregister:
@@ -909,16 +909,8 @@ static const struct dev_pm_ops stm_dev_pm_ops = {
 };
 
 static const struct amba_id stm_ids[] = {
-       {
-               .id     = 0x000bb962,
-               .mask   = 0x000fffff,
-               .data   = "STM32",
-       },
-       {
-               .id     = 0x000bb963,
-               .mask   = 0x000fffff,
-               .data   = "STM500",
-       },
+       CS_AMBA_ID_DATA(0x000bb962, "STM32"),
+       CS_AMBA_ID_DATA(0x000bb963, "STM500"),
        { 0, 0},
 };
 
index ea249f0..2a02da3 100644 (file)
@@ -443,7 +443,8 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
                desc.type = CORESIGHT_DEV_TYPE_SINK;
                desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER;
                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)
                        goto out;
                break;
@@ -475,26 +476,13 @@ out:
 }
 
 static const struct amba_id tmc_ids[] = {
-       {
-               .id     = 0x000bb961,
-               .mask   = 0x000fffff,
-       },
-       {
-               /* Coresight SoC 600 TMC-ETR/ETS */
-               .id     = 0x000bb9e8,
-               .mask   = 0x000fffff,
-               .data   = (void *)(unsigned long)CORESIGHT_SOC_600_ETR_CAPS,
-       },
-       {
-               /* Coresight SoC 600 TMC-ETB */
-               .id     = 0x000bb9e9,
-               .mask   = 0x000fffff,
-       },
-       {
-               /* Coresight SoC 600 TMC-ETF */
-               .id     = 0x000bb9ea,
-               .mask   = 0x000fffff,
-       },
+       CS_AMBA_ID(0x000bb961),
+       /* Coresight SoC 600 TMC-ETR/ETS */
+       CS_AMBA_ID_DATA(0x000bb9e8, (unsigned long)CORESIGHT_SOC_600_ETR_CAPS),
+       /* Coresight SoC 600 TMC-ETB */
+       CS_AMBA_ID(0x000bb9e9),
+       /* Coresight SoC 600 TMC-ETF */
+       CS_AMBA_ID(0x000bb9ea),
        { 0, 0},
 };
 
index d143c13..f99b74a 100644 (file)
 #define AMBA_CID       0xb105f00d
 #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 amba_device {
@@ -32,6 +69,8 @@ struct amba_device {
        struct resource         res;
        struct clk              *pclk;
        unsigned int            periphid;
+       unsigned int            cid;
+       struct amba_cs_uci_id   uci;
        unsigned int            irq[AMBA_NR_IRQS];
        char                    *driver_override;
 };
index 4e90d44..e723eac 100644 (file)
@@ -39,7 +39,7 @@ endif
 ifeq ($(CONFIG_KERNEL_MODE_NEON),y)
 NEON_FLAGS := -ffreestanding
 ifeq ($(ARCH),arm)
-NEON_FLAGS += -mfloat-abi=softfp -mfpu=neon
+NEON_FLAGS += -march=armv7-a -mfloat-abi=softfp -mfpu=neon
 endif
 CFLAGS_recov_neon_inner.o += $(NEON_FLAGS)
 ifeq ($(ARCH),arm64)