1 /* 2 * This file is subject to the terms and conditions of the GNU General Public 3 * License. See the file "COPYING" in the main directory of this archive 4 * for more details. 5 * 6 * Copyright (C) 2014 Imagination Technologies Ltd. 7 * 8 */ 9 10 #ifndef __ASM_ASM_EVA_H 11 #define __ASM_ASM_EVA_H 12 13 #ifndef __ASSEMBLY__ 14 15 /* Kernel variants */ 16 17 #define kernel_cache(op, base) "cache " op ", " base "\n" 18 #define kernel_pref(hint, base) "pref " hint ", " base "\n" 19 #define kernel_ll(reg, addr) "ll " reg ", " addr "\n" 20 #define kernel_sc(reg, addr) "sc " reg ", " addr "\n" 21 #define kernel_lw(reg, addr) "lw " reg ", " addr "\n" 22 #define kernel_lwl(reg, addr) "lwl " reg ", " addr "\n" 23 #define kernel_lwr(reg, addr) "lwr " reg ", " addr "\n" 24 #define kernel_lh(reg, addr) "lh " reg ", " addr "\n" 25 #define kernel_lb(reg, addr) "lb " reg ", " addr "\n" 26 #define kernel_lbu(reg, addr) "lbu " reg ", " addr "\n" 27 #define kernel_sw(reg, addr) "sw " reg ", " addr "\n" 28 #define kernel_swl(reg, addr) "swl " reg ", " addr "\n" 29 #define kernel_swr(reg, addr) "swr " reg ", " addr "\n" 30 #define kernel_sh(reg, addr) "sh " reg ", " addr "\n" 31 #define kernel_sb(reg, addr) "sb " reg ", " addr "\n" 32 33 #ifdef CONFIG_32BIT 34 /* 35 * No 'sd' or 'ld' instructions in 32-bit but the code will 36 * do the correct thing 37 */ 38 #define kernel_sd(reg, addr) user_sw(reg, addr) 39 #define kernel_ld(reg, addr) user_lw(reg, addr) 40 #else 41 #define kernel_sd(reg, addr) "sd " reg", " addr "\n" 42 #define kernel_ld(reg, addr) "ld " reg", " addr "\n" 43 #endif /* CONFIG_32BIT */ 44 45 #ifdef CONFIG_EVA 46 47 #define __BUILD_EVA_INSN(insn, reg, addr) \ 48 " .set push\n" \ 49 " .set mips0\n" \ 50 " .set eva\n" \ 51 " "insn" "reg", "addr "\n" \ 52 " .set pop\n" 53 54 #define user_cache(op, base) __BUILD_EVA_INSN("cachee", op, base) 55 #define user_pref(hint, base) __BUILD_EVA_INSN("prefe", hint, base) 56 #define user_ll(reg, addr) __BUILD_EVA_INSN("lle", reg, addr) 57 #define user_sc(reg, addr) __BUILD_EVA_INSN("sce", reg, addr) 58 #define user_lw(reg, addr) __BUILD_EVA_INSN("lwe", reg, addr) 59 #define user_lwl(reg, addr) __BUILD_EVA_INSN("lwle", reg, addr) 60 #define user_lwr(reg, addr) __BUILD_EVA_INSN("lwre", reg, addr) 61 #define user_lh(reg, addr) __BUILD_EVA_INSN("lhe", reg, addr) 62 #define user_lb(reg, addr) __BUILD_EVA_INSN("lbe", reg, addr) 63 #define user_lbu(reg, addr) __BUILD_EVA_INSN("lbue", reg, addr) 64 /* No 64-bit EVA instruction for loading double words */ 65 #define user_ld(reg, addr) user_lw(reg, addr) 66 #define user_sw(reg, addr) __BUILD_EVA_INSN("swe", reg, addr) 67 #define user_swl(reg, addr) __BUILD_EVA_INSN("swle", reg, addr) 68 #define user_swr(reg, addr) __BUILD_EVA_INSN("swre", reg, addr) 69 #define user_sh(reg, addr) __BUILD_EVA_INSN("she", reg, addr) 70 #define user_sb(reg, addr) __BUILD_EVA_INSN("sbe", reg, addr) 71 /* No 64-bit EVA instruction for storing double words */ 72 #define user_sd(reg, addr) user_sw(reg, addr) 73 74 #else 75 76 #define user_cache(op, base) kernel_cache(op, base) 77 #define user_pref(hint, base) kernel_pref(hint, base) 78 #define user_ll(reg, addr) kernel_ll(reg, addr) 79 #define user_sc(reg, addr) kernel_sc(reg, addr) 80 #define user_lw(reg, addr) kernel_lw(reg, addr) 81 #define user_lwl(reg, addr) kernel_lwl(reg, addr) 82 #define user_lwr(reg, addr) kernel_lwr(reg, addr) 83 #define user_lh(reg, addr) kernel_lh(reg, addr) 84 #define user_lb(reg, addr) kernel_lb(reg, addr) 85 #define user_lbu(reg, addr) kernel_lbu(reg, addr) 86 #define user_sw(reg, addr) kernel_sw(reg, addr) 87 #define user_swl(reg, addr) kernel_swl(reg, addr) 88 #define user_swr(reg, addr) kernel_swr(reg, addr) 89 #define user_sh(reg, addr) kernel_sh(reg, addr) 90 #define user_sb(reg, addr) kernel_sb(reg, addr) 91 92 #ifdef CONFIG_32BIT 93 #define user_sd(reg, addr) kernel_sw(reg, addr) 94 #define user_ld(reg, addr) kernel_lw(reg, addr) 95 #else 96 #define user_sd(reg, addr) kernel_sd(reg, addr) 97 #define user_ld(reg, addr) kernel_ld(reg, addr) 98 #endif /* CONFIG_32BIT */ 99 100 #endif /* CONFIG_EVA */ 101 102 #else /* __ASSEMBLY__ */ 103 104 #define kernel_cache(op, base) cache op, base 105 #define kernel_pref(hint, base) pref hint, base 106 #define kernel_ll(reg, addr) ll reg, addr 107 #define kernel_sc(reg, addr) sc reg, addr 108 #define kernel_lw(reg, addr) lw reg, addr 109 #define kernel_lwl(reg, addr) lwl reg, addr 110 #define kernel_lwr(reg, addr) lwr reg, addr 111 #define kernel_lh(reg, addr) lh reg, addr 112 #define kernel_lb(reg, addr) lb reg, addr 113 #define kernel_lbu(reg, addr) lbu reg, addr 114 #define kernel_sw(reg, addr) sw reg, addr 115 #define kernel_swl(reg, addr) swl reg, addr 116 #define kernel_swr(reg, addr) swr reg, addr 117 #define kernel_sh(reg, addr) sh reg, addr 118 #define kernel_sb(reg, addr) sb reg, addr 119 120 #ifdef CONFIG_32BIT 121 /* 122 * No 'sd' or 'ld' instructions in 32-bit but the code will 123 * do the correct thing 124 */ 125 #define kernel_sd(reg, addr) user_sw(reg, addr) 126 #define kernel_ld(reg, addr) user_lw(reg, addr) 127 #else 128 #define kernel_sd(reg, addr) sd reg, addr 129 #define kernel_ld(reg, addr) ld reg, addr 130 #endif /* CONFIG_32BIT */ 131 132 #ifdef CONFIG_EVA 133 134 #define __BUILD_EVA_INSN(insn, reg, addr) \ 135 .set push; \ 136 .set mips0; \ 137 .set eva; \ 138 insn reg, addr; \ 139 .set pop; 140 141 #define user_cache(op, base) __BUILD_EVA_INSN(cachee, op, base) 142 #define user_pref(hint, base) __BUILD_EVA_INSN(prefe, hint, base) 143 #define user_ll(reg, addr) __BUILD_EVA_INSN(lle, reg, addr) 144 #define user_sc(reg, addr) __BUILD_EVA_INSN(sce, reg, addr) 145 #define user_lw(reg, addr) __BUILD_EVA_INSN(lwe, reg, addr) 146 #define user_lwl(reg, addr) __BUILD_EVA_INSN(lwle, reg, addr) 147 #define user_lwr(reg, addr) __BUILD_EVA_INSN(lwre, reg, addr) 148 #define user_lh(reg, addr) __BUILD_EVA_INSN(lhe, reg, addr) 149 #define user_lb(reg, addr) __BUILD_EVA_INSN(lbe, reg, addr) 150 #define user_lbu(reg, addr) __BUILD_EVA_INSN(lbue, reg, addr) 151 /* No 64-bit EVA instruction for loading double words */ 152 #define user_ld(reg, addr) user_lw(reg, addr) 153 #define user_sw(reg, addr) __BUILD_EVA_INSN(swe, reg, addr) 154 #define user_swl(reg, addr) __BUILD_EVA_INSN(swle, reg, addr) 155 #define user_swr(reg, addr) __BUILD_EVA_INSN(swre, reg, addr) 156 #define user_sh(reg, addr) __BUILD_EVA_INSN(she, reg, addr) 157 #define user_sb(reg, addr) __BUILD_EVA_INSN(sbe, reg, addr) 158 /* No 64-bit EVA instruction for loading double words */ 159 #define user_sd(reg, addr) user_sw(reg, addr) 160 #else 161 162 #define user_cache(op, base) kernel_cache(op, base) 163 #define user_pref(hint, base) kernel_pref(hint, base) 164 #define user_ll(reg, addr) kernel_ll(reg, addr) 165 #define user_sc(reg, addr) kernel_sc(reg, addr) 166 #define user_lw(reg, addr) kernel_lw(reg, addr) 167 #define user_lwl(reg, addr) kernel_lwl(reg, addr) 168 #define user_lwr(reg, addr) kernel_lwr(reg, addr) 169 #define user_lh(reg, addr) kernel_lh(reg, addr) 170 #define user_lb(reg, addr) kernel_lb(reg, addr) 171 #define user_lbu(reg, addr) kernel_lbu(reg, addr) 172 #define user_sw(reg, addr) kernel_sw(reg, addr) 173 #define user_swl(reg, addr) kernel_swl(reg, addr) 174 #define user_swr(reg, addr) kernel_swr(reg, addr) 175 #define user_sh(reg, addr) kernel_sh(reg, addr) 176 #define user_sb(reg, addr) kernel_sb(reg, addr) 177 178 #ifdef CONFIG_32BIT 179 #define user_sd(reg, addr) kernel_sw(reg, addr) 180 #define user_ld(reg, addr) kernel_lw(reg, addr) 181 #else 182 #define user_sd(reg, addr) kernel_sd(reg, addr) 183 #define user_ld(reg, addr) kernel_ld(reg, addr) 184 #endif /* CONFIG_32BIT */ 185 186 #endif /* CONFIG_EVA */ 187 188 #endif /* __ASSEMBLY__ */ 189 190 #endif /* __ASM_ASM_EVA_H */ 191