vc4_qpu_defines.h 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  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. /* non-hardware mux values */
  140. QPU_MUX_IMM,
  141. };
  142. enum qpu_cond {
  143. QPU_COND_NEVER,
  144. QPU_COND_ALWAYS,
  145. QPU_COND_ZS,
  146. QPU_COND_ZC,
  147. QPU_COND_NS,
  148. QPU_COND_NC,
  149. QPU_COND_CS,
  150. QPU_COND_CC,
  151. };
  152. enum qpu_pack_mul {
  153. QPU_PACK_MUL_NOP,
  154. /* replicated to each 8 bits of the 32-bit dst. */
  155. QPU_PACK_MUL_8888 = 3,
  156. QPU_PACK_MUL_8A,
  157. QPU_PACK_MUL_8B,
  158. QPU_PACK_MUL_8C,
  159. QPU_PACK_MUL_8D,
  160. };
  161. enum qpu_pack_a {
  162. QPU_PACK_A_NOP,
  163. /* convert to 16 bit float if float input, or to int16. */
  164. QPU_PACK_A_16A,
  165. QPU_PACK_A_16B,
  166. /* replicated to each 8 bits of the 32-bit dst. */
  167. QPU_PACK_A_8888,
  168. /* Convert to 8-bit unsigned int. */
  169. QPU_PACK_A_8A,
  170. QPU_PACK_A_8B,
  171. QPU_PACK_A_8C,
  172. QPU_PACK_A_8D,
  173. /* Saturating variants of the previous instructions. */
  174. QPU_PACK_A_32_SAT, /* int-only */
  175. QPU_PACK_A_16A_SAT, /* int or float */
  176. QPU_PACK_A_16B_SAT,
  177. QPU_PACK_A_8888_SAT,
  178. QPU_PACK_A_8A_SAT,
  179. QPU_PACK_A_8B_SAT,
  180. QPU_PACK_A_8C_SAT,
  181. QPU_PACK_A_8D_SAT,
  182. };
  183. enum qpu_unpack_r4 {
  184. QPU_UNPACK_R4_NOP,
  185. QPU_UNPACK_R4_F16A_TO_F32,
  186. QPU_UNPACK_R4_F16B_TO_F32,
  187. QPU_UNPACK_R4_8D_REP,
  188. QPU_UNPACK_R4_8A,
  189. QPU_UNPACK_R4_8B,
  190. QPU_UNPACK_R4_8C,
  191. QPU_UNPACK_R4_8D,
  192. };
  193. #define QPU_MASK(high, low) \
  194. ((((uint64_t)1 << ((high) - (low) + 1)) - 1) << (low))
  195. #define QPU_GET_FIELD(word, field) \
  196. ((uint32_t)(((word) & field ## _MASK) >> field ## _SHIFT))
  197. #define QPU_SIG_SHIFT 60
  198. #define QPU_SIG_MASK QPU_MASK(63, 60)
  199. #define QPU_UNPACK_SHIFT 57
  200. #define QPU_UNPACK_MASK QPU_MASK(59, 57)
  201. /**
  202. * If set, the pack field means PACK_MUL or R4 packing, instead of normal
  203. * regfile a packing.
  204. */
  205. #define QPU_PM ((uint64_t)1 << 56)
  206. #define QPU_PACK_SHIFT 52
  207. #define QPU_PACK_MASK QPU_MASK(55, 52)
  208. #define QPU_COND_ADD_SHIFT 49
  209. #define QPU_COND_ADD_MASK QPU_MASK(51, 49)
  210. #define QPU_COND_MUL_SHIFT 46
  211. #define QPU_COND_MUL_MASK QPU_MASK(48, 46)
  212. #define QPU_BRANCH_COND_SHIFT 52
  213. #define QPU_BRANCH_COND_MASK QPU_MASK(55, 52)
  214. #define QPU_BRANCH_REL ((uint64_t)1 << 51)
  215. #define QPU_BRANCH_REG ((uint64_t)1 << 50)
  216. #define QPU_BRANCH_RADDR_A_SHIFT 45
  217. #define QPU_BRANCH_RADDR_A_MASK QPU_MASK(49, 45)
  218. #define QPU_SF ((uint64_t)1 << 45)
  219. #define QPU_WADDR_ADD_SHIFT 38
  220. #define QPU_WADDR_ADD_MASK QPU_MASK(43, 38)
  221. #define QPU_WADDR_MUL_SHIFT 32
  222. #define QPU_WADDR_MUL_MASK QPU_MASK(37, 32)
  223. #define QPU_OP_MUL_SHIFT 29
  224. #define QPU_OP_MUL_MASK QPU_MASK(31, 29)
  225. #define QPU_RADDR_A_SHIFT 18
  226. #define QPU_RADDR_A_MASK QPU_MASK(23, 18)
  227. #define QPU_RADDR_B_SHIFT 12
  228. #define QPU_RADDR_B_MASK QPU_MASK(17, 12)
  229. #define QPU_SMALL_IMM_SHIFT 12
  230. #define QPU_SMALL_IMM_MASK QPU_MASK(17, 12)
  231. #define QPU_ADD_A_SHIFT 9
  232. #define QPU_ADD_A_MASK QPU_MASK(11, 9)
  233. #define QPU_ADD_B_SHIFT 6
  234. #define QPU_ADD_B_MASK QPU_MASK(8, 6)
  235. #define QPU_MUL_A_SHIFT 3
  236. #define QPU_MUL_A_MASK QPU_MASK(5, 3)
  237. #define QPU_MUL_B_SHIFT 0
  238. #define QPU_MUL_B_MASK QPU_MASK(2, 0)
  239. #define QPU_WS ((uint64_t)1 << 44)
  240. #define QPU_OP_ADD_SHIFT 24
  241. #define QPU_OP_ADD_MASK QPU_MASK(28, 24)
  242. #define QPU_LOAD_IMM_SHIFT 0
  243. #define QPU_LOAD_IMM_MASK QPU_MASK(31, 0)
  244. #define QPU_BRANCH_TARGET_SHIFT 0
  245. #define QPU_BRANCH_TARGET_MASK QPU_MASK(31, 0)
  246. #endif /* VC4_QPU_DEFINES_H */