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