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