162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2019 Pengutronix, Michael Tretter <kernel@pengutronix.de> 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Allegro VCU firmware mailbox mail definitions 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef ALLEGRO_MAIL_H 962306a36Sopenharmony_ci#define ALLEGRO_MAIL_H 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/kernel.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cienum mcu_msg_type { 1462306a36Sopenharmony_ci MCU_MSG_TYPE_INIT = 0x0000, 1562306a36Sopenharmony_ci MCU_MSG_TYPE_CREATE_CHANNEL = 0x0005, 1662306a36Sopenharmony_ci MCU_MSG_TYPE_DESTROY_CHANNEL = 0x0006, 1762306a36Sopenharmony_ci MCU_MSG_TYPE_ENCODE_FRAME = 0x0007, 1862306a36Sopenharmony_ci MCU_MSG_TYPE_PUT_STREAM_BUFFER = 0x0012, 1962306a36Sopenharmony_ci MCU_MSG_TYPE_PUSH_BUFFER_INTERMEDIATE = 0x000e, 2062306a36Sopenharmony_ci MCU_MSG_TYPE_PUSH_BUFFER_REFERENCE = 0x000f, 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cienum mcu_msg_version { 2462306a36Sopenharmony_ci MCU_MSG_VERSION_2018_2, 2562306a36Sopenharmony_ci MCU_MSG_VERSION_2019_2, 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ciconst char *msg_type_name(enum mcu_msg_type type); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistruct mcu_msg_header { 3162306a36Sopenharmony_ci enum mcu_msg_type type; 3262306a36Sopenharmony_ci enum mcu_msg_version version; 3362306a36Sopenharmony_ci}; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistruct mcu_msg_init_request { 3662306a36Sopenharmony_ci struct mcu_msg_header header; 3762306a36Sopenharmony_ci u32 reserved0; /* maybe a unused channel id */ 3862306a36Sopenharmony_ci u32 suballoc_dma; 3962306a36Sopenharmony_ci u32 suballoc_size; 4062306a36Sopenharmony_ci s32 encoder_buffer_size; 4162306a36Sopenharmony_ci s32 encoder_buffer_color_depth; 4262306a36Sopenharmony_ci s32 num_cores; 4362306a36Sopenharmony_ci s32 clk_rate; 4462306a36Sopenharmony_ci}; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cistruct mcu_msg_init_response { 4762306a36Sopenharmony_ci struct mcu_msg_header header; 4862306a36Sopenharmony_ci u32 reserved0; 4962306a36Sopenharmony_ci}; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistruct create_channel_param { 5262306a36Sopenharmony_ci enum mcu_msg_version version; 5362306a36Sopenharmony_ci u32 layer_id; 5462306a36Sopenharmony_ci u16 width; 5562306a36Sopenharmony_ci u16 height; 5662306a36Sopenharmony_ci u32 videomode; 5762306a36Sopenharmony_ci u32 format; 5862306a36Sopenharmony_ci u32 colorspace; 5962306a36Sopenharmony_ci u32 src_mode; 6062306a36Sopenharmony_ci u32 src_bit_depth; 6162306a36Sopenharmony_ci u8 profile; 6262306a36Sopenharmony_ci u16 constraint_set_flags; 6362306a36Sopenharmony_ci u32 codec; 6462306a36Sopenharmony_ci u16 level; 6562306a36Sopenharmony_ci u16 tier; 6662306a36Sopenharmony_ci u32 log2_max_poc; 6762306a36Sopenharmony_ci u32 log2_max_frame_num; 6862306a36Sopenharmony_ci u32 temporal_mvp_enable; 6962306a36Sopenharmony_ci u32 enable_reordering; 7062306a36Sopenharmony_ci u32 dbf_ovr_en; 7162306a36Sopenharmony_ci u32 override_lf; 7262306a36Sopenharmony_ci u32 num_ref_idx_l0; 7362306a36Sopenharmony_ci u32 num_ref_idx_l1; 7462306a36Sopenharmony_ci u32 custom_lda; 7562306a36Sopenharmony_ci u32 rdo_cost_mode; 7662306a36Sopenharmony_ci u32 lf; 7762306a36Sopenharmony_ci u32 lf_x_tile; 7862306a36Sopenharmony_ci u32 lf_x_slice; 7962306a36Sopenharmony_ci s8 beta_offset; 8062306a36Sopenharmony_ci s8 tc_offset; 8162306a36Sopenharmony_ci u16 reserved10; 8262306a36Sopenharmony_ci u32 unknown11; 8362306a36Sopenharmony_ci u32 unknown12; 8462306a36Sopenharmony_ci u16 num_slices; 8562306a36Sopenharmony_ci u32 encoder_buffer_offset; 8662306a36Sopenharmony_ci u32 encoder_buffer_enabled; 8762306a36Sopenharmony_ci u16 clip_hrz_range; 8862306a36Sopenharmony_ci u16 clip_vrt_range; 8962306a36Sopenharmony_ci u16 me_range[4]; 9062306a36Sopenharmony_ci u8 max_cu_size; 9162306a36Sopenharmony_ci u8 min_cu_size; 9262306a36Sopenharmony_ci u8 max_tu_size; 9362306a36Sopenharmony_ci u8 min_tu_size; 9462306a36Sopenharmony_ci u8 max_transfo_depth_inter; 9562306a36Sopenharmony_ci u8 max_transfo_depth_intra; 9662306a36Sopenharmony_ci u16 reserved20; 9762306a36Sopenharmony_ci u32 entropy_mode; 9862306a36Sopenharmony_ci u32 wp_mode; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci /* rate control param */ 10162306a36Sopenharmony_ci u32 rate_control_mode; 10262306a36Sopenharmony_ci u32 initial_rem_delay; 10362306a36Sopenharmony_ci u32 cpb_size; 10462306a36Sopenharmony_ci u16 framerate; 10562306a36Sopenharmony_ci u16 clk_ratio; 10662306a36Sopenharmony_ci u32 target_bitrate; 10762306a36Sopenharmony_ci u32 max_bitrate; 10862306a36Sopenharmony_ci u16 initial_qp; 10962306a36Sopenharmony_ci u16 min_qp; 11062306a36Sopenharmony_ci u16 max_qp; 11162306a36Sopenharmony_ci s16 ip_delta; 11262306a36Sopenharmony_ci s16 pb_delta; 11362306a36Sopenharmony_ci u16 golden_ref; 11462306a36Sopenharmony_ci u16 golden_delta; 11562306a36Sopenharmony_ci u16 golden_ref_frequency; 11662306a36Sopenharmony_ci u32 rate_control_option; 11762306a36Sopenharmony_ci u32 num_pixel; 11862306a36Sopenharmony_ci u16 max_psnr; 11962306a36Sopenharmony_ci u16 max_pixel_value; 12062306a36Sopenharmony_ci u32 maxpicturesize[3]; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci /* gop param */ 12362306a36Sopenharmony_ci u32 gop_ctrl_mode; 12462306a36Sopenharmony_ci u32 freq_idr; 12562306a36Sopenharmony_ci u32 freq_lt; 12662306a36Sopenharmony_ci u32 gdr_mode; 12762306a36Sopenharmony_ci u16 gop_length; 12862306a36Sopenharmony_ci u8 num_b; 12962306a36Sopenharmony_ci u8 freq_golden_ref; 13062306a36Sopenharmony_ci u32 enable_lt; 13162306a36Sopenharmony_ci u32 tmpdqp; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci u32 subframe_latency; 13462306a36Sopenharmony_ci u32 lda_control_mode; 13562306a36Sopenharmony_ci u32 unknown41; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci u32 lda_factors[6]; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci u32 max_num_merge_cand; 14062306a36Sopenharmony_ci}; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_cistruct mcu_msg_create_channel { 14362306a36Sopenharmony_ci struct mcu_msg_header header; 14462306a36Sopenharmony_ci u32 user_id; 14562306a36Sopenharmony_ci u32 *blob; 14662306a36Sopenharmony_ci size_t blob_size; 14762306a36Sopenharmony_ci u32 blob_mcu_addr; 14862306a36Sopenharmony_ci u32 ep1_addr; 14962306a36Sopenharmony_ci}; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistruct mcu_msg_create_channel_response { 15262306a36Sopenharmony_ci struct mcu_msg_header header; 15362306a36Sopenharmony_ci u32 channel_id; 15462306a36Sopenharmony_ci u32 user_id; 15562306a36Sopenharmony_ci u32 options; 15662306a36Sopenharmony_ci u32 num_core; 15762306a36Sopenharmony_ci u32 num_ref_idx_l0; 15862306a36Sopenharmony_ci u32 num_ref_idx_l1; 15962306a36Sopenharmony_ci u32 int_buffers_count; 16062306a36Sopenharmony_ci u32 int_buffers_size; 16162306a36Sopenharmony_ci u32 rec_buffers_count; 16262306a36Sopenharmony_ci u32 rec_buffers_size; 16362306a36Sopenharmony_ci u32 reserved; 16462306a36Sopenharmony_ci u32 error_code; 16562306a36Sopenharmony_ci}; 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_cistruct mcu_msg_destroy_channel { 16862306a36Sopenharmony_ci struct mcu_msg_header header; 16962306a36Sopenharmony_ci u32 channel_id; 17062306a36Sopenharmony_ci}; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_cistruct mcu_msg_destroy_channel_response { 17362306a36Sopenharmony_ci struct mcu_msg_header header; 17462306a36Sopenharmony_ci u32 channel_id; 17562306a36Sopenharmony_ci}; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_cistruct mcu_msg_push_buffers_internal_buffer { 17862306a36Sopenharmony_ci u32 dma_addr; 17962306a36Sopenharmony_ci u32 mcu_addr; 18062306a36Sopenharmony_ci u32 size; 18162306a36Sopenharmony_ci}; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistruct mcu_msg_push_buffers_internal { 18462306a36Sopenharmony_ci struct mcu_msg_header header; 18562306a36Sopenharmony_ci u32 channel_id; 18662306a36Sopenharmony_ci size_t num_buffers; 18762306a36Sopenharmony_ci struct mcu_msg_push_buffers_internal_buffer buffer[]; 18862306a36Sopenharmony_ci}; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cistruct mcu_msg_put_stream_buffer { 19162306a36Sopenharmony_ci struct mcu_msg_header header; 19262306a36Sopenharmony_ci u32 channel_id; 19362306a36Sopenharmony_ci u32 dma_addr; 19462306a36Sopenharmony_ci u32 mcu_addr; 19562306a36Sopenharmony_ci u32 size; 19662306a36Sopenharmony_ci u32 offset; 19762306a36Sopenharmony_ci u64 dst_handle; 19862306a36Sopenharmony_ci}; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cistruct mcu_msg_encode_frame { 20162306a36Sopenharmony_ci struct mcu_msg_header header; 20262306a36Sopenharmony_ci u32 channel_id; 20362306a36Sopenharmony_ci u32 reserved; 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci u32 encoding_options; 20662306a36Sopenharmony_ci#define AL_OPT_USE_QP_TABLE BIT(0) 20762306a36Sopenharmony_ci#define AL_OPT_FORCE_LOAD BIT(1) 20862306a36Sopenharmony_ci#define AL_OPT_USE_L2 BIT(2) 20962306a36Sopenharmony_ci#define AL_OPT_DISABLE_INTRA BIT(3) 21062306a36Sopenharmony_ci#define AL_OPT_DEPENDENT_SLICES BIT(4) 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci s16 pps_qp; 21362306a36Sopenharmony_ci u16 padding; 21462306a36Sopenharmony_ci u64 user_param; 21562306a36Sopenharmony_ci u64 src_handle; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci u32 request_options; 21862306a36Sopenharmony_ci#define AL_OPT_SCENE_CHANGE BIT(0) 21962306a36Sopenharmony_ci#define AL_OPT_RESTART_GOP BIT(1) 22062306a36Sopenharmony_ci#define AL_OPT_USE_LONG_TERM BIT(2) 22162306a36Sopenharmony_ci#define AL_OPT_UPDATE_PARAMS BIT(3) 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci /* u32 scene_change_delay (optional) */ 22462306a36Sopenharmony_ci /* rate control param (optional) */ 22562306a36Sopenharmony_ci /* gop param (optional) */ 22662306a36Sopenharmony_ci /* dynamic resolution params (optional) */ 22762306a36Sopenharmony_ci u32 src_y; 22862306a36Sopenharmony_ci u32 src_uv; 22962306a36Sopenharmony_ci u32 is_10_bit; 23062306a36Sopenharmony_ci u32 stride; 23162306a36Sopenharmony_ci u32 format; 23262306a36Sopenharmony_ci u32 ep2; 23362306a36Sopenharmony_ci u64 ep2_v; 23462306a36Sopenharmony_ci}; 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistruct mcu_msg_encode_frame_response { 23762306a36Sopenharmony_ci struct mcu_msg_header header; 23862306a36Sopenharmony_ci u32 channel_id; 23962306a36Sopenharmony_ci u64 dst_handle; /* see mcu_msg_put_stream_buffer */ 24062306a36Sopenharmony_ci u64 user_param; /* see mcu_msg_encode_frame */ 24162306a36Sopenharmony_ci u64 src_handle; /* see mcu_msg_encode_frame */ 24262306a36Sopenharmony_ci u16 skip; 24362306a36Sopenharmony_ci u16 is_ref; 24462306a36Sopenharmony_ci u32 initial_removal_delay; 24562306a36Sopenharmony_ci u32 dpb_output_delay; 24662306a36Sopenharmony_ci u32 size; 24762306a36Sopenharmony_ci u32 frame_tag_size; 24862306a36Sopenharmony_ci s32 stuffing; 24962306a36Sopenharmony_ci s32 filler; 25062306a36Sopenharmony_ci u16 num_column; 25162306a36Sopenharmony_ci u16 num_row; 25262306a36Sopenharmony_ci u16 qp; 25362306a36Sopenharmony_ci u8 num_ref_idx_l0; 25462306a36Sopenharmony_ci u8 num_ref_idx_l1; 25562306a36Sopenharmony_ci u32 partition_table_offset; 25662306a36Sopenharmony_ci s32 partition_table_size; 25762306a36Sopenharmony_ci u32 sum_complex; 25862306a36Sopenharmony_ci s32 tile_width[4]; 25962306a36Sopenharmony_ci s32 tile_height[22]; 26062306a36Sopenharmony_ci u32 error_code; 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci u32 slice_type; 26362306a36Sopenharmony_ci#define AL_ENC_SLICE_TYPE_B 0 26462306a36Sopenharmony_ci#define AL_ENC_SLICE_TYPE_P 1 26562306a36Sopenharmony_ci#define AL_ENC_SLICE_TYPE_I 2 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_ci u32 pic_struct; 26862306a36Sopenharmony_ci u8 is_idr; 26962306a36Sopenharmony_ci u8 is_first_slice; 27062306a36Sopenharmony_ci u8 is_last_slice; 27162306a36Sopenharmony_ci u8 reserved; 27262306a36Sopenharmony_ci u16 pps_qp; 27362306a36Sopenharmony_ci u16 reserved1; 27462306a36Sopenharmony_ci u32 reserved2; 27562306a36Sopenharmony_ci u32 reserved3; 27662306a36Sopenharmony_ci u32 reserved4; 27762306a36Sopenharmony_ci u32 reserved5; 27862306a36Sopenharmony_ci u32 reserved6; 27962306a36Sopenharmony_ci}; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ciunion mcu_msg_response { 28262306a36Sopenharmony_ci struct mcu_msg_header header; 28362306a36Sopenharmony_ci struct mcu_msg_init_response init; 28462306a36Sopenharmony_ci struct mcu_msg_create_channel_response create_channel; 28562306a36Sopenharmony_ci struct mcu_msg_destroy_channel_response destroy_channel; 28662306a36Sopenharmony_ci struct mcu_msg_encode_frame_response encode_frame; 28762306a36Sopenharmony_ci}; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cissize_t allegro_encode_config_blob(u32 *dst, struct create_channel_param *param); 29062306a36Sopenharmony_cissize_t allegro_decode_config_blob(struct create_channel_param *param, 29162306a36Sopenharmony_ci struct mcu_msg_create_channel_response *msg, 29262306a36Sopenharmony_ci u32 *src); 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ciint allegro_decode_mail(void *msg, u32 *src); 29562306a36Sopenharmony_cissize_t allegro_encode_mail(u32 *dst, void *msg); 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci#endif 298