allegro-mail.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (C) 2019 Pengutronix, Michael Tretter <[email protected]>
  4. *
  5. * Allegro VCU firmware mailbox mail definitions
  6. */
  7. #ifndef ALLEGRO_MAIL_H
  8. #define ALLEGRO_MAIL_H
  9. #include <linux/kernel.h>
  10. enum mcu_msg_type {
  11. MCU_MSG_TYPE_INIT = 0x0000,
  12. MCU_MSG_TYPE_CREATE_CHANNEL = 0x0005,
  13. MCU_MSG_TYPE_DESTROY_CHANNEL = 0x0006,
  14. MCU_MSG_TYPE_ENCODE_FRAME = 0x0007,
  15. MCU_MSG_TYPE_PUT_STREAM_BUFFER = 0x0012,
  16. MCU_MSG_TYPE_PUSH_BUFFER_INTERMEDIATE = 0x000e,
  17. MCU_MSG_TYPE_PUSH_BUFFER_REFERENCE = 0x000f,
  18. };
  19. enum mcu_msg_version {
  20. MCU_MSG_VERSION_2018_2,
  21. MCU_MSG_VERSION_2019_2,
  22. };
  23. const char *msg_type_name(enum mcu_msg_type type);
  24. struct mcu_msg_header {
  25. enum mcu_msg_type type;
  26. enum mcu_msg_version version;
  27. };
  28. struct mcu_msg_init_request {
  29. struct mcu_msg_header header;
  30. u32 reserved0; /* maybe a unused channel id */
  31. u32 suballoc_dma;
  32. u32 suballoc_size;
  33. s32 encoder_buffer_size;
  34. s32 encoder_buffer_color_depth;
  35. s32 num_cores;
  36. s32 clk_rate;
  37. };
  38. struct mcu_msg_init_response {
  39. struct mcu_msg_header header;
  40. u32 reserved0;
  41. };
  42. struct create_channel_param {
  43. enum mcu_msg_version version;
  44. u32 layer_id;
  45. u16 width;
  46. u16 height;
  47. u32 videomode;
  48. u32 format;
  49. u32 colorspace;
  50. u32 src_mode;
  51. u32 src_bit_depth;
  52. u8 profile;
  53. u16 constraint_set_flags;
  54. u32 codec;
  55. u16 level;
  56. u16 tier;
  57. u32 log2_max_poc;
  58. u32 log2_max_frame_num;
  59. u32 temporal_mvp_enable;
  60. u32 enable_reordering;
  61. u32 dbf_ovr_en;
  62. u32 override_lf;
  63. u32 num_ref_idx_l0;
  64. u32 num_ref_idx_l1;
  65. u32 custom_lda;
  66. u32 rdo_cost_mode;
  67. u32 lf;
  68. u32 lf_x_tile;
  69. u32 lf_x_slice;
  70. s8 beta_offset;
  71. s8 tc_offset;
  72. u16 reserved10;
  73. u32 unknown11;
  74. u32 unknown12;
  75. u16 num_slices;
  76. u32 encoder_buffer_offset;
  77. u32 encoder_buffer_enabled;
  78. u16 clip_hrz_range;
  79. u16 clip_vrt_range;
  80. u16 me_range[4];
  81. u8 max_cu_size;
  82. u8 min_cu_size;
  83. u8 max_tu_size;
  84. u8 min_tu_size;
  85. u8 max_transfo_depth_inter;
  86. u8 max_transfo_depth_intra;
  87. u16 reserved20;
  88. u32 entropy_mode;
  89. u32 wp_mode;
  90. /* rate control param */
  91. u32 rate_control_mode;
  92. u32 initial_rem_delay;
  93. u32 cpb_size;
  94. u16 framerate;
  95. u16 clk_ratio;
  96. u32 target_bitrate;
  97. u32 max_bitrate;
  98. u16 initial_qp;
  99. u16 min_qp;
  100. u16 max_qp;
  101. s16 ip_delta;
  102. s16 pb_delta;
  103. u16 golden_ref;
  104. u16 golden_delta;
  105. u16 golden_ref_frequency;
  106. u32 rate_control_option;
  107. u32 num_pixel;
  108. u16 max_psnr;
  109. u16 max_pixel_value;
  110. u32 maxpicturesize[3];
  111. /* gop param */
  112. u32 gop_ctrl_mode;
  113. u32 freq_idr;
  114. u32 freq_lt;
  115. u32 gdr_mode;
  116. u16 gop_length;
  117. u8 num_b;
  118. u8 freq_golden_ref;
  119. u32 enable_lt;
  120. u32 tmpdqp;
  121. u32 subframe_latency;
  122. u32 lda_control_mode;
  123. u32 unknown41;
  124. u32 lda_factors[6];
  125. u32 max_num_merge_cand;
  126. };
  127. struct mcu_msg_create_channel {
  128. struct mcu_msg_header header;
  129. u32 user_id;
  130. u32 *blob;
  131. size_t blob_size;
  132. u32 blob_mcu_addr;
  133. u32 ep1_addr;
  134. };
  135. struct mcu_msg_create_channel_response {
  136. struct mcu_msg_header header;
  137. u32 channel_id;
  138. u32 user_id;
  139. u32 options;
  140. u32 num_core;
  141. u32 num_ref_idx_l0;
  142. u32 num_ref_idx_l1;
  143. u32 int_buffers_count;
  144. u32 int_buffers_size;
  145. u32 rec_buffers_count;
  146. u32 rec_buffers_size;
  147. u32 reserved;
  148. u32 error_code;
  149. };
  150. struct mcu_msg_destroy_channel {
  151. struct mcu_msg_header header;
  152. u32 channel_id;
  153. };
  154. struct mcu_msg_destroy_channel_response {
  155. struct mcu_msg_header header;
  156. u32 channel_id;
  157. };
  158. struct mcu_msg_push_buffers_internal_buffer {
  159. u32 dma_addr;
  160. u32 mcu_addr;
  161. u32 size;
  162. };
  163. struct mcu_msg_push_buffers_internal {
  164. struct mcu_msg_header header;
  165. u32 channel_id;
  166. size_t num_buffers;
  167. struct mcu_msg_push_buffers_internal_buffer buffer[];
  168. };
  169. struct mcu_msg_put_stream_buffer {
  170. struct mcu_msg_header header;
  171. u32 channel_id;
  172. u32 dma_addr;
  173. u32 mcu_addr;
  174. u32 size;
  175. u32 offset;
  176. u64 dst_handle;
  177. };
  178. struct mcu_msg_encode_frame {
  179. struct mcu_msg_header header;
  180. u32 channel_id;
  181. u32 reserved;
  182. u32 encoding_options;
  183. #define AL_OPT_USE_QP_TABLE BIT(0)
  184. #define AL_OPT_FORCE_LOAD BIT(1)
  185. #define AL_OPT_USE_L2 BIT(2)
  186. #define AL_OPT_DISABLE_INTRA BIT(3)
  187. #define AL_OPT_DEPENDENT_SLICES BIT(4)
  188. s16 pps_qp;
  189. u16 padding;
  190. u64 user_param;
  191. u64 src_handle;
  192. u32 request_options;
  193. #define AL_OPT_SCENE_CHANGE BIT(0)
  194. #define AL_OPT_RESTART_GOP BIT(1)
  195. #define AL_OPT_USE_LONG_TERM BIT(2)
  196. #define AL_OPT_UPDATE_PARAMS BIT(3)
  197. /* u32 scene_change_delay (optional) */
  198. /* rate control param (optional) */
  199. /* gop param (optional) */
  200. /* dynamic resolution params (optional) */
  201. u32 src_y;
  202. u32 src_uv;
  203. u32 is_10_bit;
  204. u32 stride;
  205. u32 format;
  206. u32 ep2;
  207. u64 ep2_v;
  208. };
  209. struct mcu_msg_encode_frame_response {
  210. struct mcu_msg_header header;
  211. u32 channel_id;
  212. u64 dst_handle; /* see mcu_msg_put_stream_buffer */
  213. u64 user_param; /* see mcu_msg_encode_frame */
  214. u64 src_handle; /* see mcu_msg_encode_frame */
  215. u16 skip;
  216. u16 is_ref;
  217. u32 initial_removal_delay;
  218. u32 dpb_output_delay;
  219. u32 size;
  220. u32 frame_tag_size;
  221. s32 stuffing;
  222. s32 filler;
  223. u16 num_column;
  224. u16 num_row;
  225. u16 qp;
  226. u8 num_ref_idx_l0;
  227. u8 num_ref_idx_l1;
  228. u32 partition_table_offset;
  229. s32 partition_table_size;
  230. u32 sum_complex;
  231. s32 tile_width[4];
  232. s32 tile_height[22];
  233. u32 error_code;
  234. u32 slice_type;
  235. #define AL_ENC_SLICE_TYPE_B 0
  236. #define AL_ENC_SLICE_TYPE_P 1
  237. #define AL_ENC_SLICE_TYPE_I 2
  238. u32 pic_struct;
  239. u8 is_idr;
  240. u8 is_first_slice;
  241. u8 is_last_slice;
  242. u8 reserved;
  243. u16 pps_qp;
  244. u16 reserved1;
  245. u32 reserved2;
  246. u32 reserved3;
  247. u32 reserved4;
  248. u32 reserved5;
  249. u32 reserved6;
  250. };
  251. union mcu_msg_response {
  252. struct mcu_msg_header header;
  253. struct mcu_msg_init_response init;
  254. struct mcu_msg_create_channel_response create_channel;
  255. struct mcu_msg_destroy_channel_response destroy_channel;
  256. struct mcu_msg_encode_frame_response encode_frame;
  257. };
  258. ssize_t allegro_encode_config_blob(u32 *dst, struct create_channel_param *param);
  259. ssize_t allegro_decode_config_blob(struct create_channel_param *param,
  260. struct mcu_msg_create_channel_response *msg,
  261. u32 *src);
  262. int allegro_decode_mail(void *msg, u32 *src);
  263. ssize_t allegro_encode_mail(u32 *dst, void *msg);
  264. #endif