xref: /OK3568_Linux_fs/kernel/arch/powerpc/lib/copypage_64.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun/*
3*4882a593Smuzhiyun * Copyright (C) 2008 Mark Nelson, IBM Corp.
4*4882a593Smuzhiyun */
5*4882a593Smuzhiyun#include <asm/page.h>
6*4882a593Smuzhiyun#include <asm/processor.h>
7*4882a593Smuzhiyun#include <asm/ppc_asm.h>
8*4882a593Smuzhiyun#include <asm/asm-offsets.h>
9*4882a593Smuzhiyun#include <asm/export.h>
10*4882a593Smuzhiyun#include <asm/feature-fixups.h>
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun        .section        ".toc","aw"
13*4882a593SmuzhiyunPPC64_CACHES:
14*4882a593Smuzhiyun        .tc             ppc64_caches[TC],ppc64_caches
15*4882a593Smuzhiyun        .section        ".text"
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun_GLOBAL_TOC(copy_page)
18*4882a593SmuzhiyunBEGIN_FTR_SECTION
19*4882a593Smuzhiyun	lis	r5,PAGE_SIZE@h
20*4882a593SmuzhiyunFTR_SECTION_ELSE
21*4882a593Smuzhiyun#ifdef CONFIG_PPC_BOOK3S_64
22*4882a593Smuzhiyun	b	copypage_power7
23*4882a593Smuzhiyun#endif
24*4882a593SmuzhiyunALT_FTR_SECTION_END_IFCLR(CPU_FTR_VMX_COPY)
25*4882a593Smuzhiyun	ori	r5,r5,PAGE_SIZE@l
26*4882a593SmuzhiyunBEGIN_FTR_SECTION
27*4882a593Smuzhiyun	ld      r10,PPC64_CACHES@toc(r2)
28*4882a593Smuzhiyun	lwz	r11,DCACHEL1LOGBLOCKSIZE(r10)	/* log2 of cache block size */
29*4882a593Smuzhiyun	lwz     r12,DCACHEL1BLOCKSIZE(r10)	/* get cache block size */
30*4882a593Smuzhiyun	li	r9,0
31*4882a593Smuzhiyun	srd	r8,r5,r11
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun	mtctr	r8
34*4882a593Smuzhiyun.Lsetup:
35*4882a593Smuzhiyun	dcbt	r9,r4
36*4882a593Smuzhiyun	dcbz	r9,r3
37*4882a593Smuzhiyun	add	r9,r9,r12
38*4882a593Smuzhiyun	bdnz	.Lsetup
39*4882a593SmuzhiyunEND_FTR_SECTION_IFSET(CPU_FTR_CP_USE_DCBTZ)
40*4882a593Smuzhiyun	addi	r3,r3,-8
41*4882a593Smuzhiyun	srdi    r8,r5,7		/* page is copied in 128 byte strides */
42*4882a593Smuzhiyun	addi	r8,r8,-1	/* one stride copied outside loop */
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun	mtctr	r8
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun	ld	r5,0(r4)
47*4882a593Smuzhiyun	ld	r6,8(r4)
48*4882a593Smuzhiyun	ld	r7,16(r4)
49*4882a593Smuzhiyun	ldu	r8,24(r4)
50*4882a593Smuzhiyun1:	std	r5,8(r3)
51*4882a593Smuzhiyun	std	r6,16(r3)
52*4882a593Smuzhiyun	ld	r9,8(r4)
53*4882a593Smuzhiyun	ld	r10,16(r4)
54*4882a593Smuzhiyun	std	r7,24(r3)
55*4882a593Smuzhiyun	std	r8,32(r3)
56*4882a593Smuzhiyun	ld	r11,24(r4)
57*4882a593Smuzhiyun	ld	r12,32(r4)
58*4882a593Smuzhiyun	std	r9,40(r3)
59*4882a593Smuzhiyun	std	r10,48(r3)
60*4882a593Smuzhiyun	ld	r5,40(r4)
61*4882a593Smuzhiyun	ld	r6,48(r4)
62*4882a593Smuzhiyun	std	r11,56(r3)
63*4882a593Smuzhiyun	std	r12,64(r3)
64*4882a593Smuzhiyun	ld	r7,56(r4)
65*4882a593Smuzhiyun	ld	r8,64(r4)
66*4882a593Smuzhiyun	std	r5,72(r3)
67*4882a593Smuzhiyun	std	r6,80(r3)
68*4882a593Smuzhiyun	ld	r9,72(r4)
69*4882a593Smuzhiyun	ld	r10,80(r4)
70*4882a593Smuzhiyun	std	r7,88(r3)
71*4882a593Smuzhiyun	std	r8,96(r3)
72*4882a593Smuzhiyun	ld	r11,88(r4)
73*4882a593Smuzhiyun	ld	r12,96(r4)
74*4882a593Smuzhiyun	std	r9,104(r3)
75*4882a593Smuzhiyun	std	r10,112(r3)
76*4882a593Smuzhiyun	ld	r5,104(r4)
77*4882a593Smuzhiyun	ld	r6,112(r4)
78*4882a593Smuzhiyun	std	r11,120(r3)
79*4882a593Smuzhiyun	stdu	r12,128(r3)
80*4882a593Smuzhiyun	ld	r7,120(r4)
81*4882a593Smuzhiyun	ldu	r8,128(r4)
82*4882a593Smuzhiyun	bdnz	1b
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun	std	r5,8(r3)
85*4882a593Smuzhiyun	std	r6,16(r3)
86*4882a593Smuzhiyun	ld	r9,8(r4)
87*4882a593Smuzhiyun	ld	r10,16(r4)
88*4882a593Smuzhiyun	std	r7,24(r3)
89*4882a593Smuzhiyun	std	r8,32(r3)
90*4882a593Smuzhiyun	ld	r11,24(r4)
91*4882a593Smuzhiyun	ld	r12,32(r4)
92*4882a593Smuzhiyun	std	r9,40(r3)
93*4882a593Smuzhiyun	std	r10,48(r3)
94*4882a593Smuzhiyun	ld	r5,40(r4)
95*4882a593Smuzhiyun	ld	r6,48(r4)
96*4882a593Smuzhiyun	std	r11,56(r3)
97*4882a593Smuzhiyun	std	r12,64(r3)
98*4882a593Smuzhiyun	ld	r7,56(r4)
99*4882a593Smuzhiyun	ld	r8,64(r4)
100*4882a593Smuzhiyun	std	r5,72(r3)
101*4882a593Smuzhiyun	std	r6,80(r3)
102*4882a593Smuzhiyun	ld	r9,72(r4)
103*4882a593Smuzhiyun	ld	r10,80(r4)
104*4882a593Smuzhiyun	std	r7,88(r3)
105*4882a593Smuzhiyun	std	r8,96(r3)
106*4882a593Smuzhiyun	ld	r11,88(r4)
107*4882a593Smuzhiyun	ld	r12,96(r4)
108*4882a593Smuzhiyun	std	r9,104(r3)
109*4882a593Smuzhiyun	std	r10,112(r3)
110*4882a593Smuzhiyun	std	r11,120(r3)
111*4882a593Smuzhiyun	std	r12,128(r3)
112*4882a593Smuzhiyun	blr
113*4882a593SmuzhiyunEXPORT_SYMBOL(copy_page)
114