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