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