xref: /openbmc/linux/drivers/media/platform/allegro-dvt/allegro-mail.h (revision d74d4e2359ec7985831192f9b5ee22ed5e55b81c)
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