18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public
38c2ecf20Sopenharmony_ci * License.  See the file "COPYING" in the main directory of this archive
48c2ecf20Sopenharmony_ci * for more details.
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Copyright (C) 2014 Imagination Technologies Ltd.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#ifndef __ASM_ASM_EVA_H
118c2ecf20Sopenharmony_ci#define __ASM_ASM_EVA_H
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci/* Kernel variants */
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#define kernel_cache(op, base)		"cache " op ", " base "\n"
188c2ecf20Sopenharmony_ci#define kernel_pref(hint, base)		"pref " hint ", " base "\n"
198c2ecf20Sopenharmony_ci#define kernel_ll(reg, addr)		"ll " reg ", " addr "\n"
208c2ecf20Sopenharmony_ci#define kernel_sc(reg, addr)		"sc " reg ", " addr "\n"
218c2ecf20Sopenharmony_ci#define kernel_lw(reg, addr)		"lw " reg ", " addr "\n"
228c2ecf20Sopenharmony_ci#define kernel_lwl(reg, addr)		"lwl " reg ", " addr "\n"
238c2ecf20Sopenharmony_ci#define kernel_lwr(reg, addr)		"lwr " reg ", " addr "\n"
248c2ecf20Sopenharmony_ci#define kernel_lh(reg, addr)		"lh " reg ", " addr "\n"
258c2ecf20Sopenharmony_ci#define kernel_lb(reg, addr)		"lb " reg ", " addr "\n"
268c2ecf20Sopenharmony_ci#define kernel_lbu(reg, addr)		"lbu " reg ", " addr "\n"
278c2ecf20Sopenharmony_ci#define kernel_sw(reg, addr)		"sw " reg ", " addr "\n"
288c2ecf20Sopenharmony_ci#define kernel_swl(reg, addr)		"swl " reg ", " addr "\n"
298c2ecf20Sopenharmony_ci#define kernel_swr(reg, addr)		"swr " reg ", " addr "\n"
308c2ecf20Sopenharmony_ci#define kernel_sh(reg, addr)		"sh " reg ", " addr "\n"
318c2ecf20Sopenharmony_ci#define kernel_sb(reg, addr)		"sb " reg ", " addr "\n"
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci#ifdef CONFIG_32BIT
348c2ecf20Sopenharmony_ci/*
358c2ecf20Sopenharmony_ci * No 'sd' or 'ld' instructions in 32-bit but the code will
368c2ecf20Sopenharmony_ci * do the correct thing
378c2ecf20Sopenharmony_ci */
388c2ecf20Sopenharmony_ci#define kernel_sd(reg, addr)		user_sw(reg, addr)
398c2ecf20Sopenharmony_ci#define kernel_ld(reg, addr)		user_lw(reg, addr)
408c2ecf20Sopenharmony_ci#else
418c2ecf20Sopenharmony_ci#define kernel_sd(reg, addr)		"sd " reg", " addr "\n"
428c2ecf20Sopenharmony_ci#define kernel_ld(reg, addr)		"ld " reg", " addr "\n"
438c2ecf20Sopenharmony_ci#endif /* CONFIG_32BIT */
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci#ifdef CONFIG_EVA
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci#define __BUILD_EVA_INSN(insn, reg, addr)				\
488c2ecf20Sopenharmony_ci				"	.set	push\n"			\
498c2ecf20Sopenharmony_ci				"	.set	mips0\n"		\
508c2ecf20Sopenharmony_ci				"	.set	eva\n"			\
518c2ecf20Sopenharmony_ci				"	"insn" "reg", "addr "\n"	\
528c2ecf20Sopenharmony_ci				"	.set	pop\n"
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci#define user_cache(op, base)		__BUILD_EVA_INSN("cachee", op, base)
558c2ecf20Sopenharmony_ci#define user_pref(hint, base)		__BUILD_EVA_INSN("prefe", hint, base)
568c2ecf20Sopenharmony_ci#define user_ll(reg, addr)		__BUILD_EVA_INSN("lle", reg, addr)
578c2ecf20Sopenharmony_ci#define user_sc(reg, addr)		__BUILD_EVA_INSN("sce", reg, addr)
588c2ecf20Sopenharmony_ci#define user_lw(reg, addr)		__BUILD_EVA_INSN("lwe", reg, addr)
598c2ecf20Sopenharmony_ci#define user_lwl(reg, addr)		__BUILD_EVA_INSN("lwle", reg, addr)
608c2ecf20Sopenharmony_ci#define user_lwr(reg, addr)		__BUILD_EVA_INSN("lwre", reg, addr)
618c2ecf20Sopenharmony_ci#define user_lh(reg, addr)		__BUILD_EVA_INSN("lhe", reg, addr)
628c2ecf20Sopenharmony_ci#define user_lb(reg, addr)		__BUILD_EVA_INSN("lbe", reg, addr)
638c2ecf20Sopenharmony_ci#define user_lbu(reg, addr)		__BUILD_EVA_INSN("lbue", reg, addr)
648c2ecf20Sopenharmony_ci/* No 64-bit EVA instruction for loading double words */
658c2ecf20Sopenharmony_ci#define user_ld(reg, addr)		user_lw(reg, addr)
668c2ecf20Sopenharmony_ci#define user_sw(reg, addr)		__BUILD_EVA_INSN("swe", reg, addr)
678c2ecf20Sopenharmony_ci#define user_swl(reg, addr)		__BUILD_EVA_INSN("swle", reg, addr)
688c2ecf20Sopenharmony_ci#define user_swr(reg, addr)		__BUILD_EVA_INSN("swre", reg, addr)
698c2ecf20Sopenharmony_ci#define user_sh(reg, addr)		__BUILD_EVA_INSN("she", reg, addr)
708c2ecf20Sopenharmony_ci#define user_sb(reg, addr)		__BUILD_EVA_INSN("sbe", reg, addr)
718c2ecf20Sopenharmony_ci/* No 64-bit EVA instruction for storing double words */
728c2ecf20Sopenharmony_ci#define user_sd(reg, addr)		user_sw(reg, addr)
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci#else
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ci#define user_cache(op, base)		kernel_cache(op, base)
778c2ecf20Sopenharmony_ci#define user_pref(hint, base)		kernel_pref(hint, base)
788c2ecf20Sopenharmony_ci#define user_ll(reg, addr)		kernel_ll(reg, addr)
798c2ecf20Sopenharmony_ci#define user_sc(reg, addr)		kernel_sc(reg, addr)
808c2ecf20Sopenharmony_ci#define user_lw(reg, addr)		kernel_lw(reg, addr)
818c2ecf20Sopenharmony_ci#define user_lwl(reg, addr)		kernel_lwl(reg, addr)
828c2ecf20Sopenharmony_ci#define user_lwr(reg, addr)		kernel_lwr(reg, addr)
838c2ecf20Sopenharmony_ci#define user_lh(reg, addr)		kernel_lh(reg, addr)
848c2ecf20Sopenharmony_ci#define user_lb(reg, addr)		kernel_lb(reg, addr)
858c2ecf20Sopenharmony_ci#define user_lbu(reg, addr)		kernel_lbu(reg, addr)
868c2ecf20Sopenharmony_ci#define user_sw(reg, addr)		kernel_sw(reg, addr)
878c2ecf20Sopenharmony_ci#define user_swl(reg, addr)		kernel_swl(reg, addr)
888c2ecf20Sopenharmony_ci#define user_swr(reg, addr)		kernel_swr(reg, addr)
898c2ecf20Sopenharmony_ci#define user_sh(reg, addr)		kernel_sh(reg, addr)
908c2ecf20Sopenharmony_ci#define user_sb(reg, addr)		kernel_sb(reg, addr)
918c2ecf20Sopenharmony_ci
928c2ecf20Sopenharmony_ci#ifdef CONFIG_32BIT
938c2ecf20Sopenharmony_ci#define user_sd(reg, addr)		kernel_sw(reg, addr)
948c2ecf20Sopenharmony_ci#define user_ld(reg, addr)		kernel_lw(reg, addr)
958c2ecf20Sopenharmony_ci#else
968c2ecf20Sopenharmony_ci#define user_sd(reg, addr)		kernel_sd(reg, addr)
978c2ecf20Sopenharmony_ci#define user_ld(reg, addr)		kernel_ld(reg, addr)
988c2ecf20Sopenharmony_ci#endif /* CONFIG_32BIT */
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci#endif /* CONFIG_EVA */
1018c2ecf20Sopenharmony_ci
1028c2ecf20Sopenharmony_ci#else /* __ASSEMBLY__ */
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci#define kernel_cache(op, base)		cache op, base
1058c2ecf20Sopenharmony_ci#define kernel_pref(hint, base)		pref hint, base
1068c2ecf20Sopenharmony_ci#define kernel_ll(reg, addr)		ll reg, addr
1078c2ecf20Sopenharmony_ci#define kernel_sc(reg, addr)		sc reg, addr
1088c2ecf20Sopenharmony_ci#define kernel_lw(reg, addr)		lw reg, addr
1098c2ecf20Sopenharmony_ci#define kernel_lwl(reg, addr)		lwl reg, addr
1108c2ecf20Sopenharmony_ci#define kernel_lwr(reg, addr)		lwr reg, addr
1118c2ecf20Sopenharmony_ci#define kernel_lh(reg, addr)		lh reg, addr
1128c2ecf20Sopenharmony_ci#define kernel_lb(reg, addr)		lb reg, addr
1138c2ecf20Sopenharmony_ci#define kernel_lbu(reg, addr)		lbu reg, addr
1148c2ecf20Sopenharmony_ci#define kernel_sw(reg, addr)		sw reg, addr
1158c2ecf20Sopenharmony_ci#define kernel_swl(reg, addr)		swl reg, addr
1168c2ecf20Sopenharmony_ci#define kernel_swr(reg, addr)		swr reg, addr
1178c2ecf20Sopenharmony_ci#define kernel_sh(reg, addr)		sh reg, addr
1188c2ecf20Sopenharmony_ci#define kernel_sb(reg, addr)		sb reg, addr
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_ci#ifdef CONFIG_32BIT
1218c2ecf20Sopenharmony_ci/*
1228c2ecf20Sopenharmony_ci * No 'sd' or 'ld' instructions in 32-bit but the code will
1238c2ecf20Sopenharmony_ci * do the correct thing
1248c2ecf20Sopenharmony_ci */
1258c2ecf20Sopenharmony_ci#define kernel_sd(reg, addr)		user_sw(reg, addr)
1268c2ecf20Sopenharmony_ci#define kernel_ld(reg, addr)		user_lw(reg, addr)
1278c2ecf20Sopenharmony_ci#else
1288c2ecf20Sopenharmony_ci#define kernel_sd(reg, addr)		sd reg, addr
1298c2ecf20Sopenharmony_ci#define kernel_ld(reg, addr)		ld reg, addr
1308c2ecf20Sopenharmony_ci#endif /* CONFIG_32BIT */
1318c2ecf20Sopenharmony_ci
1328c2ecf20Sopenharmony_ci#ifdef CONFIG_EVA
1338c2ecf20Sopenharmony_ci
1348c2ecf20Sopenharmony_ci#define __BUILD_EVA_INSN(insn, reg, addr)			\
1358c2ecf20Sopenharmony_ci				.set	push;			\
1368c2ecf20Sopenharmony_ci				.set	mips0;			\
1378c2ecf20Sopenharmony_ci				.set	eva;			\
1388c2ecf20Sopenharmony_ci				insn reg, addr;			\
1398c2ecf20Sopenharmony_ci				.set	pop;
1408c2ecf20Sopenharmony_ci
1418c2ecf20Sopenharmony_ci#define user_cache(op, base)		__BUILD_EVA_INSN(cachee, op, base)
1428c2ecf20Sopenharmony_ci#define user_pref(hint, base)		__BUILD_EVA_INSN(prefe, hint, base)
1438c2ecf20Sopenharmony_ci#define user_ll(reg, addr)		__BUILD_EVA_INSN(lle, reg, addr)
1448c2ecf20Sopenharmony_ci#define user_sc(reg, addr)		__BUILD_EVA_INSN(sce, reg, addr)
1458c2ecf20Sopenharmony_ci#define user_lw(reg, addr)		__BUILD_EVA_INSN(lwe, reg, addr)
1468c2ecf20Sopenharmony_ci#define user_lwl(reg, addr)		__BUILD_EVA_INSN(lwle, reg, addr)
1478c2ecf20Sopenharmony_ci#define user_lwr(reg, addr)		__BUILD_EVA_INSN(lwre, reg, addr)
1488c2ecf20Sopenharmony_ci#define user_lh(reg, addr)		__BUILD_EVA_INSN(lhe, reg, addr)
1498c2ecf20Sopenharmony_ci#define user_lb(reg, addr)		__BUILD_EVA_INSN(lbe, reg, addr)
1508c2ecf20Sopenharmony_ci#define user_lbu(reg, addr)		__BUILD_EVA_INSN(lbue, reg, addr)
1518c2ecf20Sopenharmony_ci/* No 64-bit EVA instruction for loading double words */
1528c2ecf20Sopenharmony_ci#define user_ld(reg, addr)		user_lw(reg, addr)
1538c2ecf20Sopenharmony_ci#define user_sw(reg, addr)		__BUILD_EVA_INSN(swe, reg, addr)
1548c2ecf20Sopenharmony_ci#define user_swl(reg, addr)		__BUILD_EVA_INSN(swle, reg, addr)
1558c2ecf20Sopenharmony_ci#define user_swr(reg, addr)		__BUILD_EVA_INSN(swre, reg, addr)
1568c2ecf20Sopenharmony_ci#define user_sh(reg, addr)		__BUILD_EVA_INSN(she, reg, addr)
1578c2ecf20Sopenharmony_ci#define user_sb(reg, addr)		__BUILD_EVA_INSN(sbe, reg, addr)
1588c2ecf20Sopenharmony_ci/* No 64-bit EVA instruction for loading double words */
1598c2ecf20Sopenharmony_ci#define user_sd(reg, addr)		user_sw(reg, addr)
1608c2ecf20Sopenharmony_ci#else
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci#define user_cache(op, base)		kernel_cache(op, base)
1638c2ecf20Sopenharmony_ci#define user_pref(hint, base)		kernel_pref(hint, base)
1648c2ecf20Sopenharmony_ci#define user_ll(reg, addr)		kernel_ll(reg, addr)
1658c2ecf20Sopenharmony_ci#define user_sc(reg, addr)		kernel_sc(reg, addr)
1668c2ecf20Sopenharmony_ci#define user_lw(reg, addr)		kernel_lw(reg, addr)
1678c2ecf20Sopenharmony_ci#define user_lwl(reg, addr)		kernel_lwl(reg, addr)
1688c2ecf20Sopenharmony_ci#define user_lwr(reg, addr)		kernel_lwr(reg, addr)
1698c2ecf20Sopenharmony_ci#define user_lh(reg, addr)		kernel_lh(reg, addr)
1708c2ecf20Sopenharmony_ci#define user_lb(reg, addr)		kernel_lb(reg, addr)
1718c2ecf20Sopenharmony_ci#define user_lbu(reg, addr)		kernel_lbu(reg, addr)
1728c2ecf20Sopenharmony_ci#define user_sw(reg, addr)		kernel_sw(reg, addr)
1738c2ecf20Sopenharmony_ci#define user_swl(reg, addr)		kernel_swl(reg, addr)
1748c2ecf20Sopenharmony_ci#define user_swr(reg, addr)		kernel_swr(reg, addr)
1758c2ecf20Sopenharmony_ci#define user_sh(reg, addr)		kernel_sh(reg, addr)
1768c2ecf20Sopenharmony_ci#define user_sb(reg, addr)		kernel_sb(reg, addr)
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci#ifdef CONFIG_32BIT
1798c2ecf20Sopenharmony_ci#define user_sd(reg, addr)		kernel_sw(reg, addr)
1808c2ecf20Sopenharmony_ci#define user_ld(reg, addr)		kernel_lw(reg, addr)
1818c2ecf20Sopenharmony_ci#else
1828c2ecf20Sopenharmony_ci#define user_sd(reg, addr)		kernel_sd(reg, addr)
1838c2ecf20Sopenharmony_ci#define user_ld(reg, addr)		kernel_ld(reg, addr)
1848c2ecf20Sopenharmony_ci#endif /* CONFIG_32BIT */
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci#endif /* CONFIG_EVA */
1878c2ecf20Sopenharmony_ci
1888c2ecf20Sopenharmony_ci#endif /* __ASSEMBLY__ */
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_ci#endif /* __ASM_ASM_EVA_H */
191