162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/lib/copypage.S 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 1995-1999 Russell King 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * ASM optimised string functions 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#include <linux/linkage.h> 1062306a36Sopenharmony_ci#include <asm/assembler.h> 1162306a36Sopenharmony_ci#include <asm/asm-offsets.h> 1262306a36Sopenharmony_ci#include <asm/cache.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define COPY_COUNT (PAGE_SZ / (2 * L1_CACHE_BYTES) PLD( -1 )) 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci .text 1762306a36Sopenharmony_ci .align 5 1862306a36Sopenharmony_ci/* 1962306a36Sopenharmony_ci * StrongARM optimised copy_page routine 2062306a36Sopenharmony_ci * now 1.78bytes/cycle, was 1.60 bytes/cycle (50MHz bus -> 89MB/s) 2162306a36Sopenharmony_ci * Note that we probably achieve closer to the 100MB/s target with 2262306a36Sopenharmony_ci * the core clock switching. 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ciENTRY(copy_page) 2562306a36Sopenharmony_ci stmfd sp!, {r4, lr} @ 2 2662306a36Sopenharmony_ci PLD( pld [r1, #0] ) 2762306a36Sopenharmony_ci PLD( pld [r1, #L1_CACHE_BYTES] ) 2862306a36Sopenharmony_ci mov r2, #COPY_COUNT @ 1 2962306a36Sopenharmony_ci ldmia r1!, {r3, r4, ip, lr} @ 4+1 3062306a36Sopenharmony_ci1: PLD( pld [r1, #2 * L1_CACHE_BYTES]) 3162306a36Sopenharmony_ci PLD( pld [r1, #3 * L1_CACHE_BYTES]) 3262306a36Sopenharmony_ci2: 3362306a36Sopenharmony_ci .rept (2 * L1_CACHE_BYTES / 16 - 1) 3462306a36Sopenharmony_ci stmia r0!, {r3, r4, ip, lr} @ 4 3562306a36Sopenharmony_ci ldmia r1!, {r3, r4, ip, lr} @ 4 3662306a36Sopenharmony_ci .endr 3762306a36Sopenharmony_ci subs r2, r2, #1 @ 1 3862306a36Sopenharmony_ci stmia r0!, {r3, r4, ip, lr} @ 4 3962306a36Sopenharmony_ci ldmiagt r1!, {r3, r4, ip, lr} @ 4 4062306a36Sopenharmony_ci bgt 1b @ 1 4162306a36Sopenharmony_ci PLD( ldmiaeq r1!, {r3, r4, ip, lr} ) 4262306a36Sopenharmony_ci PLD( beq 2b ) 4362306a36Sopenharmony_ci ldmfd sp!, {r4, pc} @ 3 4462306a36Sopenharmony_ciENDPROC(copy_page) 45