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