^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/arch/arm/lib/copypage.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 1995-1999 Russell King
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * ASM optimised string functions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/assembler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/asm-offsets.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/cache.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define COPY_COUNT (PAGE_SZ / (2 * L1_CACHE_BYTES) PLD( -1 ))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) .align 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * StrongARM optimised copy_page routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * now 1.78bytes/cycle, was 1.60 bytes/cycle (50MHz bus -> 89MB/s)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * Note that we probably achieve closer to the 100MB/s target with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * the core clock switching.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) ENTRY(copy_page)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) stmfd sp!, {r4, lr} @ 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) PLD( pld [r1, #0] )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) PLD( pld [r1, #L1_CACHE_BYTES] )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) mov r2, #COPY_COUNT @ 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) ldmia r1!, {r3, r4, ip, lr} @ 4+1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 1: PLD( pld [r1, #2 * L1_CACHE_BYTES])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) PLD( pld [r1, #3 * L1_CACHE_BYTES])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .rept (2 * L1_CACHE_BYTES / 16 - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) stmia r0!, {r3, r4, ip, lr} @ 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) ldmia r1!, {r3, r4, ip, lr} @ 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) .endr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) subs r2, r2, #1 @ 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) stmia r0!, {r3, r4, ip, lr} @ 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) ldmiagt r1!, {r3, r4, ip, lr} @ 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) bgt 1b @ 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) PLD( ldmiaeq r1!, {r3, r4, ip, lr} )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) PLD( beq 2b )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ldmfd sp!, {r4, pc} @ 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ENDPROC(copy_page)