298 lines · c
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 definitions6 */7 8#ifndef ALLEGRO_MAIL_H9#define ALLEGRO_MAIL_H10 11#include <linux/kernel.h>12 13enum 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 23enum mcu_msg_version {24 MCU_MSG_VERSION_2018_2,25 MCU_MSG_VERSION_2019_2,26};27 28const char *msg_type_name(enum mcu_msg_type type);29 30struct mcu_msg_header {31 enum mcu_msg_type type;32 enum mcu_msg_version version;33};34 35struct 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 46struct mcu_msg_init_response {47 struct mcu_msg_header header;48 u32 reserved0;49};50 51struct 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 142struct 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 151struct 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 167struct mcu_msg_destroy_channel {168 struct mcu_msg_header header;169 u32 channel_id;170};171 172struct mcu_msg_destroy_channel_response {173 struct mcu_msg_header header;174 u32 channel_id;175};176 177struct mcu_msg_push_buffers_internal_buffer {178 u32 dma_addr;179 u32 mcu_addr;180 u32 size;181};182 183struct 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 190struct 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 200struct 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 236struct 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 0264#define AL_ENC_SLICE_TYPE_P 1265#define AL_ENC_SLICE_TYPE_I 2266 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 281union 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 289ssize_t allegro_encode_config_blob(u32 *dst, struct create_channel_param *param);290ssize_t allegro_decode_config_blob(struct create_channel_param *param,291 struct mcu_msg_create_channel_response *msg,292 u32 *src);293 294int allegro_decode_mail(void *msg, u32 *src);295ssize_t allegro_encode_mail(u32 *dst, void *msg);296 297#endif298