18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright 2016-17 IBM Corp. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci#include <asm/ppc-opcode.h> 68c2ecf20Sopenharmony_ci#include <asm/reg.h> 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci/* 98c2ecf20Sopenharmony_ci * Copy/paste instructions: 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * copy RA,RB 128c2ecf20Sopenharmony_ci * Copy contents of address (RA) + effective_address(RB) 138c2ecf20Sopenharmony_ci * to internal copy-buffer. 148c2ecf20Sopenharmony_ci * 158c2ecf20Sopenharmony_ci * paste RA,RB 168c2ecf20Sopenharmony_ci * Paste contents of internal copy-buffer to the address 178c2ecf20Sopenharmony_ci * (RA) + effective_address(RB) 188c2ecf20Sopenharmony_ci */ 198c2ecf20Sopenharmony_cistatic inline int vas_copy(void *crb, int offset) 208c2ecf20Sopenharmony_ci{ 218c2ecf20Sopenharmony_ci asm volatile(PPC_COPY(%0, %1)";" 228c2ecf20Sopenharmony_ci : 238c2ecf20Sopenharmony_ci : "b" (offset), "b" (crb) 248c2ecf20Sopenharmony_ci : "memory"); 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci return 0; 278c2ecf20Sopenharmony_ci} 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_cistatic inline int vas_paste(void *paste_address, int offset) 308c2ecf20Sopenharmony_ci{ 318c2ecf20Sopenharmony_ci u32 cr; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci cr = 0; 348c2ecf20Sopenharmony_ci asm volatile(PPC_PASTE(%1, %2)";" 358c2ecf20Sopenharmony_ci "mfocrf %0, 0x80;" 368c2ecf20Sopenharmony_ci : "=r" (cr) 378c2ecf20Sopenharmony_ci : "b" (offset), "b" (paste_address) 388c2ecf20Sopenharmony_ci : "memory", "cr0"); 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci /* We mask with 0xE to ignore SO */ 418c2ecf20Sopenharmony_ci return (cr >> CR0_SHIFT) & 0xE; 428c2ecf20Sopenharmony_ci} 43