162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2008 Mark Nelson, IBM Corp.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#include <linux/export.h>
662306a36Sopenharmony_ci#include <asm/page.h>
762306a36Sopenharmony_ci#include <asm/processor.h>
862306a36Sopenharmony_ci#include <asm/ppc_asm.h>
962306a36Sopenharmony_ci#include <asm/asm-offsets.h>
1062306a36Sopenharmony_ci#include <asm/feature-fixups.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci_GLOBAL_TOC(copy_page)
1362306a36Sopenharmony_ciBEGIN_FTR_SECTION
1462306a36Sopenharmony_ci	lis	r5,PAGE_SIZE@h
1562306a36Sopenharmony_ciFTR_SECTION_ELSE
1662306a36Sopenharmony_ci#ifdef CONFIG_PPC_BOOK3S_64
1762306a36Sopenharmony_ci	b	copypage_power7
1862306a36Sopenharmony_ci#endif
1962306a36Sopenharmony_ciALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY)
2062306a36Sopenharmony_ci	ori	r5,r5,PAGE_SIZE@l
2162306a36Sopenharmony_ci#ifdef CONFIG_PPC_KERNEL_PCREL
2262306a36Sopenharmony_ci	/*
2362306a36Sopenharmony_ci	 * Hack for toolchain - prefixed instructions cause label difference to
2462306a36Sopenharmony_ci	 * be non-constant even if 8 byte alignment is known, so they can not
2562306a36Sopenharmony_ci	 * be put in FTR sections.
2662306a36Sopenharmony_ci	 */
2762306a36Sopenharmony_ci	LOAD_REG_ADDR(r10, ppc64_caches)
2862306a36Sopenharmony_ciBEGIN_FTR_SECTION
2962306a36Sopenharmony_ci#else
3062306a36Sopenharmony_ciBEGIN_FTR_SECTION
3162306a36Sopenharmony_ci	LOAD_REG_ADDR(r10, ppc64_caches)
3262306a36Sopenharmony_ci#endif
3362306a36Sopenharmony_ci	lwz	r11,DCACHEL1LOGBLOCKSIZE(r10)	/* log2 of cache block size */
3462306a36Sopenharmony_ci	lwz     r12,DCACHEL1BLOCKSIZE(r10)	/* get cache block size */
3562306a36Sopenharmony_ci	li	r9,0
3662306a36Sopenharmony_ci	srd	r8,r5,r11
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	mtctr	r8
3962306a36Sopenharmony_ci.Lsetup:
4062306a36Sopenharmony_ci	dcbt	r9,r4
4162306a36Sopenharmony_ci	dcbz	r9,r3
4262306a36Sopenharmony_ci	add	r9,r9,r12
4362306a36Sopenharmony_ci	bdnz	.Lsetup
4462306a36Sopenharmony_ciEND_FTR_SECTION_IFSET(CPU_FTR_CP_USE_DCBTZ)
4562306a36Sopenharmony_ci	addi	r3,r3,-8
4662306a36Sopenharmony_ci	srdi    r8,r5,7		/* page is copied in 128 byte strides */
4762306a36Sopenharmony_ci	addi	r8,r8,-1	/* one stride copied outside loop */
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	mtctr	r8
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	ld	r5,0(r4)
5262306a36Sopenharmony_ci	ld	r6,8(r4)
5362306a36Sopenharmony_ci	ld	r7,16(r4)
5462306a36Sopenharmony_ci	ldu	r8,24(r4)
5562306a36Sopenharmony_ci1:	std	r5,8(r3)
5662306a36Sopenharmony_ci	std	r6,16(r3)
5762306a36Sopenharmony_ci	ld	r9,8(r4)
5862306a36Sopenharmony_ci	ld	r10,16(r4)
5962306a36Sopenharmony_ci	std	r7,24(r3)
6062306a36Sopenharmony_ci	std	r8,32(r3)
6162306a36Sopenharmony_ci	ld	r11,24(r4)
6262306a36Sopenharmony_ci	ld	r12,32(r4)
6362306a36Sopenharmony_ci	std	r9,40(r3)
6462306a36Sopenharmony_ci	std	r10,48(r3)
6562306a36Sopenharmony_ci	ld	r5,40(r4)
6662306a36Sopenharmony_ci	ld	r6,48(r4)
6762306a36Sopenharmony_ci	std	r11,56(r3)
6862306a36Sopenharmony_ci	std	r12,64(r3)
6962306a36Sopenharmony_ci	ld	r7,56(r4)
7062306a36Sopenharmony_ci	ld	r8,64(r4)
7162306a36Sopenharmony_ci	std	r5,72(r3)
7262306a36Sopenharmony_ci	std	r6,80(r3)
7362306a36Sopenharmony_ci	ld	r9,72(r4)
7462306a36Sopenharmony_ci	ld	r10,80(r4)
7562306a36Sopenharmony_ci	std	r7,88(r3)
7662306a36Sopenharmony_ci	std	r8,96(r3)
7762306a36Sopenharmony_ci	ld	r11,88(r4)
7862306a36Sopenharmony_ci	ld	r12,96(r4)
7962306a36Sopenharmony_ci	std	r9,104(r3)
8062306a36Sopenharmony_ci	std	r10,112(r3)
8162306a36Sopenharmony_ci	ld	r5,104(r4)
8262306a36Sopenharmony_ci	ld	r6,112(r4)
8362306a36Sopenharmony_ci	std	r11,120(r3)
8462306a36Sopenharmony_ci	stdu	r12,128(r3)
8562306a36Sopenharmony_ci	ld	r7,120(r4)
8662306a36Sopenharmony_ci	ldu	r8,128(r4)
8762306a36Sopenharmony_ci	bdnz	1b
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	std	r5,8(r3)
9062306a36Sopenharmony_ci	std	r6,16(r3)
9162306a36Sopenharmony_ci	ld	r9,8(r4)
9262306a36Sopenharmony_ci	ld	r10,16(r4)
9362306a36Sopenharmony_ci	std	r7,24(r3)
9462306a36Sopenharmony_ci	std	r8,32(r3)
9562306a36Sopenharmony_ci	ld	r11,24(r4)
9662306a36Sopenharmony_ci	ld	r12,32(r4)
9762306a36Sopenharmony_ci	std	r9,40(r3)
9862306a36Sopenharmony_ci	std	r10,48(r3)
9962306a36Sopenharmony_ci	ld	r5,40(r4)
10062306a36Sopenharmony_ci	ld	r6,48(r4)
10162306a36Sopenharmony_ci	std	r11,56(r3)
10262306a36Sopenharmony_ci	std	r12,64(r3)
10362306a36Sopenharmony_ci	ld	r7,56(r4)
10462306a36Sopenharmony_ci	ld	r8,64(r4)
10562306a36Sopenharmony_ci	std	r5,72(r3)
10662306a36Sopenharmony_ci	std	r6,80(r3)
10762306a36Sopenharmony_ci	ld	r9,72(r4)
10862306a36Sopenharmony_ci	ld	r10,80(r4)
10962306a36Sopenharmony_ci	std	r7,88(r3)
11062306a36Sopenharmony_ci	std	r8,96(r3)
11162306a36Sopenharmony_ci	ld	r11,88(r4)
11262306a36Sopenharmony_ci	ld	r12,96(r4)
11362306a36Sopenharmony_ci	std	r9,104(r3)
11462306a36Sopenharmony_ci	std	r10,112(r3)
11562306a36Sopenharmony_ci	std	r11,120(r3)
11662306a36Sopenharmony_ci	std	r12,128(r3)
11762306a36Sopenharmony_ci	blr
11862306a36Sopenharmony_ciEXPORT_SYMBOL(copy_page)
119