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