asm-eva.h 7.2 KB

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