mtk_vcu_controls.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /*
  2. * MediaTek Controls Header
  3. *
  4. * Copyright (c) 2017 MediaTek Inc.
  5. * Author: Yunfei Dong <yunfei.dong@mediatek.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 as
  9. * published by the Free Software Foundation.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. */
  16. #ifndef __UAPI_MTK_VCU_CONTROLS_H__
  17. #define __UAPI_MTK_VCU_CONTROLS_H__
  18. #define SHARE_BUF_SIZE 72
  19. #define LOG_INFO_SIZE 1024
  20. #define VCODEC_CMDQ_CMD_MAX (2048)
  21. /**
  22. * struct mem_obj - memory buffer allocated in kernel
  23. *
  24. * @iova: iova of buffer
  25. * @len: buffer length
  26. * @pa: physical address
  27. * @va: kernel virtual address
  28. */
  29. struct mem_obj {
  30. u64 iova;
  31. u32 len;
  32. u64 pa;
  33. u64 va;
  34. };
  35. /**
  36. * struct map_obj - memory buffer mmaped in kernel
  37. *
  38. * @map_buf: iova of buffer
  39. * 0: not mapped buf; 1: mapped buf
  40. * @map_type: the type of mmap
  41. * 0: reserved; 1: MM_BASE;
  42. * 2: MM_CACHEABLE_BASE; 3: PA_BASE
  43. * @reserved: reserved
  44. */
  45. struct map_obj {
  46. u32 map_buf;
  47. u32 map_type;
  48. u64 reserved;
  49. };
  50. /**
  51. * struct gce_cmds - cmds buffer
  52. *
  53. * @cmd: gce cmd
  54. * @addr: cmd operation addr
  55. * @data: cmd operation data
  56. * @mask: cmd operation mask
  57. * @cmd_cnt: cmdq total cmd count
  58. */
  59. struct gce_cmds {
  60. u8 cmd[VCODEC_CMDQ_CMD_MAX];
  61. u64 addr[VCODEC_CMDQ_CMD_MAX];
  62. u64 data[VCODEC_CMDQ_CMD_MAX];
  63. u32 mask[VCODEC_CMDQ_CMD_MAX];
  64. u32 dma_offset[VCODEC_CMDQ_CMD_MAX];
  65. u32 dma_size[VCODEC_CMDQ_CMD_MAX];
  66. u32 cmd_cnt;
  67. };
  68. /**
  69. * struct gce_cmdq_obj - cmdQ buffer allocated in kernel
  70. *
  71. * @cmds_user_ptr: user pointer to struct gce_cmds
  72. * @gce_handle: instance handle
  73. * @flush_order: cmdQ buffer order
  74. * @codec_type: decoder(1) or encoder(0)
  75. */
  76. struct gce_cmdq_obj {
  77. u64 cmds_user_ptr;
  78. u64 gce_handle;
  79. u32 flush_order;
  80. u32 codec_type;
  81. u32 core_id;
  82. u32 secure;
  83. };
  84. /**
  85. * struct gce_obj - gce allocated in kernel
  86. * @gce_handle: instance handle
  87. * @flush_order: cmdQ buffer order
  88. * @codec_type: decoder(1) or encoder(0)
  89. */
  90. struct gce_obj {
  91. u64 gce_handle;
  92. u32 flush_order;
  93. u32 codec_type;
  94. };
  95. enum gce_cmd_id {
  96. CMD_READ = 0, /* read register */
  97. CMD_WRITE, /* write register */
  98. CMD_POLL_REG,
  99. /* polling register until get some value (no timeout, blocking wait) */
  100. CMD_WAIT_EVENT, /* gce wait HW done event & clear */
  101. CMD_MEM_MV, /* copy memory data from PA to another PA */
  102. CMD_POLL_ADDR,
  103. /* polling addr until get some value (with timeout) */
  104. CMD_SEC_WRITE, /* sec dma write register */
  105. CMD_MAX
  106. };
  107. enum gce_event_id {
  108. VDEC_EVENT_0, /* pic_start (each spec trigger decode will get) */
  109. VDEC_EVENT_1, /* decode done, VDEC_TOP(41) bit16=1 */
  110. VDEC_EVENT_2, /* vdec_pause (WDMA(9)bit0 or bit1=1) */
  111. VDEC_EVENT_3, /* vdec_dec_error (each spec. decode error will get) */
  112. VDEC_EVENT_4,
  113. /* mc_busy_overflow | mdec_timeout
  114. * (decode to VLD_TOP(20) or VLD_TOP(22) will get)
  115. */
  116. VDEC_EVENT_5,
  117. /* all_dram_req & all_dram_cnt_0 & bits_proc_nop_1
  118. * & bits_proc_nop_2, break or pic_finish need wait
  119. */
  120. VDEC_EVENT_6, /* ini_fetch_rdy VLD(58)bit0=1 */
  121. VDEC_EVENT_7,
  122. /* process_flag VLD(61)bit15=0 ||
  123. * VLD(61)bit15=1 && VLD(61)bit0=0
  124. */
  125. VDEC_EVENT_8,
  126. /* "search_start_code_done HEVC_VLD(37)bit8=0"
  127. * "search_start_code_doneAVC_VLD(182)bit0=0"
  128. * "ctx_count_dma_rdyVP9_VLD(170)bit0=1"
  129. */
  130. VDEC_EVENT_9,
  131. /* "ref_reorder_doneHEVC_VLD(37)bit4=0"
  132. * "ref_reorder_doneAVC_VLD(139)bit0=1"
  133. * "& update_probs_rdy& VP9_VLD(51) = 1"
  134. */
  135. VDEC_EVENT_10,
  136. /* "wp_tble_doneHEVC_VLD(37)bit0=0"
  137. * "wp_tble_doneAVC_VLD(140)bit0=1"
  138. * "bool_init_rdyVP9_VLD(68)bit16 = 1"
  139. */
  140. VDEC_EVENT_11,
  141. /* "count_sram_clr_done &
  142. * ctx_sram_clr_doneVP9_VLD(106)bit0 =0 &
  143. * VP9_VLD(166)bit0 = 0"
  144. */
  145. VDEC_EVENT_12, /* reserved */
  146. VDEC_EVENT_13, /* reserved */
  147. VDEC_EVENT_14, /* reserved */
  148. VDEC_EVENT_15, /* Queue Counter OP threshold */
  149. VDEC_LAT_EVENT_0,
  150. VDEC_LAT_EVENT_1,
  151. VDEC_LAT_EVENT_2,
  152. VDEC_LAT_EVENT_3,
  153. VDEC_LAT_EVENT_4,
  154. VDEC_LAT_EVENT_5,
  155. VDEC_LAT_EVENT_6,
  156. VDEC_LAT_EVENT_7,
  157. VDEC_LAT_EVENT_8,
  158. VDEC_LAT_EVENT_9,
  159. VDEC_LAT_EVENT_10,
  160. VDEC_LAT_EVENT_11,
  161. VDEC_LAT_EVENT_12,
  162. VDEC_LAT_EVENT_13,
  163. VDEC_LAT_EVENT_14,
  164. VDEC_LAT_EVENT_15,
  165. VDEC_EVENT_COUNT,
  166. VENC_EOF = VDEC_EVENT_COUNT,
  167. VENC_CMDQ_PAUSE_DONE,
  168. VENC_MB_DONE,
  169. VENC_128BYTE_CNT_DONE,
  170. VENC_EOF_C1,
  171. VENC_WP_2ND_DONE,
  172. VENC_WP_3ND_DONE,
  173. VENC_SPS_DONE,
  174. VENC_PPS_DONE
  175. };
  176. #define VCU_SET_OBJECT _IOW('v', 0, struct share_obj)
  177. #define VCU_MVA_ALLOCATION _IOWR('v', 1, struct mem_obj)
  178. #define VCU_MVA_FREE _IOWR('v', 2, struct mem_obj)
  179. #define VCU_CACHE_FLUSH_ALL _IOWR('v', 3, struct mem_obj)
  180. #define VCU_CACHE_FLUSH_BUFF _IOWR('v', 4, struct mem_obj)
  181. #define VCU_CACHE_INVALIDATE_BUFF _IOWR('v', 5, struct mem_obj)
  182. #define VCU_PA_ALLOCATION _IOWR('v', 6, struct mem_obj)
  183. #define VCU_PA_FREE _IOWR('v', 7, struct mem_obj)
  184. #define VCU_GCE_SET_CMD_FLUSH _IOW('v', 8, struct gce_cmdq_obj)
  185. #define VCU_GCE_WAIT_CALLBACK _IOW('v', 9, struct gce_obj)
  186. #define VCU_GET_OBJECT _IOWR('v', 10, struct share_obj)
  187. #define VCU_GET_LOG_OBJECT _IOW('v', 11, struct log_test_nofuse)
  188. #define VCU_SET_LOG_OBJECT _IOW('v', 12, struct log_test)
  189. #define VCU_SET_MMAP_TYPE _IOW('v', 13, struct map_obj)
  190. #define COMPAT_VCU_SET_OBJECT _IOW('v', 0, struct share_obj)
  191. #define COMPAT_VCU_MVA_ALLOCATION _IOWR('v', 1, struct compat_mem_obj)
  192. #define COMPAT_VCU_MVA_FREE _IOWR('v', 2, struct compat_mem_obj)
  193. #define COMPAT_VCU_CACHE_FLUSH_ALL _IOWR('v', 3, struct compat_mem_obj)
  194. #define COMPAT_VCU_CACHE_FLUSH_BUFF _IOWR('v', 4, struct compat_mem_obj)
  195. #define COMPAT_VCU_CACHE_INVALIDATE_BUFF _IOWR('v', 5, struct compat_mem_obj)
  196. #define COMPAT_VCU_PA_ALLOCATION _IOWR('v', 6, struct compat_mem_obj)
  197. #define COMPAT_VCU_PA_FREE _IOWR('v', 7, struct compat_mem_obj)
  198. #define COMPAT_VCU_SET_MMAP_TYPE _IOW('v', 13, struct map_obj)
  199. #if IS_ENABLED(CONFIG_COMPAT)
  200. struct compat_mem_obj {
  201. u64 iova;
  202. u32 len;
  203. compat_u64 pa;
  204. compat_u64 va;
  205. };
  206. #endif
  207. /**
  208. * struct share_obj - DTCM (Data Tightly-Coupled Memory) buffer shared with
  209. * AP and VCU
  210. *
  211. * @id: IPI id
  212. * @len: share buffer length
  213. * @share_buf: share buffer data
  214. */
  215. struct share_obj {
  216. s32 id;
  217. u32 len;
  218. unsigned char share_buf[SHARE_BUF_SIZE];
  219. };
  220. struct log_test_nofuse {
  221. char log_info[LOG_INFO_SIZE];
  222. };
  223. #endif