123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * Copyright (C) 2019 Pengutronix, Michael Tretter <[email protected]>
- *
- * Allegro VCU firmware mailbox mail definitions
- */
- #ifndef ALLEGRO_MAIL_H
- #define ALLEGRO_MAIL_H
- #include <linux/kernel.h>
- enum mcu_msg_type {
- MCU_MSG_TYPE_INIT = 0x0000,
- MCU_MSG_TYPE_CREATE_CHANNEL = 0x0005,
- MCU_MSG_TYPE_DESTROY_CHANNEL = 0x0006,
- MCU_MSG_TYPE_ENCODE_FRAME = 0x0007,
- MCU_MSG_TYPE_PUT_STREAM_BUFFER = 0x0012,
- MCU_MSG_TYPE_PUSH_BUFFER_INTERMEDIATE = 0x000e,
- MCU_MSG_TYPE_PUSH_BUFFER_REFERENCE = 0x000f,
- };
- enum mcu_msg_version {
- MCU_MSG_VERSION_2018_2,
- MCU_MSG_VERSION_2019_2,
- };
- const char *msg_type_name(enum mcu_msg_type type);
- struct mcu_msg_header {
- enum mcu_msg_type type;
- enum mcu_msg_version version;
- };
- struct mcu_msg_init_request {
- struct mcu_msg_header header;
- u32 reserved0; /* maybe a unused channel id */
- u32 suballoc_dma;
- u32 suballoc_size;
- s32 encoder_buffer_size;
- s32 encoder_buffer_color_depth;
- s32 num_cores;
- s32 clk_rate;
- };
- struct mcu_msg_init_response {
- struct mcu_msg_header header;
- u32 reserved0;
- };
- struct create_channel_param {
- enum mcu_msg_version version;
- u32 layer_id;
- u16 width;
- u16 height;
- u32 videomode;
- u32 format;
- u32 colorspace;
- u32 src_mode;
- u32 src_bit_depth;
- u8 profile;
- u16 constraint_set_flags;
- u32 codec;
- u16 level;
- u16 tier;
- u32 log2_max_poc;
- u32 log2_max_frame_num;
- u32 temporal_mvp_enable;
- u32 enable_reordering;
- u32 dbf_ovr_en;
- u32 override_lf;
- u32 num_ref_idx_l0;
- u32 num_ref_idx_l1;
- u32 custom_lda;
- u32 rdo_cost_mode;
- u32 lf;
- u32 lf_x_tile;
- u32 lf_x_slice;
- s8 beta_offset;
- s8 tc_offset;
- u16 reserved10;
- u32 unknown11;
- u32 unknown12;
- u16 num_slices;
- u32 encoder_buffer_offset;
- u32 encoder_buffer_enabled;
- u16 clip_hrz_range;
- u16 clip_vrt_range;
- u16 me_range[4];
- u8 max_cu_size;
- u8 min_cu_size;
- u8 max_tu_size;
- u8 min_tu_size;
- u8 max_transfo_depth_inter;
- u8 max_transfo_depth_intra;
- u16 reserved20;
- u32 entropy_mode;
- u32 wp_mode;
- /* rate control param */
- u32 rate_control_mode;
- u32 initial_rem_delay;
- u32 cpb_size;
- u16 framerate;
- u16 clk_ratio;
- u32 target_bitrate;
- u32 max_bitrate;
- u16 initial_qp;
- u16 min_qp;
- u16 max_qp;
- s16 ip_delta;
- s16 pb_delta;
- u16 golden_ref;
- u16 golden_delta;
- u16 golden_ref_frequency;
- u32 rate_control_option;
- u32 num_pixel;
- u16 max_psnr;
- u16 max_pixel_value;
- u32 maxpicturesize[3];
- /* gop param */
- u32 gop_ctrl_mode;
- u32 freq_idr;
- u32 freq_lt;
- u32 gdr_mode;
- u16 gop_length;
- u8 num_b;
- u8 freq_golden_ref;
- u32 enable_lt;
- u32 tmpdqp;
- u32 subframe_latency;
- u32 lda_control_mode;
- u32 unknown41;
- u32 lda_factors[6];
- u32 max_num_merge_cand;
- };
- struct mcu_msg_create_channel {
- struct mcu_msg_header header;
- u32 user_id;
- u32 *blob;
- size_t blob_size;
- u32 blob_mcu_addr;
- u32 ep1_addr;
- };
- struct mcu_msg_create_channel_response {
- struct mcu_msg_header header;
- u32 channel_id;
- u32 user_id;
- u32 options;
- u32 num_core;
- u32 num_ref_idx_l0;
- u32 num_ref_idx_l1;
- u32 int_buffers_count;
- u32 int_buffers_size;
- u32 rec_buffers_count;
- u32 rec_buffers_size;
- u32 reserved;
- u32 error_code;
- };
- struct mcu_msg_destroy_channel {
- struct mcu_msg_header header;
- u32 channel_id;
- };
- struct mcu_msg_destroy_channel_response {
- struct mcu_msg_header header;
- u32 channel_id;
- };
- struct mcu_msg_push_buffers_internal_buffer {
- u32 dma_addr;
- u32 mcu_addr;
- u32 size;
- };
- struct mcu_msg_push_buffers_internal {
- struct mcu_msg_header header;
- u32 channel_id;
- size_t num_buffers;
- struct mcu_msg_push_buffers_internal_buffer buffer[];
- };
- struct mcu_msg_put_stream_buffer {
- struct mcu_msg_header header;
- u32 channel_id;
- u32 dma_addr;
- u32 mcu_addr;
- u32 size;
- u32 offset;
- u64 dst_handle;
- };
- struct mcu_msg_encode_frame {
- struct mcu_msg_header header;
- u32 channel_id;
- u32 reserved;
- u32 encoding_options;
- #define AL_OPT_USE_QP_TABLE BIT(0)
- #define AL_OPT_FORCE_LOAD BIT(1)
- #define AL_OPT_USE_L2 BIT(2)
- #define AL_OPT_DISABLE_INTRA BIT(3)
- #define AL_OPT_DEPENDENT_SLICES BIT(4)
- s16 pps_qp;
- u16 padding;
- u64 user_param;
- u64 src_handle;
- u32 request_options;
- #define AL_OPT_SCENE_CHANGE BIT(0)
- #define AL_OPT_RESTART_GOP BIT(1)
- #define AL_OPT_USE_LONG_TERM BIT(2)
- #define AL_OPT_UPDATE_PARAMS BIT(3)
- /* u32 scene_change_delay (optional) */
- /* rate control param (optional) */
- /* gop param (optional) */
- /* dynamic resolution params (optional) */
- u32 src_y;
- u32 src_uv;
- u32 is_10_bit;
- u32 stride;
- u32 format;
- u32 ep2;
- u64 ep2_v;
- };
- struct mcu_msg_encode_frame_response {
- struct mcu_msg_header header;
- u32 channel_id;
- u64 dst_handle; /* see mcu_msg_put_stream_buffer */
- u64 user_param; /* see mcu_msg_encode_frame */
- u64 src_handle; /* see mcu_msg_encode_frame */
- u16 skip;
- u16 is_ref;
- u32 initial_removal_delay;
- u32 dpb_output_delay;
- u32 size;
- u32 frame_tag_size;
- s32 stuffing;
- s32 filler;
- u16 num_column;
- u16 num_row;
- u16 qp;
- u8 num_ref_idx_l0;
- u8 num_ref_idx_l1;
- u32 partition_table_offset;
- s32 partition_table_size;
- u32 sum_complex;
- s32 tile_width[4];
- s32 tile_height[22];
- u32 error_code;
- u32 slice_type;
- #define AL_ENC_SLICE_TYPE_B 0
- #define AL_ENC_SLICE_TYPE_P 1
- #define AL_ENC_SLICE_TYPE_I 2
- u32 pic_struct;
- u8 is_idr;
- u8 is_first_slice;
- u8 is_last_slice;
- u8 reserved;
- u16 pps_qp;
- u16 reserved1;
- u32 reserved2;
- u32 reserved3;
- u32 reserved4;
- u32 reserved5;
- u32 reserved6;
- };
- union mcu_msg_response {
- struct mcu_msg_header header;
- struct mcu_msg_init_response init;
- struct mcu_msg_create_channel_response create_channel;
- struct mcu_msg_destroy_channel_response destroy_channel;
- struct mcu_msg_encode_frame_response encode_frame;
- };
- ssize_t allegro_encode_config_blob(u32 *dst, struct create_channel_param *param);
- ssize_t allegro_decode_config_blob(struct create_channel_param *param,
- struct mcu_msg_create_channel_response *msg,
- u32 *src);
- int allegro_decode_mail(void *msg, u32 *src);
- ssize_t allegro_encode_mail(u32 *dst, void *msg);
- #endif
|