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
13enum 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
23enum mcu_msg_version {
24	MCU_MSG_VERSION_2018_2,
25	MCU_MSG_VERSION_2019_2,
26};
27
28const char *msg_type_name(enum mcu_msg_type type);
29
30struct mcu_msg_header {
31	enum mcu_msg_type type;
32	enum mcu_msg_version version;
33};
34
35struct 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
46struct mcu_msg_init_response {
47	struct mcu_msg_header header;
48	u32 reserved0;
49};
50
51struct 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
142struct 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
151struct 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
167struct mcu_msg_destroy_channel {
168	struct mcu_msg_header header;
169	u32 channel_id;
170};
171
172struct mcu_msg_destroy_channel_response {
173	struct mcu_msg_header header;
174	u32 channel_id;
175};
176
177struct mcu_msg_push_buffers_internal_buffer {
178	u32 dma_addr;
179	u32 mcu_addr;
180	u32 size;
181};
182
183struct 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[] __counted_by(num_buffers);
188};
189
190struct 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
200struct 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
236struct 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
281union 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
289ssize_t allegro_encode_config_blob(u32 *dst, struct create_channel_param *param);
290ssize_t allegro_decode_config_blob(struct create_channel_param *param,
291				   struct mcu_msg_create_channel_response *msg,
292				   u32 *src);
293
294int allegro_decode_mail(void *msg, u32 *src);
295ssize_t allegro_encode_mail(u32 *dst, void *msg);
296
297#endif
298