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