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