vc4_qpu_defines.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /*
  2. * Copyright © 2014 Broadcom
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the next
  12. * paragraph) shall be included in all copies or substantial portions of the
  13. * Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  21. * IN THE SOFTWARE.
  22. */
  23. #ifndef VC4_QPU_DEFINES_H
  24. #define VC4_QPU_DEFINES_H
  25. enum qpu_op_add {
  26. QPU_A_NOP,
  27. QPU_A_FADD,
  28. QPU_A_FSUB,
  29. QPU_A_FMIN,
  30. QPU_A_FMAX,
  31. QPU_A_FMINABS,
  32. QPU_A_FMAXABS,
  33. QPU_A_FTOI,
  34. QPU_A_ITOF,
  35. QPU_A_ADD = 12,
  36. QPU_A_SUB,
  37. QPU_A_SHR,
  38. QPU_A_ASR,
  39. QPU_A_ROR,
  40. QPU_A_SHL,
  41. QPU_A_MIN,
  42. QPU_A_MAX,
  43. QPU_A_AND,
  44. QPU_A_OR,
  45. QPU_A_XOR,
  46. QPU_A_NOT,
  47. QPU_A_CLZ,
  48. QPU_A_V8ADDS = 30,
  49. QPU_A_V8SUBS = 31,
  50. };
  51. enum qpu_op_mul {
  52. QPU_M_NOP,
  53. QPU_M_FMUL,
  54. QPU_M_MUL24,
  55. QPU_M_V8MULD,
  56. QPU_M_V8MIN,
  57. QPU_M_V8MAX,
  58. QPU_M_V8ADDS,
  59. QPU_M_V8SUBS,
  60. };
  61. enum qpu_raddr {
  62. QPU_R_FRAG_PAYLOAD_ZW = 15, /* W for A file, Z for B file */
  63. /* 0-31 are the plain regfile a or b fields */
  64. QPU_R_UNIF = 32,
  65. QPU_R_VARY = 35,
  66. QPU_R_ELEM_QPU = 38,
  67. QPU_R_NOP,
  68. QPU_R_XY_PIXEL_COORD = 41,
  69. QPU_R_MS_REV_FLAGS = 42,
  70. QPU_R_VPM = 48,
  71. QPU_R_VPM_LD_BUSY,
  72. QPU_R_VPM_LD_WAIT,
  73. QPU_R_MUTEX_ACQUIRE,
  74. };
  75. enum qpu_waddr {
  76. /* 0-31 are the plain regfile a or b fields */
  77. QPU_W_ACC0 = 32, /* aka r0 */
  78. QPU_W_ACC1,
  79. QPU_W_ACC2,
  80. QPU_W_ACC3,
  81. QPU_W_TMU_NOSWAP,
  82. QPU_W_ACC5,
  83. QPU_W_HOST_INT,
  84. QPU_W_NOP,
  85. QPU_W_UNIFORMS_ADDRESS,
  86. QPU_W_QUAD_XY, /* X for regfile a, Y for regfile b */
  87. QPU_W_MS_FLAGS = 42,
  88. QPU_W_REV_FLAG = 42,
  89. QPU_W_TLB_STENCIL_SETUP = 43,
  90. QPU_W_TLB_Z,
  91. QPU_W_TLB_COLOR_MS,
  92. QPU_W_TLB_COLOR_ALL,
  93. QPU_W_TLB_ALPHA_MASK,
  94. QPU_W_VPM,
  95. QPU_W_VPMVCD_SETUP, /* LD for regfile a, ST for regfile b */
  96. QPU_W_VPM_ADDR, /* LD for regfile a, ST for regfile b */
  97. QPU_W_MUTEX_RELEASE,
  98. QPU_W_SFU_RECIP,
  99. QPU_W_SFU_RECIPSQRT,
  100. QPU_W_SFU_EXP,
  101. QPU_W_SFU_LOG,
  102. QPU_W_TMU0_S,
  103. QPU_W_TMU0_T,
  104. QPU_W_TMU0_R,
  105. QPU_W_TMU0_B,
  106. QPU_W_TMU1_S,
  107. QPU_W_TMU1_T,
  108. QPU_W_TMU1_R,
  109. QPU_W_TMU1_B,
  110. };
  111. enum qpu_sig_bits {
  112. QPU_SIG_SW_BREAKPOINT,
  113. QPU_SIG_NONE,
  114. QPU_SIG_THREAD_SWITCH,
  115. QPU_SIG_PROG_END,
  116. QPU_SIG_WAIT_FOR_SCOREBOARD,
  117. QPU_SIG_SCOREBOARD_UNLOCK,
  118. QPU_SIG_LAST_THREAD_SWITCH,
  119. QPU_SIG_COVERAGE_LOAD,
  120. QPU_SIG_COLOR_LOAD,
  121. QPU_SIG_COLOR_LOAD_END,
  122. QPU_SIG_LOAD_TMU0,
  123. QPU_SIG_LOAD_TMU1,
  124. QPU_SIG_ALPHA_MASK_LOAD,
  125. QPU_SIG_SMALL_IMM,
  126. QPU_SIG_LOAD_IMM,
  127. QPU_SIG_BRANCH
  128. };
  129. enum qpu_mux {
  130. /* hardware mux values */
  131. QPU_MUX_R0,
  132. QPU_MUX_R1,
  133. QPU_MUX_R2,
  134. QPU_MUX_R3,
  135. QPU_MUX_R4,
  136. QPU_MUX_R5,
  137. QPU_MUX_A,
  138. QPU_MUX_B,
  139. /**
  140. * Non-hardware mux value, stores a small immediate field to be
  141. * programmed into raddr_b in the qpu_reg.index.
  142. */
  143. QPU_MUX_SMALL_IMM,
  144. };
  145. enum qpu_cond {
  146. QPU_COND_NEVER,
  147. QPU_COND_ALWAYS,
  148. QPU_COND_ZS,
  149. QPU_COND_ZC,
  150. QPU_COND_NS,
  151. QPU_COND_NC,
  152. QPU_COND_CS,
  153. QPU_COND_CC,
  154. };
  155. enum qpu_pack_mul {
  156. QPU_PACK_MUL_NOP,
  157. QPU_PACK_MUL_8888 = 3, /* replicated to each 8 bits of the 32-bit dst. */
  158. QPU_PACK_MUL_8A,
  159. QPU_PACK_MUL_8B,
  160. QPU_PACK_MUL_8C,
  161. QPU_PACK_MUL_8D,
  162. };
  163. enum qpu_pack_a {
  164. QPU_PACK_A_NOP,
  165. /* convert to 16 bit float if float input, or to int16. */
  166. QPU_PACK_A_16A,
  167. QPU_PACK_A_16B,
  168. /* replicated to each 8 bits of the 32-bit dst. */
  169. QPU_PACK_A_8888,
  170. /* Convert to 8-bit unsigned int. */
  171. QPU_PACK_A_8A,
  172. QPU_PACK_A_8B,
  173. QPU_PACK_A_8C,
  174. QPU_PACK_A_8D,
  175. /* Saturating variants of the previous instructions. */
  176. QPU_PACK_A_32_SAT, /* int-only */
  177. QPU_PACK_A_16A_SAT, /* int or float */
  178. QPU_PACK_A_16B_SAT,
  179. QPU_PACK_A_8888_SAT,
  180. QPU_PACK_A_8A_SAT,
  181. QPU_PACK_A_8B_SAT,
  182. QPU_PACK_A_8C_SAT,
  183. QPU_PACK_A_8D_SAT,
  184. };
  185. enum qpu_unpack {
  186. QPU_UNPACK_NOP,
  187. QPU_UNPACK_16A,
  188. QPU_UNPACK_16B,
  189. QPU_UNPACK_8D_REP,
  190. QPU_UNPACK_8A,
  191. QPU_UNPACK_8B,
  192. QPU_UNPACK_8C,
  193. QPU_UNPACK_8D,
  194. };
  195. #define QPU_MASK(high, low) ((((uint64_t)1<<((high)-(low)+1))-1)<<(low))
  196. /* Using the GNU statement expression extension */
  197. #define QPU_SET_FIELD(value, field) \
  198. ({ \
  199. uint64_t fieldval = (uint64_t)(value) << field ## _SHIFT; \
  200. assert((fieldval & ~ field ## _MASK) == 0); \
  201. fieldval & field ## _MASK; \
  202. })
  203. #define QPU_GET_FIELD(word, field) ((uint32_t)(((word) & field ## _MASK) >> field ## _SHIFT))
  204. #define QPU_UPDATE_FIELD(inst, value, field) \
  205. (((inst) & ~(field ## _MASK)) | QPU_SET_FIELD(value, field))
  206. #define QPU_SIG_SHIFT 60
  207. #define QPU_SIG_MASK QPU_MASK(63, 60)
  208. #define QPU_UNPACK_SHIFT 57
  209. #define QPU_UNPACK_MASK QPU_MASK(59, 57)
  210. /**
  211. * If set, the pack field means PACK_MUL or R4 packing, instead of normal
  212. * regfile a packing.
  213. */
  214. #define QPU_PM ((uint64_t)1 << 56)
  215. #define QPU_PACK_SHIFT 52
  216. #define QPU_PACK_MASK QPU_MASK(55, 52)
  217. #define QPU_COND_ADD_SHIFT 49
  218. #define QPU_COND_ADD_MASK QPU_MASK(51, 49)
  219. #define QPU_COND_MUL_SHIFT 46
  220. #define QPU_COND_MUL_MASK QPU_MASK(48, 46)
  221. #define QPU_SF ((uint64_t)1 << 45)
  222. #define QPU_WADDR_ADD_SHIFT 38
  223. #define QPU_WADDR_ADD_MASK QPU_MASK(43, 38)
  224. #define QPU_WADDR_MUL_SHIFT 32
  225. #define QPU_WADDR_MUL_MASK QPU_MASK(37, 32)
  226. #define QPU_OP_MUL_SHIFT 29
  227. #define QPU_OP_MUL_MASK QPU_MASK(31, 29)
  228. #define QPU_RADDR_A_SHIFT 18
  229. #define QPU_RADDR_A_MASK QPU_MASK(23, 18)
  230. #define QPU_RADDR_B_SHIFT 12
  231. #define QPU_RADDR_B_MASK QPU_MASK(17, 12)
  232. #define QPU_SMALL_IMM_SHIFT 12
  233. #define QPU_SMALL_IMM_MASK QPU_MASK(17, 12)
  234. #define QPU_ADD_A_SHIFT 9
  235. #define QPU_ADD_A_MASK QPU_MASK(11, 9)
  236. #define QPU_ADD_B_SHIFT 6
  237. #define QPU_ADD_B_MASK QPU_MASK(8, 6)
  238. #define QPU_MUL_A_SHIFT 3
  239. #define QPU_MUL_A_MASK QPU_MASK(5, 3)
  240. #define QPU_MUL_B_SHIFT 0
  241. #define QPU_MUL_B_MASK QPU_MASK(2, 0)
  242. #define QPU_WS ((uint64_t)1 << 44)
  243. #define QPU_OP_ADD_SHIFT 24
  244. #define QPU_OP_ADD_MASK QPU_MASK(28, 24)
  245. #endif /* VC4_QPU_DEFINES_H */