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