mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
ARM updates for 5.1-rc1
- 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. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIUAwUAXIvD9vTnkBvkraxkAQIiiw/41bA3yIv+4J/t7vw6PkMRzFwRG8YYc+ms Rw6wlJIeBkiq2m5XOTNswMMjSDbYu0n5utzFTsf65nFxW2i34XkaC1kDws+vNdtx WrEPSj6sjXSjuWEV5O3neET5Wc+z+tEJRkRs7E/e/2x1DE4kzYWNy1UT3ohamZmh HN1Z9C7ijX5toPQ4AtiX12pc8f6CcodBsRUfebYf0+A7cVTyCkIxvMlvhparQjMW 8e4kLRuNvbHuzbbtlPCNMwnLR85FwM463OByk8F0nZ0RShQduAbnHaSZjVwLZUn5 8MMY4Yir7+R3sKc348kqE8WEVgKbeZYrgDJmM1RezJWfEblyFHnanNr/DWeskmZR 4ZFIESNAwQuTSIeCRhllBsGWrEU3pP8bnSTVAEKdv403rWTsRiA+R5/aMKMkfubK 1zNx8B3JszI4FeHVTW0l+2yVBbwm8ZTqHMBuSUF61I292ZrUXfaC+MgZ7CuhD1n9 vKO2MxuKb3BULJmpX5uT8RzBcRA/7eTDZrLkCUmSHmxwIMdkC4cVKyT33s9rue0J kT/W/iKB9QB4KuHVRVdOJ2VX/KN5YjsRNc5D4kW1Ml9gfdQ3ohWA4yZzPR26KeRE dHGcCbKK6jHyLxSQdJl1wItGBBUrAKV3u5IDgTClbE9X2LmJIbXwnMdAPC9WVJNb BfUPlCLS9w== =U6og -----END PGP SIGNATURE----- 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 ...
This commit is contained in:
commit
0be2886307
@ -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.
|
||||
|
@ -1310,7 +1310,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"
|
||||
@ -1322,7 +1322,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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)\"
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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}
|
||||
|
||||
|
@ -381,7 +381,7 @@ static int __init nocache_trampoline(unsigned long _arg)
|
||||
unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
|
||||
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();
|
||||
|
||||
__mcpm_cpu_going_down(cpu, cluster);
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -16,25 +16,25 @@
|
||||
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
|
||||
|
||||
/*
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -19,20 +19,4 @@
|
||||
#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
|
||||
|
@ -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)
|
||||
|
@ -10,6 +10,7 @@ struct sleep_save_sp {
|
||||
};
|
||||
|
||||
extern void cpu_resume(void);
|
||||
extern void cpu_resume_no_hyp(void);
|
||||
extern void cpu_resume_arm(void);
|
||||
extern int cpu_suspend(unsigned long, int (*)(unsigned long));
|
||||
|
||||
|
@ -85,7 +85,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"); \
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -29,13 +29,13 @@
|
||||
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
|
||||
@ -53,13 +53,13 @@
|
||||
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
|
||||
|
@ -173,7 +173,7 @@
|
||||
|
||||
.macro senduart, rd, rx
|
||||
cmp \rx, #0
|
||||
strneb \rd, [\rx, #UART_TX << UART_SHIFT]
|
||||
strbne \rd, [\rx, #UART_TX << UART_SHIFT]
|
||||
1001:
|
||||
.endm
|
||||
|
||||
|
@ -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'
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -127,7 +127,8 @@
|
||||
*/
|
||||
.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
|
||||
@ -387,8 +388,8 @@
|
||||
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
|
||||
@ -396,8 +397,8 @@
|
||||
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
|
||||
|
@ -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
|
||||
|
@ -439,8 +439,8 @@ M_CLASS(str r6, [r12, #PMSAv8_RLAR_A(3)])
|
||||
str r5, [r12, #PMSAv8_RBAR_A(0)]
|
||||
str r6, [r12, #PMSAv8_RLAR_A(0)]
|
||||
#else
|
||||
mcr p15, 0, r5, c6, c10, 1 @ PRBAR4
|
||||
mcr p15, 0, r6, c6, c10, 2 @ PRLAR4
|
||||
mcr p15, 0, r5, c6, c10, 0 @ PRBAR4
|
||||
mcr p15, 0, r6, c6, c10, 1 @ PRLAR4
|
||||
#endif
|
||||
#endif
|
||||
ret lr
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -16,7 +16,7 @@ struct patch {
|
||||
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)
|
||||
__acquires(&patch_lock)
|
||||
@ -33,7 +33,7 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
|
||||
return addr;
|
||||
|
||||
if (flags)
|
||||
spin_lock_irqsave(&patch_lock, *flags);
|
||||
raw_spin_lock_irqsave(&patch_lock, *flags);
|
||||
else
|
||||
__acquire(&patch_lock);
|
||||
|
||||
@ -48,7 +48,7 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags)
|
||||
clear_fixmap(fixmap);
|
||||
|
||||
if (flags)
|
||||
spin_unlock_irqrestore(&patch_lock, *flags);
|
||||
raw_spin_unlock_irqrestore(&patch_lock, *flags);
|
||||
else
|
||||
__release(&patch_lock);
|
||||
}
|
||||
|
@ -120,6 +120,14 @@ ENDPROC(cpu_resume_after_mmu)
|
||||
.text
|
||||
.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
|
||||
.arm
|
||||
ENTRY(cpu_resume_arm)
|
||||
@ -135,6 +143,7 @@ ARM_BE8(setend be) @ ensure we are in BE mode
|
||||
bl __hyp_stub_install_secondary
|
||||
#endif
|
||||
safe_svcmode_maskall r1
|
||||
no_hyp:
|
||||
mov r1, #0
|
||||
ALT_SMP(mrc p15, 0, r0, c0, c0, 5)
|
||||
ALT_UP_B(1f)
|
||||
@ -163,6 +172,9 @@ ENDPROC(cpu_resume)
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
ENDPROC(cpu_resume_arm)
|
||||
#endif
|
||||
#ifdef CONFIG_MCPM
|
||||
ENDPROC(cpu_resume_no_hyp)
|
||||
#endif
|
||||
|
||||
.align 2
|
||||
|
@ -62,12 +62,6 @@
|
||||
*/
|
||||
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);
|
||||
|
@ -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
|
||||
|
@ -93,7 +93,7 @@ extern const struct unwind_idx __start_unwind_idx[];
|
||||
static const struct unwind_idx *__origin_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);
|
||||
|
||||
/* Convert a prel31 symbol to an absolute address */
|
||||
@ -201,7 +201,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr)
|
||||
/* module unwind tables */
|
||||
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) {
|
||||
if (addr >= table->begin_addr &&
|
||||
addr < table->end_addr) {
|
||||
@ -213,7 +213,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr)
|
||||
break;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&unwind_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&unwind_lock, flags);
|
||||
}
|
||||
|
||||
pr_debug("%s: idx = %p\n", __func__, idx);
|
||||
@ -529,9 +529,9 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size,
|
||||
tab->begin_addr = text_addr;
|
||||
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);
|
||||
spin_unlock_irqrestore(&unwind_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&unwind_lock, flags);
|
||||
|
||||
return tab;
|
||||
}
|
||||
@ -543,9 +543,9 @@ void unwind_table_del(struct unwind_table *tab)
|
||||
if (!tab)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&unwind_lock, flags);
|
||||
raw_spin_lock_irqsave(&unwind_lock, flags);
|
||||
list_del(&tab->list);
|
||||
spin_unlock_irqrestore(&unwind_lock, flags);
|
||||
raw_spin_unlock_irqrestore(&unwind_lock, flags);
|
||||
|
||||
kfree(tab);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
@ -204,7 +204,7 @@
|
||||
|
||||
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 )
|
||||
|
||||
@ -241,7 +241,7 @@
|
||||
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 )
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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:
|
||||
|
@ -16,10 +16,10 @@
|
||||
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)
|
||||
|
@ -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
|
||||
|
@ -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}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -36,10 +36,10 @@
|
||||
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)
|
||||
|
@ -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]
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 )
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -36,4 +36,4 @@ ENDPROC(exynos4_secondary_startup)
|
||||
|
||||
.align 2
|
||||
1: .long .
|
||||
.long pen_release
|
||||
.long exynos_pen_release
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -523,8 +523,10 @@ void omap_prm_reset_system(void)
|
||||
|
||||
prm_ll_data->reset_system();
|
||||
|
||||
while (1)
|
||||
while (1) {
|
||||
cpu_relax();
|
||||
wfe();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,2 +1 @@
|
||||
obj-$(CONFIG_SMP) += platsmp.o headsmp.o
|
||||
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -34,4 +34,4 @@ ENDPROC(sirfsoc_secondary_startup)
|
||||
|
||||
.align
|
||||
1: .long .
|
||||
.long pen_release
|
||||
.long prima2_pen_release
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -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 = {
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -43,5 +43,5 @@ pen: ldr r7, [r6]
|
||||
|
||||
.align
|
||||
1: .long .
|
||||
.long pen_release
|
||||
.long spear_pen_release
|
||||
ENDPROC(spear13xx_secondary_startup)
|
||||
|
@ -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
|
||||
*/
|
||||
|
@ -20,16 +20,21 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -2279,7 +2279,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)
|
||||
{
|
||||
|
@ -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,6 +111,7 @@ static int __init init_static_idmap(void)
|
||||
__idmap_text_end, 0);
|
||||
|
||||
/* Flush L1 for the hardware to see this page table content */
|
||||
if (!(elf_hwcap & HWCAP_LPAE))
|
||||
flush_cache_louis();
|
||||
|
||||
return 0;
|
||||
|
@ -282,15 +282,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(),
|
||||
@ -308,16 +305,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);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -498,55 +486,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.
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -26,19 +26,36 @@
|
||||
|
||||
#define to_amba_driver(d) container_of(d, struct amba_driver, drv)
|
||||
|
||||
/* 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)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
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;
|
||||
|
@ -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},
|
||||
};
|
||||
|
||||
|
@ -1068,18 +1068,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 */
|
||||
{},
|
||||
};
|
||||
|
||||
|
@ -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>
|
||||
@ -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; }
|
||||
#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
|
||||
|
@ -870,7 +870,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:
|
||||
@ -905,16 +905,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},
|
||||
};
|
||||
|
||||
|
@ -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,
|
||||
},
|
||||
{
|
||||
CS_AMBA_ID(0x000bb961),
|
||||
/* Coresight SoC 600 TMC-ETR/ETS */
|
||||
.id = 0x000bb9e8,
|
||||
.mask = 0x000fffff,
|
||||
.data = (void *)(unsigned long)CORESIGHT_SOC_600_ETR_CAPS,
|
||||
},
|
||||
{
|
||||
CS_AMBA_ID_DATA(0x000bb9e8, (unsigned long)CORESIGHT_SOC_600_ETR_CAPS),
|
||||
/* Coresight SoC 600 TMC-ETB */
|
||||
.id = 0x000bb9e9,
|
||||
.mask = 0x000fffff,
|
||||
},
|
||||
{
|
||||
CS_AMBA_ID(0x000bb9e9),
|
||||
/* Coresight SoC 600 TMC-ETF */
|
||||
.id = 0x000bb9ea,
|
||||
.mask = 0x000fffff,
|
||||
},
|
||||
CS_AMBA_ID(0x000bb9ea),
|
||||
{ 0, 0},
|
||||
};
|
||||
|
||||
|
@ -25,6 +25,43 @@
|
||||
#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;
|
||||
};
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user