xref: /linux/drivers/media/platform/allegro-dvt/allegro-core.c (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) 2019 Pengutronix, Michael Tretter <kernel@pengutronix.de>
4  *
5  * Allegro DVT video encoder driver
6  */
7 
8 #include <linux/bits.h>
9 #include <linux/clk.h>
10 #include <linux/firmware.h>
11 #include <linux/gcd.h>
12 #include <linux/interrupt.h>
13 #include <linux/io.h>
14 #include <linux/kernel.h>
15 #include <linux/log2.h>
16 #include <linux/mfd/syscon.h>
17 #include <linux/mfd/syscon/xlnx-vcu.h>
18 #include <linux/module.h>
19 #include <linux/of.h>
20 #include <linux/platform_device.h>
21 #include <linux/pm_runtime.h>
22 #include <linux/regmap.h>
23 #include <linux/sizes.h>
24 #include <linux/slab.h>
25 #include <linux/videodev2.h>
26 #include <media/v4l2-ctrls.h>
27 #include <media/v4l2-device.h>
28 #include <media/v4l2-event.h>
29 #include <media/v4l2-ioctl.h>
30 #include <media/v4l2-mem2mem.h>
31 #include <media/videobuf2-dma-contig.h>
32 #include <media/videobuf2-v4l2.h>
33 
34 #include "allegro-mail.h"
35 #include "nal-h264.h"
36 #include "nal-hevc.h"
37 
38 /*
39  * Support up to 4k video streams. The hardware actually supports higher
40  * resolutions, which are specified in PG252 June 6, 2018 (H.264/H.265 Video
41  * Codec Unit v1.1) Chapter 3.
42  */
43 #define ALLEGRO_WIDTH_MIN 128
44 #define ALLEGRO_WIDTH_DEFAULT 1920
45 #define ALLEGRO_WIDTH_MAX 3840
46 #define ALLEGRO_HEIGHT_MIN 64
47 #define ALLEGRO_HEIGHT_DEFAULT 1080
48 #define ALLEGRO_HEIGHT_MAX 2160
49 
50 #define ALLEGRO_FRAMERATE_DEFAULT ((struct v4l2_fract) { 30, 1 })
51 
52 #define ALLEGRO_GOP_SIZE_DEFAULT 25
53 #define ALLEGRO_GOP_SIZE_MAX 1000
54 
55 /*
56  * MCU Control Registers
57  *
58  * The Zynq UltraScale+ Devices Register Reference documents the registers
59  * with an offset of 0x9000, which equals the size of the SRAM and one page
60  * gap. The driver handles SRAM and registers separately and, therefore, is
61  * oblivious of the offset.
62  */
63 #define AL5_MCU_RESET                   0x0000
64 #define AL5_MCU_RESET_SOFT              BIT(0)
65 #define AL5_MCU_RESET_REGS              BIT(1)
66 #define AL5_MCU_RESET_MODE              0x0004
67 #define AL5_MCU_RESET_MODE_SLEEP        BIT(0)
68 #define AL5_MCU_RESET_MODE_HALT         BIT(1)
69 #define AL5_MCU_STA                     0x0008
70 #define AL5_MCU_STA_SLEEP               BIT(0)
71 #define AL5_MCU_WAKEUP                  0x000c
72 
73 #define AL5_ICACHE_ADDR_OFFSET_MSB      0x0010
74 #define AL5_ICACHE_ADDR_OFFSET_LSB      0x0014
75 #define AL5_DCACHE_ADDR_OFFSET_MSB      0x0018
76 #define AL5_DCACHE_ADDR_OFFSET_LSB      0x001c
77 
78 #define AL5_MCU_INTERRUPT               0x0100
79 #define AL5_ITC_CPU_IRQ_MSK             0x0104
80 #define AL5_ITC_CPU_IRQ_CLR             0x0108
81 #define AL5_ITC_CPU_IRQ_STA             0x010C
82 #define AL5_ITC_CPU_IRQ_STA_TRIGGERED   BIT(0)
83 
84 #define AXI_ADDR_OFFSET_IP              0x0208
85 
86 /*
87  * The MCU accesses the system memory with a 2G offset compared to CPU
88  * physical addresses.
89  */
90 #define MCU_CACHE_OFFSET SZ_2G
91 
92 /*
93  * The driver needs to reserve some space at the beginning of capture buffers,
94  * because it needs to write SPS/PPS NAL units. The encoder writes the actual
95  * frame data after the offset.
96  */
97 #define ENCODER_STREAM_OFFSET SZ_128
98 
99 #define SIZE_MACROBLOCK 16
100 
101 /* Encoding options */
102 #define LOG2_MAX_FRAME_NUM		4
103 #define LOG2_MAX_PIC_ORDER_CNT		10
104 #define BETA_OFFSET_DIV_2		-1
105 #define TC_OFFSET_DIV_2			-1
106 
107 /*
108  * This control allows applications to explicitly disable the encoder buffer.
109  * This value is Allegro specific.
110  */
111 #define V4L2_CID_USER_ALLEGRO_ENCODER_BUFFER (V4L2_CID_USER_ALLEGRO_BASE + 0)
112 
113 static int debug;
114 module_param(debug, int, 0644);
115 MODULE_PARM_DESC(debug, "Debug level (0-2)");
116 
117 struct allegro_buffer {
118 	void *vaddr;
119 	dma_addr_t paddr;
120 	size_t size;
121 	struct list_head head;
122 };
123 
124 struct allegro_dev;
125 struct allegro_channel;
126 
127 struct allegro_mbox {
128 	struct allegro_dev *dev;
129 	unsigned int head;
130 	unsigned int tail;
131 	unsigned int data;
132 	size_t size;
133 	/* protect mailbox from simultaneous accesses */
134 	struct mutex lock;
135 };
136 
137 struct allegro_encoder_buffer {
138 	unsigned int size;
139 	unsigned int color_depth;
140 	unsigned int num_cores;
141 	unsigned int clk_rate;
142 };
143 
144 struct allegro_dev {
145 	struct v4l2_device v4l2_dev;
146 	struct video_device video_dev;
147 	struct v4l2_m2m_dev *m2m_dev;
148 	struct platform_device *plat_dev;
149 
150 	/* mutex protecting vb2_queue structure */
151 	struct mutex lock;
152 
153 	struct regmap *regmap;
154 	struct regmap *sram;
155 	struct regmap *settings;
156 
157 	struct clk *clk_core;
158 	struct clk *clk_mcu;
159 
160 	const struct fw_info *fw_info;
161 	struct allegro_buffer firmware;
162 	struct allegro_buffer suballocator;
163 	bool has_encoder_buffer;
164 	struct allegro_encoder_buffer encoder_buffer;
165 
166 	struct completion init_complete;
167 	bool initialized;
168 
169 	/* The mailbox interface */
170 	struct allegro_mbox *mbox_command;
171 	struct allegro_mbox *mbox_status;
172 
173 	/*
174 	 * The downstream driver limits the users to 64 users, thus I can use
175 	 * a bitfield for the user_ids that are in use. See also user_id in
176 	 * struct allegro_channel.
177 	 */
178 	unsigned long channel_user_ids;
179 	struct list_head channels;
180 };
181 
182 static const struct regmap_config allegro_regmap_config = {
183 	.name = "regmap",
184 	.reg_bits = 32,
185 	.val_bits = 32,
186 	.reg_stride = 4,
187 	.max_register = 0xfff,
188 	.cache_type = REGCACHE_NONE,
189 };
190 
191 static const struct regmap_config allegro_sram_config = {
192 	.name = "sram",
193 	.reg_bits = 32,
194 	.val_bits = 32,
195 	.reg_stride = 4,
196 	.max_register = 0x7fff,
197 	.cache_type = REGCACHE_NONE,
198 };
199 
200 #define fh_to_channel(__fh) container_of(__fh, struct allegro_channel, fh)
201 
202 struct allegro_channel {
203 	struct allegro_dev *dev;
204 	struct v4l2_fh fh;
205 	struct v4l2_ctrl_handler ctrl_handler;
206 
207 	unsigned int width;
208 	unsigned int height;
209 	unsigned int stride;
210 	struct v4l2_fract framerate;
211 
212 	enum v4l2_colorspace colorspace;
213 	enum v4l2_ycbcr_encoding ycbcr_enc;
214 	enum v4l2_quantization quantization;
215 	enum v4l2_xfer_func xfer_func;
216 
217 	u32 pixelformat;
218 	unsigned int sizeimage_raw;
219 	unsigned int osequence;
220 
221 	u32 codec;
222 	unsigned int sizeimage_encoded;
223 	unsigned int csequence;
224 
225 	bool frame_rc_enable;
226 	unsigned int bitrate;
227 	unsigned int bitrate_peak;
228 
229 	struct allegro_buffer config_blob;
230 
231 	unsigned int log2_max_frame_num;
232 	bool temporal_mvp_enable;
233 
234 	bool enable_loop_filter_across_tiles;
235 	bool enable_loop_filter_across_slices;
236 	bool enable_deblocking_filter_override;
237 	bool enable_reordering;
238 	bool dbf_ovr_en;
239 
240 	unsigned int num_ref_idx_l0;
241 	unsigned int num_ref_idx_l1;
242 
243 	/* Maximum range for motion estimation */
244 	int b_hrz_me_range;
245 	int b_vrt_me_range;
246 	int p_hrz_me_range;
247 	int p_vrt_me_range;
248 	/* Size limits of coding unit */
249 	int min_cu_size;
250 	int max_cu_size;
251 	/* Size limits of transform unit */
252 	int min_tu_size;
253 	int max_tu_size;
254 	int max_transfo_depth_intra;
255 	int max_transfo_depth_inter;
256 
257 	struct v4l2_ctrl *mpeg_video_h264_profile;
258 	struct v4l2_ctrl *mpeg_video_h264_level;
259 	struct v4l2_ctrl *mpeg_video_h264_i_frame_qp;
260 	struct v4l2_ctrl *mpeg_video_h264_max_qp;
261 	struct v4l2_ctrl *mpeg_video_h264_min_qp;
262 	struct v4l2_ctrl *mpeg_video_h264_p_frame_qp;
263 	struct v4l2_ctrl *mpeg_video_h264_b_frame_qp;
264 
265 	struct v4l2_ctrl *mpeg_video_hevc_profile;
266 	struct v4l2_ctrl *mpeg_video_hevc_level;
267 	struct v4l2_ctrl *mpeg_video_hevc_tier;
268 	struct v4l2_ctrl *mpeg_video_hevc_i_frame_qp;
269 	struct v4l2_ctrl *mpeg_video_hevc_max_qp;
270 	struct v4l2_ctrl *mpeg_video_hevc_min_qp;
271 	struct v4l2_ctrl *mpeg_video_hevc_p_frame_qp;
272 	struct v4l2_ctrl *mpeg_video_hevc_b_frame_qp;
273 
274 	struct v4l2_ctrl *mpeg_video_frame_rc_enable;
275 	struct { /* video bitrate mode control cluster */
276 		struct v4l2_ctrl *mpeg_video_bitrate_mode;
277 		struct v4l2_ctrl *mpeg_video_bitrate;
278 		struct v4l2_ctrl *mpeg_video_bitrate_peak;
279 	};
280 	struct v4l2_ctrl *mpeg_video_cpb_size;
281 	struct v4l2_ctrl *mpeg_video_gop_size;
282 
283 	struct v4l2_ctrl *encoder_buffer;
284 
285 	/* user_id is used to identify the channel during CREATE_CHANNEL */
286 	/* not sure, what to set here and if this is actually required */
287 	int user_id;
288 	/* channel_id is set by the mcu and used by all later commands */
289 	int mcu_channel_id;
290 
291 	struct list_head buffers_reference;
292 	struct list_head buffers_intermediate;
293 
294 	struct list_head source_shadow_list;
295 	struct list_head stream_shadow_list;
296 	/* protect shadow lists of buffers passed to firmware */
297 	struct mutex shadow_list_lock;
298 
299 	struct list_head list;
300 	struct completion completion;
301 
302 	unsigned int error;
303 };
304 
305 static inline int
306 allegro_channel_get_i_frame_qp(struct allegro_channel *channel)
307 {
308 	if (channel->codec == V4L2_PIX_FMT_HEVC)
309 		return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_i_frame_qp);
310 	else
311 		return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_i_frame_qp);
312 }
313 
314 static inline int
315 allegro_channel_get_p_frame_qp(struct allegro_channel *channel)
316 {
317 	if (channel->codec == V4L2_PIX_FMT_HEVC)
318 		return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_p_frame_qp);
319 	else
320 		return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_p_frame_qp);
321 }
322 
323 static inline int
324 allegro_channel_get_b_frame_qp(struct allegro_channel *channel)
325 {
326 	if (channel->codec == V4L2_PIX_FMT_HEVC)
327 		return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_b_frame_qp);
328 	else
329 		return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_b_frame_qp);
330 }
331 
332 static inline int
333 allegro_channel_get_min_qp(struct allegro_channel *channel)
334 {
335 	if (channel->codec == V4L2_PIX_FMT_HEVC)
336 		return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_min_qp);
337 	else
338 		return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_min_qp);
339 }
340 
341 static inline int
342 allegro_channel_get_max_qp(struct allegro_channel *channel)
343 {
344 	if (channel->codec == V4L2_PIX_FMT_HEVC)
345 		return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_max_qp);
346 	else
347 		return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_max_qp);
348 }
349 
350 struct allegro_m2m_buffer {
351 	struct v4l2_m2m_buffer buf;
352 	struct list_head head;
353 };
354 
355 #define to_allegro_m2m_buffer(__buf) \
356 	container_of(__buf, struct allegro_m2m_buffer, buf)
357 
358 struct fw_info {
359 	unsigned int id;
360 	unsigned int id_codec;
361 	char *version;
362 	unsigned int mailbox_cmd;
363 	unsigned int mailbox_status;
364 	size_t mailbox_size;
365 	enum mcu_msg_version mailbox_version;
366 	size_t suballocator_size;
367 };
368 
369 static const struct fw_info supported_firmware[] = {
370 	{
371 		.id = 18296,
372 		.id_codec = 96272,
373 		.version = "v2018.2",
374 		.mailbox_cmd = 0x7800,
375 		.mailbox_status = 0x7c00,
376 		.mailbox_size = 0x400 - 0x8,
377 		.mailbox_version = MCU_MSG_VERSION_2018_2,
378 		.suballocator_size = SZ_16M,
379 	}, {
380 		.id = 14680,
381 		.id_codec = 126572,
382 		.version = "v2019.2",
383 		.mailbox_cmd = 0x7000,
384 		.mailbox_status = 0x7800,
385 		.mailbox_size = 0x800 - 0x8,
386 		.mailbox_version = MCU_MSG_VERSION_2019_2,
387 		.suballocator_size = SZ_32M,
388 	},
389 };
390 
391 static inline u32 to_mcu_addr(struct allegro_dev *dev, dma_addr_t phys)
392 {
393 	if (upper_32_bits(phys) || (lower_32_bits(phys) & MCU_CACHE_OFFSET))
394 		v4l2_warn(&dev->v4l2_dev,
395 			  "address %pad is outside mcu window\n", &phys);
396 
397 	return lower_32_bits(phys) | MCU_CACHE_OFFSET;
398 }
399 
400 static inline u32 to_mcu_size(struct allegro_dev *dev, size_t size)
401 {
402 	return lower_32_bits(size);
403 }
404 
405 static inline u32 to_codec_addr(struct allegro_dev *dev, dma_addr_t phys)
406 {
407 	if (upper_32_bits(phys))
408 		v4l2_warn(&dev->v4l2_dev,
409 			  "address %pad cannot be used by codec\n", &phys);
410 
411 	return lower_32_bits(phys);
412 }
413 
414 static inline u64 ptr_to_u64(const void *ptr)
415 {
416 	return (uintptr_t)ptr;
417 }
418 
419 /* Helper functions for channel and user operations */
420 
421 static unsigned long allegro_next_user_id(struct allegro_dev *dev)
422 {
423 	if (dev->channel_user_ids == ~0UL)
424 		return -EBUSY;
425 
426 	return ffz(dev->channel_user_ids);
427 }
428 
429 static struct allegro_channel *
430 allegro_find_channel_by_user_id(struct allegro_dev *dev,
431 				unsigned int user_id)
432 {
433 	struct allegro_channel *channel;
434 
435 	list_for_each_entry(channel, &dev->channels, list) {
436 		if (channel->user_id == user_id)
437 			return channel;
438 	}
439 
440 	return ERR_PTR(-EINVAL);
441 }
442 
443 static struct allegro_channel *
444 allegro_find_channel_by_channel_id(struct allegro_dev *dev,
445 				   unsigned int channel_id)
446 {
447 	struct allegro_channel *channel;
448 
449 	list_for_each_entry(channel, &dev->channels, list) {
450 		if (channel->mcu_channel_id == channel_id)
451 			return channel;
452 	}
453 
454 	return ERR_PTR(-EINVAL);
455 }
456 
457 static inline bool channel_exists(struct allegro_channel *channel)
458 {
459 	return channel->mcu_channel_id != -1;
460 }
461 
462 #define AL_ERROR			0x80
463 #define AL_ERR_INIT_FAILED		0x81
464 #define AL_ERR_NO_FRAME_DECODED		0x82
465 #define AL_ERR_RESOLUTION_CHANGE	0x85
466 #define AL_ERR_NO_MEMORY		0x87
467 #define AL_ERR_STREAM_OVERFLOW		0x88
468 #define AL_ERR_TOO_MANY_SLICES		0x89
469 #define AL_ERR_BUF_NOT_READY		0x8c
470 #define AL_ERR_NO_CHANNEL_AVAILABLE	0x8d
471 #define AL_ERR_RESOURCE_UNAVAILABLE	0x8e
472 #define AL_ERR_NOT_ENOUGH_CORES		0x8f
473 #define AL_ERR_REQUEST_MALFORMED	0x90
474 #define AL_ERR_CMD_NOT_ALLOWED		0x91
475 #define AL_ERR_INVALID_CMD_VALUE	0x92
476 
477 static inline const char *allegro_err_to_string(unsigned int err)
478 {
479 	switch (err) {
480 	case AL_ERR_INIT_FAILED:
481 		return "initialization failed";
482 	case AL_ERR_NO_FRAME_DECODED:
483 		return "no frame decoded";
484 	case AL_ERR_RESOLUTION_CHANGE:
485 		return "resolution change";
486 	case AL_ERR_NO_MEMORY:
487 		return "out of memory";
488 	case AL_ERR_STREAM_OVERFLOW:
489 		return "stream buffer overflow";
490 	case AL_ERR_TOO_MANY_SLICES:
491 		return "too many slices";
492 	case AL_ERR_BUF_NOT_READY:
493 		return "buffer not ready";
494 	case AL_ERR_NO_CHANNEL_AVAILABLE:
495 		return "no channel available";
496 	case AL_ERR_RESOURCE_UNAVAILABLE:
497 		return "resource unavailable";
498 	case AL_ERR_NOT_ENOUGH_CORES:
499 		return "not enough cores";
500 	case AL_ERR_REQUEST_MALFORMED:
501 		return "request malformed";
502 	case AL_ERR_CMD_NOT_ALLOWED:
503 		return "command not allowed";
504 	case AL_ERR_INVALID_CMD_VALUE:
505 		return "invalid command value";
506 	case AL_ERROR:
507 	default:
508 		return "unknown error";
509 	}
510 }
511 
512 static unsigned int estimate_stream_size(unsigned int width,
513 					 unsigned int height)
514 {
515 	unsigned int offset = ENCODER_STREAM_OFFSET;
516 	unsigned int num_blocks = DIV_ROUND_UP(width, SIZE_MACROBLOCK) *
517 					DIV_ROUND_UP(height, SIZE_MACROBLOCK);
518 	unsigned int pcm_size = SZ_256;
519 	unsigned int partition_table = SZ_256;
520 
521 	return round_up(offset + num_blocks * pcm_size + partition_table, 32);
522 }
523 
524 static enum v4l2_mpeg_video_h264_level
525 select_minimum_h264_level(unsigned int width, unsigned int height)
526 {
527 	unsigned int pic_width_in_mb = DIV_ROUND_UP(width, SIZE_MACROBLOCK);
528 	unsigned int frame_height_in_mb = DIV_ROUND_UP(height, SIZE_MACROBLOCK);
529 	unsigned int frame_size_in_mb = pic_width_in_mb * frame_height_in_mb;
530 	enum v4l2_mpeg_video_h264_level level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
531 
532 	/*
533 	 * The level limits are specified in Rec. ITU-T H.264 Annex A.3.1 and
534 	 * also specify limits regarding bit rate and CBP size. Only approximate
535 	 * the levels using the frame size.
536 	 *
537 	 * Level 5.1 allows up to 4k video resolution.
538 	 */
539 	if (frame_size_in_mb <= 99)
540 		level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
541 	else if (frame_size_in_mb <= 396)
542 		level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
543 	else if (frame_size_in_mb <= 792)
544 		level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
545 	else if (frame_size_in_mb <= 1620)
546 		level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
547 	else if (frame_size_in_mb <= 3600)
548 		level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
549 	else if (frame_size_in_mb <= 5120)
550 		level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
551 	else if (frame_size_in_mb <= 8192)
552 		level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
553 	else if (frame_size_in_mb <= 8704)
554 		level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
555 	else if (frame_size_in_mb <= 22080)
556 		level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
557 	else
558 		level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
559 
560 	return level;
561 }
562 
563 static unsigned int h264_maximum_bitrate(enum v4l2_mpeg_video_h264_level level)
564 {
565 	switch (level) {
566 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
567 		return 64000;
568 	case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
569 		return 128000;
570 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
571 		return 192000;
572 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
573 		return 384000;
574 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
575 		return 768000;
576 	case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
577 		return 2000000;
578 	case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
579 		return 4000000;
580 	case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
581 		return 4000000;
582 	case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
583 		return 10000000;
584 	case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
585 		return 14000000;
586 	case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
587 		return 20000000;
588 	case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
589 		return 20000000;
590 	case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
591 		return 50000000;
592 	case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
593 		return 50000000;
594 	case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
595 		return 135000000;
596 	case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
597 	default:
598 		return 240000000;
599 	}
600 }
601 
602 static unsigned int h264_maximum_cpb_size(enum v4l2_mpeg_video_h264_level level)
603 {
604 	switch (level) {
605 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
606 		return 175;
607 	case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
608 		return 350;
609 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
610 		return 500;
611 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
612 		return 1000;
613 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
614 		return 2000;
615 	case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
616 		return 2000;
617 	case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
618 		return 4000;
619 	case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
620 		return 4000;
621 	case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
622 		return 10000;
623 	case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
624 		return 14000;
625 	case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
626 		return 20000;
627 	case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
628 		return 25000;
629 	case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
630 		return 62500;
631 	case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
632 		return 62500;
633 	case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
634 		return 135000;
635 	case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
636 	default:
637 		return 240000;
638 	}
639 }
640 
641 static enum v4l2_mpeg_video_hevc_level
642 select_minimum_hevc_level(unsigned int width, unsigned int height)
643 {
644 	unsigned int luma_picture_size = width * height;
645 	enum v4l2_mpeg_video_hevc_level level;
646 
647 	if (luma_picture_size <= 36864)
648 		level = V4L2_MPEG_VIDEO_HEVC_LEVEL_1;
649 	else if (luma_picture_size <= 122880)
650 		level = V4L2_MPEG_VIDEO_HEVC_LEVEL_2;
651 	else if (luma_picture_size <= 245760)
652 		level = V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1;
653 	else if (luma_picture_size <= 552960)
654 		level = V4L2_MPEG_VIDEO_HEVC_LEVEL_3;
655 	else if (luma_picture_size <= 983040)
656 		level = V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1;
657 	else if (luma_picture_size <= 2228224)
658 		level = V4L2_MPEG_VIDEO_HEVC_LEVEL_4;
659 	else if (luma_picture_size <= 8912896)
660 		level = V4L2_MPEG_VIDEO_HEVC_LEVEL_5;
661 	else
662 		level = V4L2_MPEG_VIDEO_HEVC_LEVEL_6;
663 
664 	return level;
665 }
666 
667 static unsigned int hevc_maximum_bitrate(enum v4l2_mpeg_video_hevc_level level)
668 {
669 	/*
670 	 * See Rec. ITU-T H.265 v5 (02/2018), A.4.2 Profile-specific level
671 	 * limits for the video profiles.
672 	 */
673 	switch (level) {
674 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_1:
675 		return 128;
676 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_2:
677 		return 1500;
678 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1:
679 		return 3000;
680 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_3:
681 		return 6000;
682 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1:
683 		return 10000;
684 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_4:
685 		return 12000;
686 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1:
687 		return 20000;
688 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_5:
689 		return 25000;
690 	default:
691 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1:
692 		return 40000;
693 	}
694 }
695 
696 static unsigned int hevc_maximum_cpb_size(enum v4l2_mpeg_video_hevc_level level)
697 {
698 	switch (level) {
699 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_1:
700 		return 350;
701 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_2:
702 		return 1500;
703 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1:
704 		return 3000;
705 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_3:
706 		return 6000;
707 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1:
708 		return 10000;
709 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_4:
710 		return 12000;
711 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1:
712 		return 20000;
713 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_5:
714 		return 25000;
715 	default:
716 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1:
717 		return 40000;
718 	}
719 }
720 
721 static const struct fw_info *
722 allegro_get_firmware_info(struct allegro_dev *dev,
723 			  const struct firmware *fw,
724 			  const struct firmware *fw_codec)
725 {
726 	int i;
727 	unsigned int id = fw->size;
728 	unsigned int id_codec = fw_codec->size;
729 
730 	for (i = 0; i < ARRAY_SIZE(supported_firmware); i++)
731 		if (supported_firmware[i].id == id &&
732 		    supported_firmware[i].id_codec == id_codec)
733 			return &supported_firmware[i];
734 
735 	return NULL;
736 }
737 
738 /*
739  * Buffers that are used internally by the MCU.
740  */
741 
742 static int allegro_alloc_buffer(struct allegro_dev *dev,
743 				struct allegro_buffer *buffer, size_t size)
744 {
745 	buffer->vaddr = dma_alloc_coherent(&dev->plat_dev->dev, size,
746 					   &buffer->paddr, GFP_KERNEL);
747 	if (!buffer->vaddr)
748 		return -ENOMEM;
749 	buffer->size = size;
750 
751 	return 0;
752 }
753 
754 static void allegro_free_buffer(struct allegro_dev *dev,
755 				struct allegro_buffer *buffer)
756 {
757 	if (buffer->vaddr) {
758 		dma_free_coherent(&dev->plat_dev->dev, buffer->size,
759 				  buffer->vaddr, buffer->paddr);
760 		buffer->vaddr = NULL;
761 		buffer->size = 0;
762 	}
763 }
764 
765 /*
766  * Mailbox interface to send messages to the MCU.
767  */
768 
769 static void allegro_mcu_interrupt(struct allegro_dev *dev);
770 static void allegro_handle_message(struct allegro_dev *dev,
771 				   union mcu_msg_response *msg);
772 
773 static struct allegro_mbox *allegro_mbox_init(struct allegro_dev *dev,
774 					      unsigned int base, size_t size)
775 {
776 	struct allegro_mbox *mbox;
777 
778 	mbox = devm_kmalloc(&dev->plat_dev->dev, sizeof(*mbox), GFP_KERNEL);
779 	if (!mbox)
780 		return ERR_PTR(-ENOMEM);
781 
782 	mbox->dev = dev;
783 
784 	mbox->head = base;
785 	mbox->tail = base + 0x4;
786 	mbox->data = base + 0x8;
787 	mbox->size = size;
788 	mutex_init(&mbox->lock);
789 
790 	regmap_write(dev->sram, mbox->head, 0);
791 	regmap_write(dev->sram, mbox->tail, 0);
792 
793 	return mbox;
794 }
795 
796 static int allegro_mbox_write(struct allegro_mbox *mbox,
797 			      const u32 *src, size_t size)
798 {
799 	struct regmap *sram = mbox->dev->sram;
800 	unsigned int tail;
801 	size_t size_no_wrap;
802 	int err = 0;
803 	int stride = regmap_get_reg_stride(sram);
804 
805 	if (!src)
806 		return -EINVAL;
807 
808 	if (size > mbox->size)
809 		return -EINVAL;
810 
811 	mutex_lock(&mbox->lock);
812 	regmap_read(sram, mbox->tail, &tail);
813 	if (tail > mbox->size) {
814 		err = -EIO;
815 		goto out;
816 	}
817 	size_no_wrap = min(size, mbox->size - (size_t)tail);
818 	regmap_bulk_write(sram, mbox->data + tail,
819 			  src, size_no_wrap / stride);
820 	regmap_bulk_write(sram, mbox->data,
821 			  src + (size_no_wrap / sizeof(*src)),
822 			  (size - size_no_wrap) / stride);
823 	regmap_write(sram, mbox->tail, (tail + size) % mbox->size);
824 
825 out:
826 	mutex_unlock(&mbox->lock);
827 
828 	return err;
829 }
830 
831 static ssize_t allegro_mbox_read(struct allegro_mbox *mbox,
832 				 u32 *dst, size_t nbyte)
833 {
834 	struct {
835 		u16 length;
836 		u16 type;
837 	} __attribute__ ((__packed__)) *header;
838 	struct regmap *sram = mbox->dev->sram;
839 	unsigned int head;
840 	ssize_t size;
841 	size_t body_no_wrap;
842 	int stride = regmap_get_reg_stride(sram);
843 
844 	regmap_read(sram, mbox->head, &head);
845 	if (head > mbox->size)
846 		return -EIO;
847 
848 	/* Assume that the header does not wrap. */
849 	regmap_bulk_read(sram, mbox->data + head,
850 			 dst, sizeof(*header) / stride);
851 	header = (void *)dst;
852 	size = header->length + sizeof(*header);
853 	if (size > mbox->size || size & 0x3)
854 		return -EIO;
855 	if (size > nbyte)
856 		return -EINVAL;
857 
858 	/*
859 	 * The message might wrap within the mailbox. If the message does not
860 	 * wrap, the first read will read the entire message, otherwise the
861 	 * first read will read message until the end of the mailbox and the
862 	 * second read will read the remaining bytes from the beginning of the
863 	 * mailbox.
864 	 *
865 	 * Skip the header, as was already read to get the size of the body.
866 	 */
867 	body_no_wrap = min((size_t)header->length,
868 			   (size_t)(mbox->size - (head + sizeof(*header))));
869 	regmap_bulk_read(sram, mbox->data + head + sizeof(*header),
870 			 dst + (sizeof(*header) / sizeof(*dst)),
871 			 body_no_wrap / stride);
872 	regmap_bulk_read(sram, mbox->data,
873 			 dst + (sizeof(*header) + body_no_wrap) / sizeof(*dst),
874 			 (header->length - body_no_wrap) / stride);
875 
876 	regmap_write(sram, mbox->head, (head + size) % mbox->size);
877 
878 	return size;
879 }
880 
881 /**
882  * allegro_mbox_send() - Send a message via the mailbox
883  * @mbox: the mailbox which is used to send the message
884  * @msg: the message to send
885  */
886 static int allegro_mbox_send(struct allegro_mbox *mbox, void *msg)
887 {
888 	struct allegro_dev *dev = mbox->dev;
889 	ssize_t size;
890 	int err;
891 	u32 *tmp;
892 
893 	tmp = kzalloc(mbox->size, GFP_KERNEL);
894 	if (!tmp) {
895 		err = -ENOMEM;
896 		goto out;
897 	}
898 
899 	size = allegro_encode_mail(tmp, msg);
900 
901 	err = allegro_mbox_write(mbox, tmp, size);
902 	kfree(tmp);
903 	if (err)
904 		goto out;
905 
906 	allegro_mcu_interrupt(dev);
907 
908 out:
909 	return err;
910 }
911 
912 /**
913  * allegro_mbox_notify() - Notify the mailbox about a new message
914  * @mbox: The allegro_mbox to notify
915  */
916 static void allegro_mbox_notify(struct allegro_mbox *mbox)
917 {
918 	struct allegro_dev *dev = mbox->dev;
919 	union mcu_msg_response *msg;
920 	ssize_t size;
921 	u32 *tmp;
922 	int err;
923 
924 	msg = kmalloc(sizeof(*msg), GFP_KERNEL);
925 	if (!msg)
926 		return;
927 
928 	msg->header.version = dev->fw_info->mailbox_version;
929 
930 	tmp = kmalloc(mbox->size, GFP_KERNEL);
931 	if (!tmp)
932 		goto out;
933 
934 	size = allegro_mbox_read(mbox, tmp, mbox->size);
935 	if (size < 0)
936 		goto out;
937 
938 	err = allegro_decode_mail(msg, tmp);
939 	if (err)
940 		goto out;
941 
942 	allegro_handle_message(dev, msg);
943 
944 out:
945 	kfree(tmp);
946 	kfree(msg);
947 }
948 
949 static int allegro_encoder_buffer_init(struct allegro_dev *dev,
950 				       struct allegro_encoder_buffer *buffer)
951 {
952 	int err;
953 	struct regmap *settings = dev->settings;
954 	unsigned int supports_10_bit;
955 	unsigned int memory_depth;
956 	unsigned int num_cores;
957 	unsigned int color_depth;
958 	unsigned long clk_rate;
959 
960 	/* We don't support the encoder buffer pre Firmware version 2019.2 */
961 	if (dev->fw_info->mailbox_version < MCU_MSG_VERSION_2019_2)
962 		return -ENODEV;
963 
964 	if (!settings)
965 		return -EINVAL;
966 
967 	err = regmap_read(settings, VCU_ENC_COLOR_DEPTH, &supports_10_bit);
968 	if (err < 0)
969 		return err;
970 	err = regmap_read(settings, VCU_MEMORY_DEPTH, &memory_depth);
971 	if (err < 0)
972 		return err;
973 	err = regmap_read(settings, VCU_NUM_CORE, &num_cores);
974 	if (err < 0)
975 		return err;
976 
977 	clk_rate = clk_get_rate(dev->clk_core);
978 	if (clk_rate == 0)
979 		return -EINVAL;
980 
981 	color_depth = supports_10_bit ? 10 : 8;
982 	/* The firmware expects the encoder buffer size in bits. */
983 	buffer->size = color_depth * 32 * memory_depth;
984 	buffer->color_depth = color_depth;
985 	buffer->num_cores = num_cores;
986 	buffer->clk_rate = clk_rate;
987 
988 	v4l2_dbg(1, debug, &dev->v4l2_dev,
989 		 "using %d bits encoder buffer with %d-bit color depth\n",
990 		 buffer->size, color_depth);
991 
992 	return 0;
993 }
994 
995 static void allegro_mcu_send_init(struct allegro_dev *dev,
996 				  dma_addr_t suballoc_dma, size_t suballoc_size)
997 {
998 	struct mcu_msg_init_request msg;
999 
1000 	memset(&msg, 0, sizeof(msg));
1001 
1002 	msg.header.type = MCU_MSG_TYPE_INIT;
1003 	msg.header.version = dev->fw_info->mailbox_version;
1004 
1005 	msg.suballoc_dma = to_mcu_addr(dev, suballoc_dma);
1006 	msg.suballoc_size = to_mcu_size(dev, suballoc_size);
1007 
1008 	if (dev->has_encoder_buffer) {
1009 		msg.encoder_buffer_size = dev->encoder_buffer.size;
1010 		msg.encoder_buffer_color_depth = dev->encoder_buffer.color_depth;
1011 		msg.num_cores = dev->encoder_buffer.num_cores;
1012 		msg.clk_rate = dev->encoder_buffer.clk_rate;
1013 	} else {
1014 		msg.encoder_buffer_size = -1;
1015 		msg.encoder_buffer_color_depth = -1;
1016 		msg.num_cores = -1;
1017 		msg.clk_rate = -1;
1018 	}
1019 
1020 	allegro_mbox_send(dev->mbox_command, &msg);
1021 }
1022 
1023 static u32 v4l2_pixelformat_to_mcu_format(u32 pixelformat)
1024 {
1025 	switch (pixelformat) {
1026 	case V4L2_PIX_FMT_NV12:
1027 		/* AL_420_8BITS: 0x100 -> NV12, 0x88 -> 8 bit */
1028 		return 0x100 | 0x88;
1029 	default:
1030 		return -EINVAL;
1031 	}
1032 }
1033 
1034 static u32 v4l2_colorspace_to_mcu_colorspace(enum v4l2_colorspace colorspace)
1035 {
1036 	switch (colorspace) {
1037 	case V4L2_COLORSPACE_REC709:
1038 		return 2;
1039 	case V4L2_COLORSPACE_SMPTE170M:
1040 		return 3;
1041 	case V4L2_COLORSPACE_SMPTE240M:
1042 		return 4;
1043 	case V4L2_COLORSPACE_SRGB:
1044 		return 7;
1045 	default:
1046 		/* UNKNOWN */
1047 		return 0;
1048 	}
1049 }
1050 
1051 static u8 v4l2_profile_to_mcu_profile(enum v4l2_mpeg_video_h264_profile profile)
1052 {
1053 	switch (profile) {
1054 	case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
1055 	default:
1056 		return 66;
1057 	}
1058 }
1059 
1060 static u16 v4l2_level_to_mcu_level(enum v4l2_mpeg_video_h264_level level)
1061 {
1062 	switch (level) {
1063 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
1064 		return 10;
1065 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
1066 		return 11;
1067 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
1068 		return 12;
1069 	case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
1070 		return 13;
1071 	case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
1072 		return 20;
1073 	case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
1074 		return 21;
1075 	case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
1076 		return 22;
1077 	case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
1078 		return 30;
1079 	case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
1080 		return 31;
1081 	case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
1082 		return 32;
1083 	case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
1084 		return 40;
1085 	case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
1086 		return 41;
1087 	case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
1088 		return 42;
1089 	case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
1090 		return 50;
1091 	case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
1092 	default:
1093 		return 51;
1094 	}
1095 }
1096 
1097 static u8 hevc_profile_to_mcu_profile(enum v4l2_mpeg_video_hevc_profile profile)
1098 {
1099 	switch (profile) {
1100 	default:
1101 	case V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN:
1102 		return 1;
1103 	case V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10:
1104 		return 2;
1105 	case V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE:
1106 		return 3;
1107 	}
1108 }
1109 
1110 static u16 hevc_level_to_mcu_level(enum v4l2_mpeg_video_hevc_level level)
1111 {
1112 	switch (level) {
1113 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_1:
1114 		return 10;
1115 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_2:
1116 		return 20;
1117 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1:
1118 		return 21;
1119 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_3:
1120 		return 30;
1121 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1:
1122 		return 31;
1123 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_4:
1124 		return 40;
1125 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1:
1126 		return 41;
1127 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_5:
1128 		return 50;
1129 	default:
1130 	case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1:
1131 		return 51;
1132 	}
1133 }
1134 
1135 static u8 hevc_tier_to_mcu_tier(enum v4l2_mpeg_video_hevc_tier tier)
1136 {
1137 	switch (tier) {
1138 	default:
1139 	case V4L2_MPEG_VIDEO_HEVC_TIER_MAIN:
1140 		return 0;
1141 	case V4L2_MPEG_VIDEO_HEVC_TIER_HIGH:
1142 		return 1;
1143 	}
1144 }
1145 
1146 static u32
1147 v4l2_bitrate_mode_to_mcu_mode(enum v4l2_mpeg_video_bitrate_mode mode)
1148 {
1149 	switch (mode) {
1150 	case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR:
1151 		return 2;
1152 	case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR:
1153 	default:
1154 		return 1;
1155 	}
1156 }
1157 
1158 static u32 v4l2_cpb_size_to_mcu(unsigned int cpb_size, unsigned int bitrate)
1159 {
1160 	unsigned int cpb_size_kbit;
1161 	unsigned int bitrate_kbps;
1162 
1163 	/*
1164 	 * The mcu expects the CPB size in units of a 90 kHz clock, but the
1165 	 * channel follows the V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE and stores
1166 	 * the CPB size in kilobytes.
1167 	 */
1168 	cpb_size_kbit = cpb_size * BITS_PER_BYTE;
1169 	bitrate_kbps = bitrate / 1000;
1170 
1171 	return (cpb_size_kbit * 90000) / bitrate_kbps;
1172 }
1173 
1174 static s16 get_qp_delta(int minuend, int subtrahend)
1175 {
1176 	if (minuend == subtrahend)
1177 		return -1;
1178 	else
1179 		return minuend - subtrahend;
1180 }
1181 
1182 static u32 allegro_channel_get_entropy_mode(struct allegro_channel *channel)
1183 {
1184 #define ALLEGRO_ENTROPY_MODE_CAVLC 0
1185 #define ALLEGRO_ENTROPY_MODE_CABAC 1
1186 
1187 	/* HEVC always uses CABAC, but this has to be explicitly set */
1188 	if (channel->codec == V4L2_PIX_FMT_HEVC)
1189 		return ALLEGRO_ENTROPY_MODE_CABAC;
1190 
1191 	return ALLEGRO_ENTROPY_MODE_CAVLC;
1192 }
1193 
1194 static int fill_create_channel_param(struct allegro_channel *channel,
1195 				     struct create_channel_param *param)
1196 {
1197 	int i_frame_qp = allegro_channel_get_i_frame_qp(channel);
1198 	int p_frame_qp = allegro_channel_get_p_frame_qp(channel);
1199 	int b_frame_qp = allegro_channel_get_b_frame_qp(channel);
1200 	int bitrate_mode = v4l2_ctrl_g_ctrl(channel->mpeg_video_bitrate_mode);
1201 	unsigned int cpb_size = v4l2_ctrl_g_ctrl(channel->mpeg_video_cpb_size);
1202 
1203 	param->width = channel->width;
1204 	param->height = channel->height;
1205 	param->format = v4l2_pixelformat_to_mcu_format(channel->pixelformat);
1206 	param->colorspace =
1207 		v4l2_colorspace_to_mcu_colorspace(channel->colorspace);
1208 	param->src_mode = 0x0;
1209 
1210 	param->codec = channel->codec;
1211 	if (channel->codec == V4L2_PIX_FMT_H264) {
1212 		enum v4l2_mpeg_video_h264_profile profile;
1213 		enum v4l2_mpeg_video_h264_level level;
1214 
1215 		profile = v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_profile);
1216 		level = v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_level);
1217 
1218 		param->profile = v4l2_profile_to_mcu_profile(profile);
1219 		param->constraint_set_flags = BIT(1);
1220 		param->level = v4l2_level_to_mcu_level(level);
1221 	} else {
1222 		enum v4l2_mpeg_video_hevc_profile profile;
1223 		enum v4l2_mpeg_video_hevc_level level;
1224 		enum v4l2_mpeg_video_hevc_tier tier;
1225 
1226 		profile = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_profile);
1227 		level = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_level);
1228 		tier = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_tier);
1229 
1230 		param->profile = hevc_profile_to_mcu_profile(profile);
1231 		param->level = hevc_level_to_mcu_level(level);
1232 		param->tier = hevc_tier_to_mcu_tier(tier);
1233 	}
1234 
1235 	param->log2_max_poc = LOG2_MAX_PIC_ORDER_CNT;
1236 	param->log2_max_frame_num = channel->log2_max_frame_num;
1237 	param->temporal_mvp_enable = channel->temporal_mvp_enable;
1238 
1239 	param->dbf_ovr_en = channel->dbf_ovr_en;
1240 	param->override_lf = channel->enable_deblocking_filter_override;
1241 	param->enable_reordering = channel->enable_reordering;
1242 	param->entropy_mode = allegro_channel_get_entropy_mode(channel);
1243 	param->rdo_cost_mode = 1;
1244 	param->custom_lda = 1;
1245 	param->lf = 1;
1246 	param->lf_x_tile = channel->enable_loop_filter_across_tiles;
1247 	param->lf_x_slice = channel->enable_loop_filter_across_slices;
1248 
1249 	param->src_bit_depth = 8;
1250 
1251 	param->beta_offset = BETA_OFFSET_DIV_2;
1252 	param->tc_offset = TC_OFFSET_DIV_2;
1253 	param->num_slices = 1;
1254 	param->me_range[0] = channel->b_hrz_me_range;
1255 	param->me_range[1] = channel->b_vrt_me_range;
1256 	param->me_range[2] = channel->p_hrz_me_range;
1257 	param->me_range[3] = channel->p_vrt_me_range;
1258 	param->max_cu_size = channel->max_cu_size;
1259 	param->min_cu_size = channel->min_cu_size;
1260 	param->max_tu_size = channel->max_tu_size;
1261 	param->min_tu_size = channel->min_tu_size;
1262 	param->max_transfo_depth_intra = channel->max_transfo_depth_intra;
1263 	param->max_transfo_depth_inter = channel->max_transfo_depth_inter;
1264 
1265 	param->encoder_buffer_enabled = v4l2_ctrl_g_ctrl(channel->encoder_buffer);
1266 	param->encoder_buffer_offset = 0;
1267 
1268 	param->rate_control_mode = channel->frame_rc_enable ?
1269 		v4l2_bitrate_mode_to_mcu_mode(bitrate_mode) : 0;
1270 
1271 	param->cpb_size = v4l2_cpb_size_to_mcu(cpb_size, channel->bitrate_peak);
1272 	/* Shall be ]0;cpb_size in 90 kHz units]. Use maximum value. */
1273 	param->initial_rem_delay = param->cpb_size;
1274 	param->framerate = DIV_ROUND_UP(channel->framerate.numerator,
1275 					channel->framerate.denominator);
1276 	param->clk_ratio = channel->framerate.denominator == 1001 ? 1001 : 1000;
1277 	param->target_bitrate = channel->bitrate;
1278 	param->max_bitrate = channel->bitrate_peak;
1279 	param->initial_qp = i_frame_qp;
1280 	param->min_qp = allegro_channel_get_min_qp(channel);
1281 	param->max_qp = allegro_channel_get_max_qp(channel);
1282 	param->ip_delta = get_qp_delta(i_frame_qp, p_frame_qp);
1283 	param->pb_delta = get_qp_delta(p_frame_qp, b_frame_qp);
1284 	param->golden_ref = 0;
1285 	param->golden_delta = 2;
1286 	param->golden_ref_frequency = 10;
1287 	param->rate_control_option = 0x00000000;
1288 
1289 	param->num_pixel = channel->width + channel->height;
1290 	param->max_psnr = 4200;
1291 	param->max_pixel_value = 255;
1292 
1293 	param->gop_ctrl_mode = 0x00000002;
1294 	param->freq_idr = v4l2_ctrl_g_ctrl(channel->mpeg_video_gop_size);
1295 	param->freq_lt = 0;
1296 	param->gdr_mode = 0x00000000;
1297 	param->gop_length = v4l2_ctrl_g_ctrl(channel->mpeg_video_gop_size);
1298 	param->subframe_latency = 0x00000000;
1299 
1300 	param->lda_factors[0] = 51;
1301 	param->lda_factors[1] = 90;
1302 	param->lda_factors[2] = 151;
1303 	param->lda_factors[3] = 151;
1304 	param->lda_factors[4] = 151;
1305 	param->lda_factors[5] = 151;
1306 
1307 	param->max_num_merge_cand = 5;
1308 
1309 	return 0;
1310 }
1311 
1312 static int allegro_mcu_send_create_channel(struct allegro_dev *dev,
1313 					   struct allegro_channel *channel)
1314 {
1315 	struct mcu_msg_create_channel msg;
1316 	struct allegro_buffer *blob = &channel->config_blob;
1317 	struct create_channel_param param;
1318 	size_t size;
1319 
1320 	memset(&param, 0, sizeof(param));
1321 	fill_create_channel_param(channel, &param);
1322 	allegro_alloc_buffer(dev, blob, sizeof(struct create_channel_param));
1323 	param.version = dev->fw_info->mailbox_version;
1324 	size = allegro_encode_config_blob(blob->vaddr, &param);
1325 
1326 	memset(&msg, 0, sizeof(msg));
1327 
1328 	msg.header.type = MCU_MSG_TYPE_CREATE_CHANNEL;
1329 	msg.header.version = dev->fw_info->mailbox_version;
1330 
1331 	msg.user_id = channel->user_id;
1332 
1333 	msg.blob = blob->vaddr;
1334 	msg.blob_size = size;
1335 	msg.blob_mcu_addr = to_mcu_addr(dev, blob->paddr);
1336 
1337 	allegro_mbox_send(dev->mbox_command, &msg);
1338 
1339 	return 0;
1340 }
1341 
1342 static int allegro_mcu_send_destroy_channel(struct allegro_dev *dev,
1343 					    struct allegro_channel *channel)
1344 {
1345 	struct mcu_msg_destroy_channel msg;
1346 
1347 	memset(&msg, 0, sizeof(msg));
1348 
1349 	msg.header.type = MCU_MSG_TYPE_DESTROY_CHANNEL;
1350 	msg.header.version = dev->fw_info->mailbox_version;
1351 
1352 	msg.channel_id = channel->mcu_channel_id;
1353 
1354 	allegro_mbox_send(dev->mbox_command, &msg);
1355 
1356 	return 0;
1357 }
1358 
1359 static int allegro_mcu_send_put_stream_buffer(struct allegro_dev *dev,
1360 					      struct allegro_channel *channel,
1361 					      dma_addr_t paddr,
1362 					      unsigned long size,
1363 					      u64 dst_handle)
1364 {
1365 	struct mcu_msg_put_stream_buffer msg;
1366 
1367 	memset(&msg, 0, sizeof(msg));
1368 
1369 	msg.header.type = MCU_MSG_TYPE_PUT_STREAM_BUFFER;
1370 	msg.header.version = dev->fw_info->mailbox_version;
1371 
1372 	msg.channel_id = channel->mcu_channel_id;
1373 	msg.dma_addr = to_codec_addr(dev, paddr);
1374 	msg.mcu_addr = to_mcu_addr(dev, paddr);
1375 	msg.size = size;
1376 	msg.offset = ENCODER_STREAM_OFFSET;
1377 	/* copied to mcu_msg_encode_frame_response */
1378 	msg.dst_handle = dst_handle;
1379 
1380 	allegro_mbox_send(dev->mbox_command, &msg);
1381 
1382 	return 0;
1383 }
1384 
1385 static int allegro_mcu_send_encode_frame(struct allegro_dev *dev,
1386 					 struct allegro_channel *channel,
1387 					 dma_addr_t src_y, dma_addr_t src_uv,
1388 					 u64 src_handle)
1389 {
1390 	struct mcu_msg_encode_frame msg;
1391 	bool use_encoder_buffer = v4l2_ctrl_g_ctrl(channel->encoder_buffer);
1392 
1393 	memset(&msg, 0, sizeof(msg));
1394 
1395 	msg.header.type = MCU_MSG_TYPE_ENCODE_FRAME;
1396 	msg.header.version = dev->fw_info->mailbox_version;
1397 
1398 	msg.channel_id = channel->mcu_channel_id;
1399 	msg.encoding_options = AL_OPT_FORCE_LOAD;
1400 	if (use_encoder_buffer)
1401 		msg.encoding_options |= AL_OPT_USE_L2;
1402 	msg.pps_qp = 26; /* qp are relative to 26 */
1403 	msg.user_param = 0; /* copied to mcu_msg_encode_frame_response */
1404 	/* src_handle is copied to mcu_msg_encode_frame_response */
1405 	msg.src_handle = src_handle;
1406 	msg.src_y = to_codec_addr(dev, src_y);
1407 	msg.src_uv = to_codec_addr(dev, src_uv);
1408 	msg.stride = channel->stride;
1409 
1410 	allegro_mbox_send(dev->mbox_command, &msg);
1411 
1412 	return 0;
1413 }
1414 
1415 static int allegro_mcu_wait_for_init_timeout(struct allegro_dev *dev,
1416 					     unsigned long timeout_ms)
1417 {
1418 	unsigned long time_left;
1419 
1420 	time_left = wait_for_completion_timeout(&dev->init_complete,
1421 						msecs_to_jiffies(timeout_ms));
1422 	if (time_left == 0)
1423 		return -ETIMEDOUT;
1424 
1425 	reinit_completion(&dev->init_complete);
1426 	return 0;
1427 }
1428 
1429 static int allegro_mcu_push_buffer_internal(struct allegro_channel *channel,
1430 					    enum mcu_msg_type type)
1431 {
1432 	struct allegro_dev *dev = channel->dev;
1433 	struct mcu_msg_push_buffers_internal *msg;
1434 	struct mcu_msg_push_buffers_internal_buffer *buffer;
1435 	unsigned int num_buffers = 0;
1436 	size_t size;
1437 	struct allegro_buffer *al_buffer;
1438 	struct list_head *list;
1439 	int err;
1440 
1441 	switch (type) {
1442 	case MCU_MSG_TYPE_PUSH_BUFFER_REFERENCE:
1443 		list = &channel->buffers_reference;
1444 		break;
1445 	case MCU_MSG_TYPE_PUSH_BUFFER_INTERMEDIATE:
1446 		list = &channel->buffers_intermediate;
1447 		break;
1448 	default:
1449 		return -EINVAL;
1450 	}
1451 
1452 	list_for_each_entry(al_buffer, list, head)
1453 		num_buffers++;
1454 	size = struct_size(msg, buffer, num_buffers);
1455 
1456 	msg = kmalloc(size, GFP_KERNEL);
1457 	if (!msg)
1458 		return -ENOMEM;
1459 
1460 	msg->header.type = type;
1461 	msg->header.version = dev->fw_info->mailbox_version;
1462 
1463 	msg->channel_id = channel->mcu_channel_id;
1464 	msg->num_buffers = num_buffers;
1465 
1466 	buffer = msg->buffer;
1467 	list_for_each_entry(al_buffer, list, head) {
1468 		buffer->dma_addr = to_codec_addr(dev, al_buffer->paddr);
1469 		buffer->mcu_addr = to_mcu_addr(dev, al_buffer->paddr);
1470 		buffer->size = to_mcu_size(dev, al_buffer->size);
1471 		buffer++;
1472 	}
1473 
1474 	err = allegro_mbox_send(dev->mbox_command, msg);
1475 
1476 	kfree(msg);
1477 	return err;
1478 }
1479 
1480 static int allegro_mcu_push_buffer_intermediate(struct allegro_channel *channel)
1481 {
1482 	enum mcu_msg_type type = MCU_MSG_TYPE_PUSH_BUFFER_INTERMEDIATE;
1483 
1484 	return allegro_mcu_push_buffer_internal(channel, type);
1485 }
1486 
1487 static int allegro_mcu_push_buffer_reference(struct allegro_channel *channel)
1488 {
1489 	enum mcu_msg_type type = MCU_MSG_TYPE_PUSH_BUFFER_REFERENCE;
1490 
1491 	return allegro_mcu_push_buffer_internal(channel, type);
1492 }
1493 
1494 static int allocate_buffers_internal(struct allegro_channel *channel,
1495 				     struct list_head *list,
1496 				     size_t n, size_t size)
1497 {
1498 	struct allegro_dev *dev = channel->dev;
1499 	unsigned int i;
1500 	int err;
1501 	struct allegro_buffer *buffer, *tmp;
1502 
1503 	for (i = 0; i < n; i++) {
1504 		buffer = kmalloc(sizeof(*buffer), GFP_KERNEL);
1505 		if (!buffer) {
1506 			err = -ENOMEM;
1507 			goto err;
1508 		}
1509 		INIT_LIST_HEAD(&buffer->head);
1510 
1511 		err = allegro_alloc_buffer(dev, buffer, size);
1512 		if (err)
1513 			goto err;
1514 		list_add(&buffer->head, list);
1515 	}
1516 
1517 	return 0;
1518 
1519 err:
1520 	list_for_each_entry_safe(buffer, tmp, list, head) {
1521 		list_del(&buffer->head);
1522 		allegro_free_buffer(dev, buffer);
1523 		kfree(buffer);
1524 	}
1525 	return err;
1526 }
1527 
1528 static void destroy_buffers_internal(struct allegro_channel *channel,
1529 				     struct list_head *list)
1530 {
1531 	struct allegro_dev *dev = channel->dev;
1532 	struct allegro_buffer *buffer, *tmp;
1533 
1534 	list_for_each_entry_safe(buffer, tmp, list, head) {
1535 		list_del(&buffer->head);
1536 		allegro_free_buffer(dev, buffer);
1537 		kfree(buffer);
1538 	}
1539 }
1540 
1541 static void destroy_reference_buffers(struct allegro_channel *channel)
1542 {
1543 	return destroy_buffers_internal(channel, &channel->buffers_reference);
1544 }
1545 
1546 static void destroy_intermediate_buffers(struct allegro_channel *channel)
1547 {
1548 	return destroy_buffers_internal(channel,
1549 					&channel->buffers_intermediate);
1550 }
1551 
1552 static int allocate_intermediate_buffers(struct allegro_channel *channel,
1553 					 size_t n, size_t size)
1554 {
1555 	return allocate_buffers_internal(channel,
1556 					 &channel->buffers_intermediate,
1557 					 n, size);
1558 }
1559 
1560 static int allocate_reference_buffers(struct allegro_channel *channel,
1561 				      size_t n, size_t size)
1562 {
1563 	return allocate_buffers_internal(channel,
1564 					 &channel->buffers_reference,
1565 					 n, PAGE_ALIGN(size));
1566 }
1567 
1568 static ssize_t allegro_h264_write_sps(struct allegro_channel *channel,
1569 				      void *dest, size_t n)
1570 {
1571 	struct allegro_dev *dev = channel->dev;
1572 	struct nal_h264_sps *sps;
1573 	ssize_t size;
1574 	unsigned int size_mb = SIZE_MACROBLOCK;
1575 	/* Calculation of crop units in Rec. ITU-T H.264 (04/2017) p. 76 */
1576 	unsigned int crop_unit_x = 2;
1577 	unsigned int crop_unit_y = 2;
1578 	enum v4l2_mpeg_video_h264_profile profile;
1579 	enum v4l2_mpeg_video_h264_level level;
1580 	unsigned int cpb_size;
1581 	unsigned int cpb_size_scale;
1582 
1583 	sps = kzalloc(sizeof(*sps), GFP_KERNEL);
1584 	if (!sps)
1585 		return -ENOMEM;
1586 
1587 	profile = v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_profile);
1588 	level = v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_level);
1589 
1590 	sps->profile_idc = nal_h264_profile(profile);
1591 	sps->constraint_set0_flag = 0;
1592 	sps->constraint_set1_flag = 1;
1593 	sps->constraint_set2_flag = 0;
1594 	sps->constraint_set3_flag = 0;
1595 	sps->constraint_set4_flag = 0;
1596 	sps->constraint_set5_flag = 0;
1597 	sps->level_idc = nal_h264_level(level);
1598 	sps->seq_parameter_set_id = 0;
1599 	sps->log2_max_frame_num_minus4 = LOG2_MAX_FRAME_NUM - 4;
1600 	sps->pic_order_cnt_type = 0;
1601 	sps->log2_max_pic_order_cnt_lsb_minus4 = LOG2_MAX_PIC_ORDER_CNT - 4;
1602 	sps->max_num_ref_frames = 3;
1603 	sps->gaps_in_frame_num_value_allowed_flag = 0;
1604 	sps->pic_width_in_mbs_minus1 =
1605 		DIV_ROUND_UP(channel->width, size_mb) - 1;
1606 	sps->pic_height_in_map_units_minus1 =
1607 		DIV_ROUND_UP(channel->height, size_mb) - 1;
1608 	sps->frame_mbs_only_flag = 1;
1609 	sps->mb_adaptive_frame_field_flag = 0;
1610 	sps->direct_8x8_inference_flag = 1;
1611 	sps->frame_cropping_flag =
1612 		(channel->width % size_mb) || (channel->height % size_mb);
1613 	if (sps->frame_cropping_flag) {
1614 		sps->crop_left = 0;
1615 		sps->crop_right = (round_up(channel->width, size_mb) - channel->width) / crop_unit_x;
1616 		sps->crop_top = 0;
1617 		sps->crop_bottom = (round_up(channel->height, size_mb) - channel->height) / crop_unit_y;
1618 	}
1619 	sps->vui_parameters_present_flag = 1;
1620 	sps->vui.aspect_ratio_info_present_flag = 0;
1621 	sps->vui.overscan_info_present_flag = 0;
1622 
1623 	sps->vui.video_signal_type_present_flag = 1;
1624 	sps->vui.video_format = 5; /* unspecified */
1625 	sps->vui.video_full_range_flag = nal_h264_full_range(channel->quantization);
1626 	sps->vui.colour_description_present_flag = 1;
1627 	sps->vui.colour_primaries = nal_h264_color_primaries(channel->colorspace);
1628 	sps->vui.transfer_characteristics =
1629 		nal_h264_transfer_characteristics(channel->colorspace, channel->xfer_func);
1630 	sps->vui.matrix_coefficients =
1631 		nal_h264_matrix_coeffs(channel->colorspace, channel->ycbcr_enc);
1632 
1633 	sps->vui.chroma_loc_info_present_flag = 1;
1634 	sps->vui.chroma_sample_loc_type_top_field = 0;
1635 	sps->vui.chroma_sample_loc_type_bottom_field = 0;
1636 
1637 	sps->vui.timing_info_present_flag = 1;
1638 	sps->vui.num_units_in_tick = channel->framerate.denominator;
1639 	sps->vui.time_scale = 2 * channel->framerate.numerator;
1640 
1641 	sps->vui.fixed_frame_rate_flag = 1;
1642 	sps->vui.nal_hrd_parameters_present_flag = 0;
1643 	sps->vui.vcl_hrd_parameters_present_flag = 1;
1644 	sps->vui.vcl_hrd_parameters.cpb_cnt_minus1 = 0;
1645 	/* See Rec. ITU-T H.264 (04/2017) p. 410 E-53 */
1646 	sps->vui.vcl_hrd_parameters.bit_rate_scale =
1647 		ffs(channel->bitrate_peak) - 6;
1648 	sps->vui.vcl_hrd_parameters.bit_rate_value_minus1[0] =
1649 		channel->bitrate_peak / (1 << (6 + sps->vui.vcl_hrd_parameters.bit_rate_scale)) - 1;
1650 	/* See Rec. ITU-T H.264 (04/2017) p. 410 E-54 */
1651 	cpb_size = v4l2_ctrl_g_ctrl(channel->mpeg_video_cpb_size);
1652 	cpb_size_scale = ffs(cpb_size) - 4;
1653 	sps->vui.vcl_hrd_parameters.cpb_size_scale = cpb_size_scale;
1654 	sps->vui.vcl_hrd_parameters.cpb_size_value_minus1[0] =
1655 		(cpb_size * 1000) / (1 << (4 + cpb_size_scale)) - 1;
1656 	sps->vui.vcl_hrd_parameters.cbr_flag[0] =
1657 		!v4l2_ctrl_g_ctrl(channel->mpeg_video_frame_rc_enable);
1658 	sps->vui.vcl_hrd_parameters.initial_cpb_removal_delay_length_minus1 = 31;
1659 	sps->vui.vcl_hrd_parameters.cpb_removal_delay_length_minus1 = 31;
1660 	sps->vui.vcl_hrd_parameters.dpb_output_delay_length_minus1 = 31;
1661 	sps->vui.vcl_hrd_parameters.time_offset_length = 0;
1662 	sps->vui.low_delay_hrd_flag = 0;
1663 	sps->vui.pic_struct_present_flag = 1;
1664 	sps->vui.bitstream_restriction_flag = 0;
1665 
1666 	size = nal_h264_write_sps(&dev->plat_dev->dev, dest, n, sps);
1667 
1668 	kfree(sps);
1669 
1670 	return size;
1671 }
1672 
1673 static ssize_t allegro_h264_write_pps(struct allegro_channel *channel,
1674 				      void *dest, size_t n)
1675 {
1676 	struct allegro_dev *dev = channel->dev;
1677 	struct nal_h264_pps *pps;
1678 	ssize_t size;
1679 
1680 	pps = kzalloc(sizeof(*pps), GFP_KERNEL);
1681 	if (!pps)
1682 		return -ENOMEM;
1683 
1684 	pps->pic_parameter_set_id = 0;
1685 	pps->seq_parameter_set_id = 0;
1686 	pps->entropy_coding_mode_flag = 0;
1687 	pps->bottom_field_pic_order_in_frame_present_flag = 0;
1688 	pps->num_slice_groups_minus1 = 0;
1689 	pps->num_ref_idx_l0_default_active_minus1 = channel->num_ref_idx_l0 - 1;
1690 	pps->num_ref_idx_l1_default_active_minus1 = channel->num_ref_idx_l1 - 1;
1691 	pps->weighted_pred_flag = 0;
1692 	pps->weighted_bipred_idc = 0;
1693 	pps->pic_init_qp_minus26 = 0;
1694 	pps->pic_init_qs_minus26 = 0;
1695 	pps->chroma_qp_index_offset = 0;
1696 	pps->deblocking_filter_control_present_flag = 1;
1697 	pps->constrained_intra_pred_flag = 0;
1698 	pps->redundant_pic_cnt_present_flag = 0;
1699 	pps->transform_8x8_mode_flag = 0;
1700 	pps->pic_scaling_matrix_present_flag = 0;
1701 	pps->second_chroma_qp_index_offset = 0;
1702 
1703 	size = nal_h264_write_pps(&dev->plat_dev->dev, dest, n, pps);
1704 
1705 	kfree(pps);
1706 
1707 	return size;
1708 }
1709 
1710 static void allegro_channel_eos_event(struct allegro_channel *channel)
1711 {
1712 	const struct v4l2_event eos_event = {
1713 		.type = V4L2_EVENT_EOS
1714 	};
1715 
1716 	v4l2_event_queue_fh(&channel->fh, &eos_event);
1717 }
1718 
1719 static ssize_t allegro_hevc_write_vps(struct allegro_channel *channel,
1720 				      void *dest, size_t n)
1721 {
1722 	struct allegro_dev *dev = channel->dev;
1723 	struct nal_hevc_vps *vps;
1724 	struct nal_hevc_profile_tier_level *ptl;
1725 	ssize_t size;
1726 	unsigned int num_ref_frames = channel->num_ref_idx_l0;
1727 	s32 profile = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_profile);
1728 	s32 level = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_level);
1729 	s32 tier = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_tier);
1730 
1731 	vps = kzalloc(sizeof(*vps), GFP_KERNEL);
1732 	if (!vps)
1733 		return -ENOMEM;
1734 
1735 	vps->base_layer_internal_flag = 1;
1736 	vps->base_layer_available_flag = 1;
1737 	vps->temporal_id_nesting_flag = 1;
1738 
1739 	ptl = &vps->profile_tier_level;
1740 	ptl->general_profile_idc = nal_hevc_profile(profile);
1741 	ptl->general_profile_compatibility_flag[ptl->general_profile_idc] = 1;
1742 	ptl->general_tier_flag = nal_hevc_tier(tier);
1743 	ptl->general_progressive_source_flag = 1;
1744 	ptl->general_frame_only_constraint_flag = 1;
1745 	ptl->general_level_idc = nal_hevc_level(level);
1746 
1747 	vps->sub_layer_ordering_info_present_flag = 0;
1748 	vps->max_dec_pic_buffering_minus1[0] = num_ref_frames;
1749 	vps->max_num_reorder_pics[0] = num_ref_frames;
1750 
1751 	size = nal_hevc_write_vps(&dev->plat_dev->dev, dest, n, vps);
1752 
1753 	kfree(vps);
1754 
1755 	return size;
1756 }
1757 
1758 static ssize_t allegro_hevc_write_sps(struct allegro_channel *channel,
1759 				      void *dest, size_t n)
1760 {
1761 	struct allegro_dev *dev = channel->dev;
1762 	struct nal_hevc_sps *sps;
1763 	struct nal_hevc_profile_tier_level *ptl;
1764 	struct nal_hevc_vui_parameters *vui;
1765 	struct nal_hevc_hrd_parameters *hrd;
1766 	ssize_t size;
1767 	unsigned int cpb_size;
1768 	unsigned int num_ref_frames = channel->num_ref_idx_l0;
1769 	s32 profile = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_profile);
1770 	s32 level = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_level);
1771 	s32 tier = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_tier);
1772 
1773 	sps = kzalloc(sizeof(*sps), GFP_KERNEL);
1774 	if (!sps)
1775 		return -ENOMEM;
1776 
1777 	sps->temporal_id_nesting_flag = 1;
1778 
1779 	ptl = &sps->profile_tier_level;
1780 	ptl->general_profile_idc = nal_hevc_profile(profile);
1781 	ptl->general_profile_compatibility_flag[ptl->general_profile_idc] = 1;
1782 	ptl->general_tier_flag = nal_hevc_tier(tier);
1783 	ptl->general_progressive_source_flag = 1;
1784 	ptl->general_frame_only_constraint_flag = 1;
1785 	ptl->general_level_idc = nal_hevc_level(level);
1786 
1787 	sps->seq_parameter_set_id = 0;
1788 	sps->chroma_format_idc = 1; /* Only 4:2:0 sampling supported */
1789 	sps->pic_width_in_luma_samples = round_up(channel->width, 8);
1790 	sps->pic_height_in_luma_samples = round_up(channel->height, 8);
1791 	sps->conf_win_right_offset =
1792 		sps->pic_width_in_luma_samples - channel->width;
1793 	sps->conf_win_bottom_offset =
1794 		sps->pic_height_in_luma_samples - channel->height;
1795 	sps->conformance_window_flag =
1796 		sps->conf_win_right_offset || sps->conf_win_bottom_offset;
1797 
1798 	sps->log2_max_pic_order_cnt_lsb_minus4 = LOG2_MAX_PIC_ORDER_CNT - 4;
1799 
1800 	sps->sub_layer_ordering_info_present_flag = 1;
1801 	sps->max_dec_pic_buffering_minus1[0] = num_ref_frames;
1802 	sps->max_num_reorder_pics[0] = num_ref_frames;
1803 
1804 	sps->log2_min_luma_coding_block_size_minus3 =
1805 		channel->min_cu_size - 3;
1806 	sps->log2_diff_max_min_luma_coding_block_size =
1807 		channel->max_cu_size - channel->min_cu_size;
1808 	sps->log2_min_luma_transform_block_size_minus2 =
1809 		channel->min_tu_size - 2;
1810 	sps->log2_diff_max_min_luma_transform_block_size =
1811 		channel->max_tu_size - channel->min_tu_size;
1812 	sps->max_transform_hierarchy_depth_intra =
1813 		channel->max_transfo_depth_intra;
1814 	sps->max_transform_hierarchy_depth_inter =
1815 		channel->max_transfo_depth_inter;
1816 
1817 	sps->sps_temporal_mvp_enabled_flag = channel->temporal_mvp_enable;
1818 	sps->strong_intra_smoothing_enabled_flag = channel->max_cu_size > 4;
1819 
1820 	sps->vui_parameters_present_flag = 1;
1821 	vui = &sps->vui;
1822 
1823 	vui->video_signal_type_present_flag = 1;
1824 	vui->video_format = 5; /* unspecified */
1825 	vui->video_full_range_flag = nal_hevc_full_range(channel->quantization);
1826 	vui->colour_description_present_flag = 1;
1827 	vui->colour_primaries = nal_hevc_color_primaries(channel->colorspace);
1828 	vui->transfer_characteristics = nal_hevc_transfer_characteristics(channel->colorspace,
1829 									  channel->xfer_func);
1830 	vui->matrix_coeffs = nal_hevc_matrix_coeffs(channel->colorspace, channel->ycbcr_enc);
1831 
1832 	vui->chroma_loc_info_present_flag = 1;
1833 	vui->chroma_sample_loc_type_top_field = 0;
1834 	vui->chroma_sample_loc_type_bottom_field = 0;
1835 
1836 	vui->vui_timing_info_present_flag = 1;
1837 	vui->vui_num_units_in_tick = channel->framerate.denominator;
1838 	vui->vui_time_scale = channel->framerate.numerator;
1839 
1840 	vui->bitstream_restriction_flag = 1;
1841 	vui->motion_vectors_over_pic_boundaries_flag = 1;
1842 	vui->restricted_ref_pic_lists_flag = 1;
1843 	vui->log2_max_mv_length_horizontal = 15;
1844 	vui->log2_max_mv_length_vertical = 15;
1845 
1846 	vui->vui_hrd_parameters_present_flag = 1;
1847 	hrd = &vui->nal_hrd_parameters;
1848 	hrd->vcl_hrd_parameters_present_flag = 1;
1849 
1850 	hrd->initial_cpb_removal_delay_length_minus1 = 31;
1851 	hrd->au_cpb_removal_delay_length_minus1 = 30;
1852 	hrd->dpb_output_delay_length_minus1 = 30;
1853 
1854 	hrd->bit_rate_scale = ffs(channel->bitrate_peak) - 6;
1855 	hrd->vcl_hrd[0].bit_rate_value_minus1[0] =
1856 		(channel->bitrate_peak >> (6 + hrd->bit_rate_scale)) - 1;
1857 
1858 	cpb_size = v4l2_ctrl_g_ctrl(channel->mpeg_video_cpb_size) * 1000;
1859 	hrd->cpb_size_scale = ffs(cpb_size) - 4;
1860 	hrd->vcl_hrd[0].cpb_size_value_minus1[0] = (cpb_size >> (4 + hrd->cpb_size_scale)) - 1;
1861 
1862 	hrd->vcl_hrd[0].cbr_flag[0] = !v4l2_ctrl_g_ctrl(channel->mpeg_video_frame_rc_enable);
1863 
1864 	size = nal_hevc_write_sps(&dev->plat_dev->dev, dest, n, sps);
1865 
1866 	kfree(sps);
1867 
1868 	return size;
1869 }
1870 
1871 static ssize_t allegro_hevc_write_pps(struct allegro_channel *channel,
1872 				      struct mcu_msg_encode_frame_response *msg,
1873 				      void *dest, size_t n)
1874 {
1875 	struct allegro_dev *dev = channel->dev;
1876 	struct nal_hevc_pps *pps;
1877 	ssize_t size;
1878 	int i;
1879 
1880 	pps = kzalloc(sizeof(*pps), GFP_KERNEL);
1881 	if (!pps)
1882 		return -ENOMEM;
1883 
1884 	pps->pps_pic_parameter_set_id = 0;
1885 	pps->pps_seq_parameter_set_id = 0;
1886 
1887 	if (msg->num_column > 1 || msg->num_row > 1) {
1888 		pps->tiles_enabled_flag = 1;
1889 		pps->num_tile_columns_minus1 = msg->num_column - 1;
1890 		pps->num_tile_rows_minus1 = msg->num_row - 1;
1891 
1892 		for (i = 0; i < msg->num_column; i++)
1893 			pps->column_width_minus1[i] = msg->tile_width[i] - 1;
1894 
1895 		for (i = 0; i < msg->num_row; i++)
1896 			pps->row_height_minus1[i] = msg->tile_height[i] - 1;
1897 	}
1898 
1899 	pps->loop_filter_across_tiles_enabled_flag =
1900 		channel->enable_loop_filter_across_tiles;
1901 	pps->pps_loop_filter_across_slices_enabled_flag =
1902 		channel->enable_loop_filter_across_slices;
1903 	pps->deblocking_filter_control_present_flag = 1;
1904 	pps->deblocking_filter_override_enabled_flag =
1905 		channel->enable_deblocking_filter_override;
1906 	pps->pps_beta_offset_div2 = BETA_OFFSET_DIV_2;
1907 	pps->pps_tc_offset_div2 = TC_OFFSET_DIV_2;
1908 
1909 	pps->lists_modification_present_flag = channel->enable_reordering;
1910 
1911 	size = nal_hevc_write_pps(&dev->plat_dev->dev, dest, n, pps);
1912 
1913 	kfree(pps);
1914 
1915 	return size;
1916 }
1917 
1918 static u64 allegro_put_buffer(struct allegro_channel *channel,
1919 			      struct list_head *list,
1920 			      struct vb2_v4l2_buffer *buffer)
1921 {
1922 	struct v4l2_m2m_buffer *b = container_of(buffer,
1923 						 struct v4l2_m2m_buffer, vb);
1924 	struct allegro_m2m_buffer *shadow = to_allegro_m2m_buffer(b);
1925 
1926 	mutex_lock(&channel->shadow_list_lock);
1927 	list_add_tail(&shadow->head, list);
1928 	mutex_unlock(&channel->shadow_list_lock);
1929 
1930 	return ptr_to_u64(buffer);
1931 }
1932 
1933 static struct vb2_v4l2_buffer *
1934 allegro_get_buffer(struct allegro_channel *channel,
1935 		   struct list_head *list, u64 handle)
1936 {
1937 	struct allegro_m2m_buffer *shadow, *tmp;
1938 	struct vb2_v4l2_buffer *buffer = NULL;
1939 
1940 	mutex_lock(&channel->shadow_list_lock);
1941 	list_for_each_entry_safe(shadow, tmp, list, head) {
1942 		if (handle == ptr_to_u64(&shadow->buf.vb)) {
1943 			buffer = &shadow->buf.vb;
1944 			list_del_init(&shadow->head);
1945 			break;
1946 		}
1947 	}
1948 	mutex_unlock(&channel->shadow_list_lock);
1949 
1950 	return buffer;
1951 }
1952 
1953 static void allegro_channel_finish_frame(struct allegro_channel *channel,
1954 		struct mcu_msg_encode_frame_response *msg)
1955 {
1956 	struct allegro_dev *dev = channel->dev;
1957 	struct vb2_v4l2_buffer *src_buf;
1958 	struct vb2_v4l2_buffer *dst_buf;
1959 	struct {
1960 		u32 offset;
1961 		u32 size;
1962 	} *partition;
1963 	enum vb2_buffer_state state = VB2_BUF_STATE_ERROR;
1964 	char *curr;
1965 	ssize_t len;
1966 	ssize_t free;
1967 
1968 	src_buf = allegro_get_buffer(channel, &channel->source_shadow_list,
1969 				     msg->src_handle);
1970 	if (!src_buf)
1971 		v4l2_warn(&dev->v4l2_dev,
1972 			  "channel %d: invalid source buffer\n",
1973 			  channel->mcu_channel_id);
1974 
1975 	dst_buf = allegro_get_buffer(channel, &channel->stream_shadow_list,
1976 				     msg->dst_handle);
1977 	if (!dst_buf)
1978 		v4l2_warn(&dev->v4l2_dev,
1979 			  "channel %d: invalid stream buffer\n",
1980 			  channel->mcu_channel_id);
1981 
1982 	if (!src_buf || !dst_buf)
1983 		goto err;
1984 
1985 	if (v4l2_m2m_is_last_draining_src_buf(channel->fh.m2m_ctx, src_buf)) {
1986 		dst_buf->flags |= V4L2_BUF_FLAG_LAST;
1987 		allegro_channel_eos_event(channel);
1988 		v4l2_m2m_mark_stopped(channel->fh.m2m_ctx);
1989 	}
1990 
1991 	dst_buf->sequence = channel->csequence++;
1992 
1993 	if (msg->error_code & AL_ERROR) {
1994 		v4l2_err(&dev->v4l2_dev,
1995 			 "channel %d: failed to encode frame: %s (%x)\n",
1996 			 channel->mcu_channel_id,
1997 			 allegro_err_to_string(msg->error_code),
1998 			 msg->error_code);
1999 		goto err;
2000 	}
2001 
2002 	if (msg->partition_table_size != 1) {
2003 		v4l2_warn(&dev->v4l2_dev,
2004 			  "channel %d: only handling first partition table entry (%d entries)\n",
2005 			  channel->mcu_channel_id, msg->partition_table_size);
2006 	}
2007 
2008 	if (msg->partition_table_offset +
2009 	    msg->partition_table_size * sizeof(*partition) >
2010 	    vb2_plane_size(&dst_buf->vb2_buf, 0)) {
2011 		v4l2_err(&dev->v4l2_dev,
2012 			 "channel %d: partition table outside of dst_buf\n",
2013 			 channel->mcu_channel_id);
2014 		goto err;
2015 	}
2016 
2017 	partition =
2018 	    vb2_plane_vaddr(&dst_buf->vb2_buf, 0) + msg->partition_table_offset;
2019 	if (partition->offset + partition->size >
2020 	    vb2_plane_size(&dst_buf->vb2_buf, 0)) {
2021 		v4l2_err(&dev->v4l2_dev,
2022 			 "channel %d: encoded frame is outside of dst_buf (offset 0x%x, size 0x%x)\n",
2023 			 channel->mcu_channel_id, partition->offset,
2024 			 partition->size);
2025 		goto err;
2026 	}
2027 
2028 	v4l2_dbg(2, debug, &dev->v4l2_dev,
2029 		 "channel %d: encoded frame of size %d is at offset 0x%x\n",
2030 		 channel->mcu_channel_id, partition->size, partition->offset);
2031 
2032 	/*
2033 	 * The payload must include the data before the partition offset,
2034 	 * because we will put the sps and pps data there.
2035 	 */
2036 	vb2_set_plane_payload(&dst_buf->vb2_buf, 0,
2037 			      partition->offset + partition->size);
2038 
2039 	curr = vb2_plane_vaddr(&dst_buf->vb2_buf, 0);
2040 	free = partition->offset;
2041 
2042 	if (channel->codec == V4L2_PIX_FMT_HEVC && msg->is_idr) {
2043 		len = allegro_hevc_write_vps(channel, curr, free);
2044 		if (len < 0) {
2045 			v4l2_err(&dev->v4l2_dev,
2046 				 "not enough space for video parameter set: %zd left\n",
2047 				 free);
2048 			goto err;
2049 		}
2050 		curr += len;
2051 		free -= len;
2052 		v4l2_dbg(1, debug, &dev->v4l2_dev,
2053 			 "channel %d: wrote %zd byte VPS nal unit\n",
2054 			 channel->mcu_channel_id, len);
2055 	}
2056 
2057 	if (msg->is_idr) {
2058 		if (channel->codec == V4L2_PIX_FMT_H264)
2059 			len = allegro_h264_write_sps(channel, curr, free);
2060 		else
2061 			len = allegro_hevc_write_sps(channel, curr, free);
2062 		if (len < 0) {
2063 			v4l2_err(&dev->v4l2_dev,
2064 				 "not enough space for sequence parameter set: %zd left\n",
2065 				 free);
2066 			goto err;
2067 		}
2068 		curr += len;
2069 		free -= len;
2070 		v4l2_dbg(1, debug, &dev->v4l2_dev,
2071 			 "channel %d: wrote %zd byte SPS nal unit\n",
2072 			 channel->mcu_channel_id, len);
2073 	}
2074 
2075 	if (msg->slice_type == AL_ENC_SLICE_TYPE_I) {
2076 		if (channel->codec == V4L2_PIX_FMT_H264)
2077 			len = allegro_h264_write_pps(channel, curr, free);
2078 		else
2079 			len = allegro_hevc_write_pps(channel, msg, curr, free);
2080 		if (len < 0) {
2081 			v4l2_err(&dev->v4l2_dev,
2082 				 "not enough space for picture parameter set: %zd left\n",
2083 				 free);
2084 			goto err;
2085 		}
2086 		curr += len;
2087 		free -= len;
2088 		v4l2_dbg(1, debug, &dev->v4l2_dev,
2089 			 "channel %d: wrote %zd byte PPS nal unit\n",
2090 			 channel->mcu_channel_id, len);
2091 	}
2092 
2093 	if (msg->slice_type != AL_ENC_SLICE_TYPE_I && !msg->is_idr) {
2094 		dst_buf->vb2_buf.planes[0].data_offset = free;
2095 		free = 0;
2096 	} else {
2097 		if (channel->codec == V4L2_PIX_FMT_H264)
2098 			len = nal_h264_write_filler(&dev->plat_dev->dev, curr, free);
2099 		else
2100 			len = nal_hevc_write_filler(&dev->plat_dev->dev, curr, free);
2101 		if (len < 0) {
2102 			v4l2_err(&dev->v4l2_dev,
2103 				 "failed to write %zd filler data\n", free);
2104 			goto err;
2105 		}
2106 		curr += len;
2107 		free -= len;
2108 		v4l2_dbg(2, debug, &dev->v4l2_dev,
2109 			 "channel %d: wrote %zd bytes filler nal unit\n",
2110 			 channel->mcu_channel_id, len);
2111 	}
2112 
2113 	if (free != 0) {
2114 		v4l2_err(&dev->v4l2_dev,
2115 			 "non-VCL NAL units do not fill space until VCL NAL unit: %zd bytes left\n",
2116 			 free);
2117 		goto err;
2118 	}
2119 
2120 	state = VB2_BUF_STATE_DONE;
2121 
2122 	v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, false);
2123 	if (msg->is_idr)
2124 		dst_buf->flags |= V4L2_BUF_FLAG_KEYFRAME;
2125 	else
2126 		dst_buf->flags |= V4L2_BUF_FLAG_PFRAME;
2127 
2128 	v4l2_dbg(1, debug, &dev->v4l2_dev,
2129 		 "channel %d: encoded frame #%03d (%s%s, QP %d, %d bytes)\n",
2130 		 channel->mcu_channel_id,
2131 		 dst_buf->sequence,
2132 		 msg->is_idr ? "IDR, " : "",
2133 		 msg->slice_type == AL_ENC_SLICE_TYPE_I ? "I slice" :
2134 		 msg->slice_type == AL_ENC_SLICE_TYPE_P ? "P slice" : "unknown",
2135 		 msg->qp, partition->size);
2136 
2137 err:
2138 	if (src_buf)
2139 		v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
2140 
2141 	if (dst_buf)
2142 		v4l2_m2m_buf_done(dst_buf, state);
2143 }
2144 
2145 static int allegro_handle_init(struct allegro_dev *dev,
2146 			       struct mcu_msg_init_response *msg)
2147 {
2148 	complete(&dev->init_complete);
2149 
2150 	return 0;
2151 }
2152 
2153 static int
2154 allegro_handle_create_channel(struct allegro_dev *dev,
2155 			      struct mcu_msg_create_channel_response *msg)
2156 {
2157 	struct allegro_channel *channel;
2158 	int err = 0;
2159 	struct create_channel_param param;
2160 
2161 	channel = allegro_find_channel_by_user_id(dev, msg->user_id);
2162 	if (IS_ERR(channel)) {
2163 		v4l2_warn(&dev->v4l2_dev,
2164 			  "received %s for unknown user %d\n",
2165 			  msg_type_name(msg->header.type),
2166 			  msg->user_id);
2167 		return -EINVAL;
2168 	}
2169 
2170 	if (msg->error_code) {
2171 		v4l2_err(&dev->v4l2_dev,
2172 			 "user %d: mcu failed to create channel: %s (%x)\n",
2173 			 channel->user_id,
2174 			 allegro_err_to_string(msg->error_code),
2175 			 msg->error_code);
2176 		err = -EIO;
2177 		goto out;
2178 	}
2179 
2180 	channel->mcu_channel_id = msg->channel_id;
2181 	v4l2_dbg(1, debug, &dev->v4l2_dev,
2182 		 "user %d: channel has channel id %d\n",
2183 		 channel->user_id, channel->mcu_channel_id);
2184 
2185 	err = allegro_decode_config_blob(&param, msg, channel->config_blob.vaddr);
2186 	allegro_free_buffer(channel->dev, &channel->config_blob);
2187 	if (err)
2188 		goto out;
2189 
2190 	channel->num_ref_idx_l0 = param.num_ref_idx_l0;
2191 	channel->num_ref_idx_l1 = param.num_ref_idx_l1;
2192 
2193 	v4l2_dbg(1, debug, &dev->v4l2_dev,
2194 		 "channel %d: intermediate buffers: %d x %d bytes\n",
2195 		 channel->mcu_channel_id,
2196 		 msg->int_buffers_count, msg->int_buffers_size);
2197 	err = allocate_intermediate_buffers(channel, msg->int_buffers_count,
2198 					    msg->int_buffers_size);
2199 	if (err) {
2200 		v4l2_err(&dev->v4l2_dev,
2201 			 "channel %d: failed to allocate intermediate buffers\n",
2202 			 channel->mcu_channel_id);
2203 		goto out;
2204 	}
2205 	err = allegro_mcu_push_buffer_intermediate(channel);
2206 	if (err)
2207 		goto out;
2208 
2209 	v4l2_dbg(1, debug, &dev->v4l2_dev,
2210 		 "channel %d: reference buffers: %d x %d bytes\n",
2211 		 channel->mcu_channel_id,
2212 		 msg->rec_buffers_count, msg->rec_buffers_size);
2213 	err = allocate_reference_buffers(channel, msg->rec_buffers_count,
2214 					 msg->rec_buffers_size);
2215 	if (err) {
2216 		v4l2_err(&dev->v4l2_dev,
2217 			 "channel %d: failed to allocate reference buffers\n",
2218 			 channel->mcu_channel_id);
2219 		goto out;
2220 	}
2221 	err = allegro_mcu_push_buffer_reference(channel);
2222 	if (err)
2223 		goto out;
2224 
2225 out:
2226 	channel->error = err;
2227 	complete(&channel->completion);
2228 
2229 	/* Handled successfully, error is passed via channel->error */
2230 	return 0;
2231 }
2232 
2233 static int
2234 allegro_handle_destroy_channel(struct allegro_dev *dev,
2235 			       struct mcu_msg_destroy_channel_response *msg)
2236 {
2237 	struct allegro_channel *channel;
2238 
2239 	channel = allegro_find_channel_by_channel_id(dev, msg->channel_id);
2240 	if (IS_ERR(channel)) {
2241 		v4l2_err(&dev->v4l2_dev,
2242 			 "received %s for unknown channel %d\n",
2243 			 msg_type_name(msg->header.type),
2244 			 msg->channel_id);
2245 		return -EINVAL;
2246 	}
2247 
2248 	v4l2_dbg(2, debug, &dev->v4l2_dev,
2249 		 "user %d: vcu destroyed channel %d\n",
2250 		 channel->user_id, channel->mcu_channel_id);
2251 	complete(&channel->completion);
2252 
2253 	return 0;
2254 }
2255 
2256 static int
2257 allegro_handle_encode_frame(struct allegro_dev *dev,
2258 			    struct mcu_msg_encode_frame_response *msg)
2259 {
2260 	struct allegro_channel *channel;
2261 
2262 	channel = allegro_find_channel_by_channel_id(dev, msg->channel_id);
2263 	if (IS_ERR(channel)) {
2264 		v4l2_err(&dev->v4l2_dev,
2265 			 "received %s for unknown channel %d\n",
2266 			 msg_type_name(msg->header.type),
2267 			 msg->channel_id);
2268 		return -EINVAL;
2269 	}
2270 
2271 	allegro_channel_finish_frame(channel, msg);
2272 
2273 	return 0;
2274 }
2275 
2276 static void allegro_handle_message(struct allegro_dev *dev,
2277 				   union mcu_msg_response *msg)
2278 {
2279 	switch (msg->header.type) {
2280 	case MCU_MSG_TYPE_INIT:
2281 		allegro_handle_init(dev, &msg->init);
2282 		break;
2283 	case MCU_MSG_TYPE_CREATE_CHANNEL:
2284 		allegro_handle_create_channel(dev, &msg->create_channel);
2285 		break;
2286 	case MCU_MSG_TYPE_DESTROY_CHANNEL:
2287 		allegro_handle_destroy_channel(dev, &msg->destroy_channel);
2288 		break;
2289 	case MCU_MSG_TYPE_ENCODE_FRAME:
2290 		allegro_handle_encode_frame(dev, &msg->encode_frame);
2291 		break;
2292 	default:
2293 		v4l2_warn(&dev->v4l2_dev,
2294 			  "%s: unknown message %s\n",
2295 			  __func__, msg_type_name(msg->header.type));
2296 		break;
2297 	}
2298 }
2299 
2300 static irqreturn_t allegro_hardirq(int irq, void *data)
2301 {
2302 	struct allegro_dev *dev = data;
2303 	unsigned int status;
2304 
2305 	regmap_read(dev->regmap, AL5_ITC_CPU_IRQ_STA, &status);
2306 	if (!(status & AL5_ITC_CPU_IRQ_STA_TRIGGERED))
2307 		return IRQ_NONE;
2308 
2309 	regmap_write(dev->regmap, AL5_ITC_CPU_IRQ_CLR, status);
2310 
2311 	return IRQ_WAKE_THREAD;
2312 }
2313 
2314 static irqreturn_t allegro_irq_thread(int irq, void *data)
2315 {
2316 	struct allegro_dev *dev = data;
2317 
2318 	/*
2319 	 * The firmware is initialized after the mailbox is setup. We further
2320 	 * check the AL5_ITC_CPU_IRQ_STA register, if the firmware actually
2321 	 * triggered the interrupt. Although this should not happen, make sure
2322 	 * that we ignore interrupts, if the mailbox is not initialized.
2323 	 */
2324 	if (!dev->mbox_status)
2325 		return IRQ_NONE;
2326 
2327 	allegro_mbox_notify(dev->mbox_status);
2328 
2329 	return IRQ_HANDLED;
2330 }
2331 
2332 static void allegro_copy_firmware(struct allegro_dev *dev,
2333 				  const u8 * const buf, size_t size)
2334 {
2335 	int err = 0;
2336 
2337 	v4l2_dbg(1, debug, &dev->v4l2_dev,
2338 		 "copy mcu firmware (%zu B) to SRAM\n", size);
2339 	err = regmap_bulk_write(dev->sram, 0x0, buf, size / 4);
2340 	if (err)
2341 		v4l2_err(&dev->v4l2_dev,
2342 			 "failed to copy firmware: %d\n", err);
2343 }
2344 
2345 static void allegro_copy_fw_codec(struct allegro_dev *dev,
2346 				  const u8 * const buf, size_t size)
2347 {
2348 	int err;
2349 	dma_addr_t icache_offset, dcache_offset;
2350 
2351 	/*
2352 	 * The downstream allocates 600 KB for the codec firmware to have some
2353 	 * extra space for "possible extensions." My tests were fine with
2354 	 * allocating just enough memory for the actual firmware, but I am not
2355 	 * sure that the firmware really does not use the remaining space.
2356 	 */
2357 	err = allegro_alloc_buffer(dev, &dev->firmware, size);
2358 	if (err) {
2359 		v4l2_err(&dev->v4l2_dev,
2360 			 "failed to allocate %zu bytes for firmware\n", size);
2361 		return;
2362 	}
2363 
2364 	v4l2_dbg(1, debug, &dev->v4l2_dev,
2365 		 "copy codec firmware (%zd B) to phys %pad\n",
2366 		 size, &dev->firmware.paddr);
2367 	memcpy(dev->firmware.vaddr, buf, size);
2368 
2369 	regmap_write(dev->regmap, AXI_ADDR_OFFSET_IP,
2370 		     upper_32_bits(dev->firmware.paddr));
2371 
2372 	icache_offset = dev->firmware.paddr - MCU_CACHE_OFFSET;
2373 	v4l2_dbg(2, debug, &dev->v4l2_dev,
2374 		 "icache_offset: msb = 0x%x, lsb = 0x%x\n",
2375 		 upper_32_bits(icache_offset), lower_32_bits(icache_offset));
2376 	regmap_write(dev->regmap, AL5_ICACHE_ADDR_OFFSET_MSB,
2377 		     upper_32_bits(icache_offset));
2378 	regmap_write(dev->regmap, AL5_ICACHE_ADDR_OFFSET_LSB,
2379 		     lower_32_bits(icache_offset));
2380 
2381 	dcache_offset =
2382 	    (dev->firmware.paddr & 0xffffffff00000000ULL) - MCU_CACHE_OFFSET;
2383 	v4l2_dbg(2, debug, &dev->v4l2_dev,
2384 		 "dcache_offset: msb = 0x%x, lsb = 0x%x\n",
2385 		 upper_32_bits(dcache_offset), lower_32_bits(dcache_offset));
2386 	regmap_write(dev->regmap, AL5_DCACHE_ADDR_OFFSET_MSB,
2387 		     upper_32_bits(dcache_offset));
2388 	regmap_write(dev->regmap, AL5_DCACHE_ADDR_OFFSET_LSB,
2389 		     lower_32_bits(dcache_offset));
2390 }
2391 
2392 static void allegro_free_fw_codec(struct allegro_dev *dev)
2393 {
2394 	allegro_free_buffer(dev, &dev->firmware);
2395 }
2396 
2397 /*
2398  * Control functions for the MCU
2399  */
2400 
2401 static int allegro_mcu_enable_interrupts(struct allegro_dev *dev)
2402 {
2403 	return regmap_write(dev->regmap, AL5_ITC_CPU_IRQ_MSK, BIT(0));
2404 }
2405 
2406 static int allegro_mcu_disable_interrupts(struct allegro_dev *dev)
2407 {
2408 	return regmap_write(dev->regmap, AL5_ITC_CPU_IRQ_MSK, 0);
2409 }
2410 
2411 static int allegro_mcu_wait_for_sleep(struct allegro_dev *dev)
2412 {
2413 	unsigned long timeout;
2414 	unsigned int status;
2415 
2416 	timeout = jiffies + msecs_to_jiffies(100);
2417 	while (regmap_read(dev->regmap, AL5_MCU_STA, &status) == 0 &&
2418 	       status != AL5_MCU_STA_SLEEP) {
2419 		if (time_after(jiffies, timeout))
2420 			return -ETIMEDOUT;
2421 		cpu_relax();
2422 	}
2423 
2424 	return 0;
2425 }
2426 
2427 static int allegro_mcu_start(struct allegro_dev *dev)
2428 {
2429 	unsigned long timeout;
2430 	unsigned int status;
2431 	int err;
2432 
2433 	err = regmap_write(dev->regmap, AL5_MCU_WAKEUP, BIT(0));
2434 	if (err)
2435 		return err;
2436 
2437 	timeout = jiffies + msecs_to_jiffies(100);
2438 	while (regmap_read(dev->regmap, AL5_MCU_STA, &status) == 0 &&
2439 	       status == AL5_MCU_STA_SLEEP) {
2440 		if (time_after(jiffies, timeout))
2441 			return -ETIMEDOUT;
2442 		cpu_relax();
2443 	}
2444 
2445 	err = regmap_write(dev->regmap, AL5_MCU_WAKEUP, 0);
2446 	if (err)
2447 		return err;
2448 
2449 	return 0;
2450 }
2451 
2452 static int allegro_mcu_reset(struct allegro_dev *dev)
2453 {
2454 	int err;
2455 
2456 	/*
2457 	 * Ensure that the AL5_MCU_WAKEUP bit is set to 0 otherwise the mcu
2458 	 * does not go to sleep after the reset.
2459 	 */
2460 	err = regmap_write(dev->regmap, AL5_MCU_WAKEUP, 0);
2461 	if (err)
2462 		return err;
2463 
2464 	err = regmap_write(dev->regmap,
2465 			   AL5_MCU_RESET_MODE, AL5_MCU_RESET_MODE_SLEEP);
2466 	if (err < 0)
2467 		return err;
2468 
2469 	err = regmap_write(dev->regmap, AL5_MCU_RESET, AL5_MCU_RESET_SOFT);
2470 	if (err < 0)
2471 		return err;
2472 
2473 	return allegro_mcu_wait_for_sleep(dev);
2474 }
2475 
2476 static void allegro_mcu_interrupt(struct allegro_dev *dev)
2477 {
2478 	regmap_write(dev->regmap, AL5_MCU_INTERRUPT, BIT(0));
2479 }
2480 
2481 static void allegro_destroy_channel(struct allegro_channel *channel)
2482 {
2483 	struct allegro_dev *dev = channel->dev;
2484 	unsigned long time_left;
2485 
2486 	if (channel_exists(channel)) {
2487 		reinit_completion(&channel->completion);
2488 		allegro_mcu_send_destroy_channel(dev, channel);
2489 		time_left = wait_for_completion_timeout(&channel->completion,
2490 							msecs_to_jiffies(5000));
2491 		if (time_left == 0)
2492 			v4l2_warn(&dev->v4l2_dev,
2493 				  "channel %d: timeout while destroying\n",
2494 				  channel->mcu_channel_id);
2495 
2496 		channel->mcu_channel_id = -1;
2497 	}
2498 
2499 	destroy_intermediate_buffers(channel);
2500 	destroy_reference_buffers(channel);
2501 
2502 	v4l2_ctrl_grab(channel->mpeg_video_h264_profile, false);
2503 	v4l2_ctrl_grab(channel->mpeg_video_h264_level, false);
2504 	v4l2_ctrl_grab(channel->mpeg_video_h264_i_frame_qp, false);
2505 	v4l2_ctrl_grab(channel->mpeg_video_h264_max_qp, false);
2506 	v4l2_ctrl_grab(channel->mpeg_video_h264_min_qp, false);
2507 	v4l2_ctrl_grab(channel->mpeg_video_h264_p_frame_qp, false);
2508 	v4l2_ctrl_grab(channel->mpeg_video_h264_b_frame_qp, false);
2509 
2510 	v4l2_ctrl_grab(channel->mpeg_video_hevc_profile, false);
2511 	v4l2_ctrl_grab(channel->mpeg_video_hevc_level, false);
2512 	v4l2_ctrl_grab(channel->mpeg_video_hevc_tier, false);
2513 	v4l2_ctrl_grab(channel->mpeg_video_hevc_i_frame_qp, false);
2514 	v4l2_ctrl_grab(channel->mpeg_video_hevc_max_qp, false);
2515 	v4l2_ctrl_grab(channel->mpeg_video_hevc_min_qp, false);
2516 	v4l2_ctrl_grab(channel->mpeg_video_hevc_p_frame_qp, false);
2517 	v4l2_ctrl_grab(channel->mpeg_video_hevc_b_frame_qp, false);
2518 
2519 	v4l2_ctrl_grab(channel->mpeg_video_frame_rc_enable, false);
2520 	v4l2_ctrl_grab(channel->mpeg_video_bitrate_mode, false);
2521 	v4l2_ctrl_grab(channel->mpeg_video_bitrate, false);
2522 	v4l2_ctrl_grab(channel->mpeg_video_bitrate_peak, false);
2523 	v4l2_ctrl_grab(channel->mpeg_video_cpb_size, false);
2524 	v4l2_ctrl_grab(channel->mpeg_video_gop_size, false);
2525 
2526 	v4l2_ctrl_grab(channel->encoder_buffer, false);
2527 
2528 	if (channel->user_id != -1) {
2529 		clear_bit(channel->user_id, &dev->channel_user_ids);
2530 		channel->user_id = -1;
2531 	}
2532 }
2533 
2534 /*
2535  * Create the MCU channel
2536  *
2537  * After the channel has been created, the picture size, format, colorspace
2538  * and framerate are fixed. Also the codec, profile, bitrate, etc. cannot be
2539  * changed anymore.
2540  *
2541  * The channel can be created only once. The MCU will accept source buffers
2542  * and stream buffers only after a channel has been created.
2543  */
2544 static int allegro_create_channel(struct allegro_channel *channel)
2545 {
2546 	struct allegro_dev *dev = channel->dev;
2547 	unsigned long time_left;
2548 
2549 	if (channel_exists(channel)) {
2550 		v4l2_warn(&dev->v4l2_dev,
2551 			  "channel already exists\n");
2552 		return 0;
2553 	}
2554 
2555 	channel->user_id = allegro_next_user_id(dev);
2556 	if (channel->user_id < 0) {
2557 		v4l2_err(&dev->v4l2_dev,
2558 			 "no free channels available\n");
2559 		return -EBUSY;
2560 	}
2561 	set_bit(channel->user_id, &dev->channel_user_ids);
2562 
2563 	v4l2_dbg(1, debug, &dev->v4l2_dev,
2564 		 "user %d: creating channel (%4.4s, %dx%d@%d)\n",
2565 		 channel->user_id,
2566 		 (char *)&channel->codec, channel->width, channel->height,
2567 		 DIV_ROUND_UP(channel->framerate.numerator,
2568 			      channel->framerate.denominator));
2569 
2570 	v4l2_ctrl_grab(channel->mpeg_video_h264_profile, true);
2571 	v4l2_ctrl_grab(channel->mpeg_video_h264_level, true);
2572 	v4l2_ctrl_grab(channel->mpeg_video_h264_i_frame_qp, true);
2573 	v4l2_ctrl_grab(channel->mpeg_video_h264_max_qp, true);
2574 	v4l2_ctrl_grab(channel->mpeg_video_h264_min_qp, true);
2575 	v4l2_ctrl_grab(channel->mpeg_video_h264_p_frame_qp, true);
2576 	v4l2_ctrl_grab(channel->mpeg_video_h264_b_frame_qp, true);
2577 
2578 	v4l2_ctrl_grab(channel->mpeg_video_hevc_profile, true);
2579 	v4l2_ctrl_grab(channel->mpeg_video_hevc_level, true);
2580 	v4l2_ctrl_grab(channel->mpeg_video_hevc_tier, true);
2581 	v4l2_ctrl_grab(channel->mpeg_video_hevc_i_frame_qp, true);
2582 	v4l2_ctrl_grab(channel->mpeg_video_hevc_max_qp, true);
2583 	v4l2_ctrl_grab(channel->mpeg_video_hevc_min_qp, true);
2584 	v4l2_ctrl_grab(channel->mpeg_video_hevc_p_frame_qp, true);
2585 	v4l2_ctrl_grab(channel->mpeg_video_hevc_b_frame_qp, true);
2586 
2587 	v4l2_ctrl_grab(channel->mpeg_video_frame_rc_enable, true);
2588 	v4l2_ctrl_grab(channel->mpeg_video_bitrate_mode, true);
2589 	v4l2_ctrl_grab(channel->mpeg_video_bitrate, true);
2590 	v4l2_ctrl_grab(channel->mpeg_video_bitrate_peak, true);
2591 	v4l2_ctrl_grab(channel->mpeg_video_cpb_size, true);
2592 	v4l2_ctrl_grab(channel->mpeg_video_gop_size, true);
2593 
2594 	v4l2_ctrl_grab(channel->encoder_buffer, true);
2595 
2596 	reinit_completion(&channel->completion);
2597 	allegro_mcu_send_create_channel(dev, channel);
2598 	time_left = wait_for_completion_timeout(&channel->completion,
2599 						msecs_to_jiffies(5000));
2600 	if (time_left == 0)
2601 		channel->error = -ETIMEDOUT;
2602 	if (channel->error)
2603 		goto err;
2604 
2605 	v4l2_dbg(1, debug, &dev->v4l2_dev,
2606 		 "channel %d: accepting buffers\n",
2607 		 channel->mcu_channel_id);
2608 
2609 	return 0;
2610 
2611 err:
2612 	allegro_destroy_channel(channel);
2613 
2614 	return channel->error;
2615 }
2616 
2617 /**
2618  * allegro_channel_adjust() - Adjust channel parameters to current format
2619  * @channel: the channel to adjust
2620  *
2621  * Various parameters of a channel and their limits depend on the currently
2622  * set format. Adjust the parameters after a format change in one go.
2623  */
2624 static void allegro_channel_adjust(struct allegro_channel *channel)
2625 {
2626 	struct allegro_dev *dev = channel->dev;
2627 	u32 codec = channel->codec;
2628 	struct v4l2_ctrl *ctrl;
2629 	s64 min;
2630 	s64 max;
2631 
2632 	channel->sizeimage_encoded =
2633 		estimate_stream_size(channel->width, channel->height);
2634 
2635 	if (codec == V4L2_PIX_FMT_H264) {
2636 		ctrl = channel->mpeg_video_h264_level;
2637 		min = select_minimum_h264_level(channel->width, channel->height);
2638 	} else {
2639 		ctrl = channel->mpeg_video_hevc_level;
2640 		min = select_minimum_hevc_level(channel->width, channel->height);
2641 	}
2642 	if (ctrl->minimum > min)
2643 		v4l2_dbg(1, debug, &dev->v4l2_dev,
2644 			 "%s.minimum: %lld -> %lld\n",
2645 			 v4l2_ctrl_get_name(ctrl->id), ctrl->minimum, min);
2646 	v4l2_ctrl_lock(ctrl);
2647 	__v4l2_ctrl_modify_range(ctrl, min, ctrl->maximum,
2648 				 ctrl->step, ctrl->default_value);
2649 	v4l2_ctrl_unlock(ctrl);
2650 
2651 	ctrl = channel->mpeg_video_bitrate;
2652 	if (codec == V4L2_PIX_FMT_H264)
2653 		max = h264_maximum_bitrate(v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_level));
2654 	else
2655 		max = hevc_maximum_bitrate(v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_level));
2656 	if (ctrl->maximum < max)
2657 		v4l2_dbg(1, debug, &dev->v4l2_dev,
2658 			 "%s: maximum: %lld -> %lld\n",
2659 			 v4l2_ctrl_get_name(ctrl->id), ctrl->maximum, max);
2660 	v4l2_ctrl_lock(ctrl);
2661 	__v4l2_ctrl_modify_range(ctrl, ctrl->minimum, max,
2662 				 ctrl->step, ctrl->default_value);
2663 	v4l2_ctrl_unlock(ctrl);
2664 
2665 	ctrl = channel->mpeg_video_bitrate_peak;
2666 	v4l2_ctrl_lock(ctrl);
2667 	__v4l2_ctrl_modify_range(ctrl, ctrl->minimum, max,
2668 				 ctrl->step, ctrl->default_value);
2669 	v4l2_ctrl_unlock(ctrl);
2670 
2671 	v4l2_ctrl_activate(channel->mpeg_video_h264_profile,
2672 			   codec == V4L2_PIX_FMT_H264);
2673 	v4l2_ctrl_activate(channel->mpeg_video_h264_level,
2674 			   codec == V4L2_PIX_FMT_H264);
2675 	v4l2_ctrl_activate(channel->mpeg_video_h264_i_frame_qp,
2676 			   codec == V4L2_PIX_FMT_H264);
2677 	v4l2_ctrl_activate(channel->mpeg_video_h264_max_qp,
2678 			   codec == V4L2_PIX_FMT_H264);
2679 	v4l2_ctrl_activate(channel->mpeg_video_h264_min_qp,
2680 			   codec == V4L2_PIX_FMT_H264);
2681 	v4l2_ctrl_activate(channel->mpeg_video_h264_p_frame_qp,
2682 			   codec == V4L2_PIX_FMT_H264);
2683 	v4l2_ctrl_activate(channel->mpeg_video_h264_b_frame_qp,
2684 			   codec == V4L2_PIX_FMT_H264);
2685 
2686 	v4l2_ctrl_activate(channel->mpeg_video_hevc_profile,
2687 			   codec == V4L2_PIX_FMT_HEVC);
2688 	v4l2_ctrl_activate(channel->mpeg_video_hevc_level,
2689 			   codec == V4L2_PIX_FMT_HEVC);
2690 	v4l2_ctrl_activate(channel->mpeg_video_hevc_tier,
2691 			   codec == V4L2_PIX_FMT_HEVC);
2692 	v4l2_ctrl_activate(channel->mpeg_video_hevc_i_frame_qp,
2693 			   codec == V4L2_PIX_FMT_HEVC);
2694 	v4l2_ctrl_activate(channel->mpeg_video_hevc_max_qp,
2695 			   codec == V4L2_PIX_FMT_HEVC);
2696 	v4l2_ctrl_activate(channel->mpeg_video_hevc_min_qp,
2697 			   codec == V4L2_PIX_FMT_HEVC);
2698 	v4l2_ctrl_activate(channel->mpeg_video_hevc_p_frame_qp,
2699 			   codec == V4L2_PIX_FMT_HEVC);
2700 	v4l2_ctrl_activate(channel->mpeg_video_hevc_b_frame_qp,
2701 			   codec == V4L2_PIX_FMT_HEVC);
2702 
2703 	if (codec == V4L2_PIX_FMT_H264)
2704 		channel->log2_max_frame_num = LOG2_MAX_FRAME_NUM;
2705 	channel->temporal_mvp_enable = true;
2706 	channel->dbf_ovr_en = (codec == V4L2_PIX_FMT_H264);
2707 	channel->enable_deblocking_filter_override = (codec == V4L2_PIX_FMT_HEVC);
2708 	channel->enable_reordering = (codec == V4L2_PIX_FMT_HEVC);
2709 	channel->enable_loop_filter_across_tiles = true;
2710 	channel->enable_loop_filter_across_slices = true;
2711 
2712 	if (codec == V4L2_PIX_FMT_H264) {
2713 		channel->b_hrz_me_range = 8;
2714 		channel->b_vrt_me_range = 8;
2715 		channel->p_hrz_me_range = 16;
2716 		channel->p_vrt_me_range = 16;
2717 		channel->max_cu_size = ilog2(16);
2718 		channel->min_cu_size = ilog2(8);
2719 		channel->max_tu_size = ilog2(4);
2720 		channel->min_tu_size = ilog2(4);
2721 	} else {
2722 		channel->b_hrz_me_range = 16;
2723 		channel->b_vrt_me_range = 16;
2724 		channel->p_hrz_me_range = 32;
2725 		channel->p_vrt_me_range = 32;
2726 		channel->max_cu_size = ilog2(32);
2727 		channel->min_cu_size = ilog2(8);
2728 		channel->max_tu_size = ilog2(32);
2729 		channel->min_tu_size = ilog2(4);
2730 	}
2731 	channel->max_transfo_depth_intra = 1;
2732 	channel->max_transfo_depth_inter = 1;
2733 }
2734 
2735 static void allegro_set_default_params(struct allegro_channel *channel)
2736 {
2737 	channel->width = ALLEGRO_WIDTH_DEFAULT;
2738 	channel->height = ALLEGRO_HEIGHT_DEFAULT;
2739 	channel->stride = round_up(channel->width, 32);
2740 	channel->framerate = ALLEGRO_FRAMERATE_DEFAULT;
2741 
2742 	channel->colorspace = V4L2_COLORSPACE_REC709;
2743 	channel->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
2744 	channel->quantization = V4L2_QUANTIZATION_DEFAULT;
2745 	channel->xfer_func = V4L2_XFER_FUNC_DEFAULT;
2746 
2747 	channel->pixelformat = V4L2_PIX_FMT_NV12;
2748 	channel->sizeimage_raw = channel->stride * channel->height * 3 / 2;
2749 
2750 	channel->codec = V4L2_PIX_FMT_H264;
2751 }
2752 
2753 static int allegro_queue_setup(struct vb2_queue *vq,
2754 			       unsigned int *nbuffers, unsigned int *nplanes,
2755 			       unsigned int sizes[],
2756 			       struct device *alloc_devs[])
2757 {
2758 	struct allegro_channel *channel = vb2_get_drv_priv(vq);
2759 	struct allegro_dev *dev = channel->dev;
2760 
2761 	v4l2_dbg(2, debug, &dev->v4l2_dev,
2762 		 "%s: queue setup[%s]: nplanes = %d\n",
2763 		 V4L2_TYPE_IS_OUTPUT(vq->type) ? "output" : "capture",
2764 		 *nplanes == 0 ? "REQBUFS" : "CREATE_BUFS", *nplanes);
2765 
2766 	if (*nplanes != 0) {
2767 		if (V4L2_TYPE_IS_OUTPUT(vq->type)) {
2768 			if (sizes[0] < channel->sizeimage_raw)
2769 				return -EINVAL;
2770 		} else {
2771 			if (sizes[0] < channel->sizeimage_encoded)
2772 				return -EINVAL;
2773 		}
2774 	} else {
2775 		*nplanes = 1;
2776 		if (V4L2_TYPE_IS_OUTPUT(vq->type))
2777 			sizes[0] = channel->sizeimage_raw;
2778 		else
2779 			sizes[0] = channel->sizeimage_encoded;
2780 	}
2781 
2782 	return 0;
2783 }
2784 
2785 static int allegro_buf_prepare(struct vb2_buffer *vb)
2786 {
2787 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
2788 	struct allegro_channel *channel = vb2_get_drv_priv(vb->vb2_queue);
2789 	struct allegro_dev *dev = channel->dev;
2790 
2791 	if (V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
2792 		if (vbuf->field == V4L2_FIELD_ANY)
2793 			vbuf->field = V4L2_FIELD_NONE;
2794 		if (vbuf->field != V4L2_FIELD_NONE) {
2795 			v4l2_err(&dev->v4l2_dev,
2796 				 "channel %d: unsupported field\n",
2797 				 channel->mcu_channel_id);
2798 			return -EINVAL;
2799 		}
2800 	}
2801 
2802 	return 0;
2803 }
2804 
2805 static void allegro_buf_queue(struct vb2_buffer *vb)
2806 {
2807 	struct allegro_channel *channel = vb2_get_drv_priv(vb->vb2_queue);
2808 	struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
2809 	struct vb2_queue *q = vb->vb2_queue;
2810 
2811 	if (V4L2_TYPE_IS_CAPTURE(q->type) &&
2812 	    vb2_is_streaming(q) &&
2813 	    v4l2_m2m_dst_buf_is_last(channel->fh.m2m_ctx)) {
2814 		unsigned int i;
2815 
2816 		for (i = 0; i < vb->num_planes; i++)
2817 			vb2_set_plane_payload(vb, i, 0);
2818 
2819 		vbuf->field = V4L2_FIELD_NONE;
2820 		vbuf->sequence = channel->csequence++;
2821 
2822 		v4l2_m2m_last_buffer_done(channel->fh.m2m_ctx, vbuf);
2823 		allegro_channel_eos_event(channel);
2824 		return;
2825 	}
2826 
2827 	v4l2_m2m_buf_queue(channel->fh.m2m_ctx, vbuf);
2828 }
2829 
2830 static int allegro_start_streaming(struct vb2_queue *q, unsigned int count)
2831 {
2832 	struct allegro_channel *channel = vb2_get_drv_priv(q);
2833 	struct allegro_dev *dev = channel->dev;
2834 
2835 	v4l2_dbg(2, debug, &dev->v4l2_dev,
2836 		 "%s: start streaming\n",
2837 		 V4L2_TYPE_IS_OUTPUT(q->type) ? "output" : "capture");
2838 
2839 	v4l2_m2m_update_start_streaming_state(channel->fh.m2m_ctx, q);
2840 
2841 	if (V4L2_TYPE_IS_OUTPUT(q->type))
2842 		channel->osequence = 0;
2843 	else
2844 		channel->csequence = 0;
2845 
2846 	return 0;
2847 }
2848 
2849 static void allegro_stop_streaming(struct vb2_queue *q)
2850 {
2851 	struct allegro_channel *channel = vb2_get_drv_priv(q);
2852 	struct allegro_dev *dev = channel->dev;
2853 	struct vb2_v4l2_buffer *buffer;
2854 	struct allegro_m2m_buffer *shadow, *tmp;
2855 
2856 	v4l2_dbg(2, debug, &dev->v4l2_dev,
2857 		 "%s: stop streaming\n",
2858 		 V4L2_TYPE_IS_OUTPUT(q->type) ? "output" : "capture");
2859 
2860 	if (V4L2_TYPE_IS_OUTPUT(q->type)) {
2861 		mutex_lock(&channel->shadow_list_lock);
2862 		list_for_each_entry_safe(shadow, tmp,
2863 					 &channel->source_shadow_list, head) {
2864 			list_del(&shadow->head);
2865 			v4l2_m2m_buf_done(&shadow->buf.vb, VB2_BUF_STATE_ERROR);
2866 		}
2867 		mutex_unlock(&channel->shadow_list_lock);
2868 
2869 		while ((buffer = v4l2_m2m_src_buf_remove(channel->fh.m2m_ctx)))
2870 			v4l2_m2m_buf_done(buffer, VB2_BUF_STATE_ERROR);
2871 	} else {
2872 		mutex_lock(&channel->shadow_list_lock);
2873 		list_for_each_entry_safe(shadow, tmp,
2874 					 &channel->stream_shadow_list, head) {
2875 			list_del(&shadow->head);
2876 			v4l2_m2m_buf_done(&shadow->buf.vb, VB2_BUF_STATE_ERROR);
2877 		}
2878 		mutex_unlock(&channel->shadow_list_lock);
2879 
2880 		allegro_destroy_channel(channel);
2881 		while ((buffer = v4l2_m2m_dst_buf_remove(channel->fh.m2m_ctx)))
2882 			v4l2_m2m_buf_done(buffer, VB2_BUF_STATE_ERROR);
2883 	}
2884 
2885 	v4l2_m2m_update_stop_streaming_state(channel->fh.m2m_ctx, q);
2886 
2887 	if (V4L2_TYPE_IS_OUTPUT(q->type) &&
2888 	    v4l2_m2m_has_stopped(channel->fh.m2m_ctx))
2889 		allegro_channel_eos_event(channel);
2890 }
2891 
2892 static const struct vb2_ops allegro_queue_ops = {
2893 	.queue_setup = allegro_queue_setup,
2894 	.buf_prepare = allegro_buf_prepare,
2895 	.buf_queue = allegro_buf_queue,
2896 	.start_streaming = allegro_start_streaming,
2897 	.stop_streaming = allegro_stop_streaming,
2898 	.wait_prepare = vb2_ops_wait_prepare,
2899 	.wait_finish = vb2_ops_wait_finish,
2900 };
2901 
2902 static int allegro_queue_init(void *priv,
2903 			      struct vb2_queue *src_vq,
2904 			      struct vb2_queue *dst_vq)
2905 {
2906 	int err;
2907 	struct allegro_channel *channel = priv;
2908 
2909 	src_vq->dev = &channel->dev->plat_dev->dev;
2910 	src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
2911 	src_vq->io_modes = VB2_DMABUF | VB2_MMAP;
2912 	src_vq->mem_ops = &vb2_dma_contig_memops;
2913 	src_vq->drv_priv = channel;
2914 	src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2915 	src_vq->ops = &allegro_queue_ops;
2916 	src_vq->buf_struct_size = sizeof(struct allegro_m2m_buffer);
2917 	src_vq->lock = &channel->dev->lock;
2918 	err = vb2_queue_init(src_vq);
2919 	if (err)
2920 		return err;
2921 
2922 	dst_vq->dev = &channel->dev->plat_dev->dev;
2923 	dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2924 	dst_vq->io_modes = VB2_DMABUF | VB2_MMAP;
2925 	dst_vq->mem_ops = &vb2_dma_contig_memops;
2926 	dst_vq->drv_priv = channel;
2927 	dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2928 	dst_vq->ops = &allegro_queue_ops;
2929 	dst_vq->buf_struct_size = sizeof(struct allegro_m2m_buffer);
2930 	dst_vq->lock = &channel->dev->lock;
2931 	err = vb2_queue_init(dst_vq);
2932 	if (err)
2933 		return err;
2934 
2935 	return 0;
2936 }
2937 
2938 static int allegro_clamp_qp(struct allegro_channel *channel,
2939 			    struct v4l2_ctrl *ctrl)
2940 {
2941 	struct v4l2_ctrl *next_ctrl;
2942 
2943 	if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP)
2944 		next_ctrl = channel->mpeg_video_h264_p_frame_qp;
2945 	else if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP)
2946 		next_ctrl = channel->mpeg_video_h264_b_frame_qp;
2947 	else
2948 		return 0;
2949 
2950 	/* Modify range automatically updates the value */
2951 	__v4l2_ctrl_modify_range(next_ctrl, ctrl->val, 51, 1, ctrl->val);
2952 
2953 	return allegro_clamp_qp(channel, next_ctrl);
2954 }
2955 
2956 static int allegro_clamp_bitrate(struct allegro_channel *channel,
2957 				 struct v4l2_ctrl *ctrl)
2958 {
2959 	struct v4l2_ctrl *ctrl_bitrate = channel->mpeg_video_bitrate;
2960 	struct v4l2_ctrl *ctrl_bitrate_peak = channel->mpeg_video_bitrate_peak;
2961 
2962 	if (ctrl->val == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR &&
2963 	    ctrl_bitrate_peak->val < ctrl_bitrate->val)
2964 		ctrl_bitrate_peak->val = ctrl_bitrate->val;
2965 
2966 	return 0;
2967 }
2968 
2969 static int allegro_try_ctrl(struct v4l2_ctrl *ctrl)
2970 {
2971 	struct allegro_channel *channel = container_of(ctrl->handler,
2972 						       struct allegro_channel,
2973 						       ctrl_handler);
2974 
2975 	switch (ctrl->id) {
2976 	case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
2977 		allegro_clamp_bitrate(channel, ctrl);
2978 		break;
2979 	case V4L2_CID_USER_ALLEGRO_ENCODER_BUFFER:
2980 		if (!channel->dev->has_encoder_buffer)
2981 			ctrl->val = 0;
2982 		break;
2983 	}
2984 
2985 	return 0;
2986 }
2987 
2988 static int allegro_s_ctrl(struct v4l2_ctrl *ctrl)
2989 {
2990 	struct allegro_channel *channel = container_of(ctrl->handler,
2991 						       struct allegro_channel,
2992 						       ctrl_handler);
2993 	struct allegro_dev *dev = channel->dev;
2994 
2995 	v4l2_dbg(1, debug, &dev->v4l2_dev,
2996 		 "s_ctrl: %s = %d\n", v4l2_ctrl_get_name(ctrl->id), ctrl->val);
2997 
2998 	switch (ctrl->id) {
2999 	case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
3000 		channel->frame_rc_enable = ctrl->val;
3001 		break;
3002 	case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
3003 		channel->bitrate = channel->mpeg_video_bitrate->val;
3004 		channel->bitrate_peak = channel->mpeg_video_bitrate_peak->val;
3005 		v4l2_ctrl_activate(channel->mpeg_video_bitrate_peak,
3006 				   ctrl->val == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
3007 		break;
3008 	case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:
3009 	case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:
3010 	case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP:
3011 		allegro_clamp_qp(channel, ctrl);
3012 		break;
3013 	}
3014 
3015 	return 0;
3016 }
3017 
3018 static const struct v4l2_ctrl_ops allegro_ctrl_ops = {
3019 	.try_ctrl = allegro_try_ctrl,
3020 	.s_ctrl = allegro_s_ctrl,
3021 };
3022 
3023 static const struct v4l2_ctrl_config allegro_encoder_buffer_ctrl_config = {
3024 	.id = V4L2_CID_USER_ALLEGRO_ENCODER_BUFFER,
3025 	.name = "Encoder Buffer Enable",
3026 	.type = V4L2_CTRL_TYPE_BOOLEAN,
3027 	.min = 0,
3028 	.max = 1,
3029 	.step = 1,
3030 	.def = 1,
3031 };
3032 
3033 static int allegro_open(struct file *file)
3034 {
3035 	struct video_device *vdev = video_devdata(file);
3036 	struct allegro_dev *dev = video_get_drvdata(vdev);
3037 	struct allegro_channel *channel = NULL;
3038 	struct v4l2_ctrl_handler *handler;
3039 	u64 mask;
3040 	int ret;
3041 	unsigned int bitrate_max;
3042 	unsigned int bitrate_def;
3043 	unsigned int cpb_size_max;
3044 	unsigned int cpb_size_def;
3045 
3046 	channel = kzalloc(sizeof(*channel), GFP_KERNEL);
3047 	if (!channel)
3048 		return -ENOMEM;
3049 
3050 	v4l2_fh_init(&channel->fh, vdev);
3051 
3052 	init_completion(&channel->completion);
3053 	INIT_LIST_HEAD(&channel->source_shadow_list);
3054 	INIT_LIST_HEAD(&channel->stream_shadow_list);
3055 	mutex_init(&channel->shadow_list_lock);
3056 
3057 	channel->dev = dev;
3058 
3059 	allegro_set_default_params(channel);
3060 
3061 	handler = &channel->ctrl_handler;
3062 	v4l2_ctrl_handler_init(handler, 0);
3063 	channel->mpeg_video_h264_profile = v4l2_ctrl_new_std_menu(handler,
3064 			&allegro_ctrl_ops,
3065 			V4L2_CID_MPEG_VIDEO_H264_PROFILE,
3066 			V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE, 0x0,
3067 			V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE);
3068 	mask = 1 << V4L2_MPEG_VIDEO_H264_LEVEL_1B;
3069 	channel->mpeg_video_h264_level = v4l2_ctrl_new_std_menu(handler,
3070 			&allegro_ctrl_ops,
3071 			V4L2_CID_MPEG_VIDEO_H264_LEVEL,
3072 			V4L2_MPEG_VIDEO_H264_LEVEL_5_1, mask,
3073 			V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
3074 	channel->mpeg_video_h264_i_frame_qp =
3075 		v4l2_ctrl_new_std(handler,
3076 				  &allegro_ctrl_ops,
3077 				  V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
3078 				  0, 51, 1, 30);
3079 	channel->mpeg_video_h264_max_qp =
3080 		v4l2_ctrl_new_std(handler,
3081 				  &allegro_ctrl_ops,
3082 				  V4L2_CID_MPEG_VIDEO_H264_MAX_QP,
3083 				  0, 51, 1, 51);
3084 	channel->mpeg_video_h264_min_qp =
3085 		v4l2_ctrl_new_std(handler,
3086 				  &allegro_ctrl_ops,
3087 				  V4L2_CID_MPEG_VIDEO_H264_MIN_QP,
3088 				  0, 51, 1, 0);
3089 	channel->mpeg_video_h264_p_frame_qp =
3090 		v4l2_ctrl_new_std(handler,
3091 				  &allegro_ctrl_ops,
3092 				  V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP,
3093 				  0, 51, 1, 30);
3094 	channel->mpeg_video_h264_b_frame_qp =
3095 		v4l2_ctrl_new_std(handler,
3096 				  &allegro_ctrl_ops,
3097 				  V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP,
3098 				  0, 51, 1, 30);
3099 
3100 	channel->mpeg_video_hevc_profile =
3101 		v4l2_ctrl_new_std_menu(handler,
3102 				       &allegro_ctrl_ops,
3103 				       V4L2_CID_MPEG_VIDEO_HEVC_PROFILE,
3104 				       V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, 0x0,
3105 				       V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN);
3106 	channel->mpeg_video_hevc_level =
3107 		v4l2_ctrl_new_std_menu(handler,
3108 				       &allegro_ctrl_ops,
3109 				       V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,
3110 				       V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1, 0x0,
3111 				       V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1);
3112 	channel->mpeg_video_hevc_tier =
3113 		v4l2_ctrl_new_std_menu(handler,
3114 				       &allegro_ctrl_ops,
3115 				       V4L2_CID_MPEG_VIDEO_HEVC_TIER,
3116 				       V4L2_MPEG_VIDEO_HEVC_TIER_HIGH, 0x0,
3117 				       V4L2_MPEG_VIDEO_HEVC_TIER_MAIN);
3118 	channel->mpeg_video_hevc_i_frame_qp =
3119 		v4l2_ctrl_new_std(handler,
3120 				  &allegro_ctrl_ops,
3121 				  V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP,
3122 				  0, 51, 1, 30);
3123 	channel->mpeg_video_hevc_max_qp =
3124 		v4l2_ctrl_new_std(handler,
3125 				  &allegro_ctrl_ops,
3126 				  V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP,
3127 				  0, 51, 1, 51);
3128 	channel->mpeg_video_hevc_min_qp =
3129 		v4l2_ctrl_new_std(handler,
3130 				  &allegro_ctrl_ops,
3131 				  V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP,
3132 				  0, 51, 1, 0);
3133 	channel->mpeg_video_hevc_p_frame_qp =
3134 		v4l2_ctrl_new_std(handler,
3135 				  &allegro_ctrl_ops,
3136 				  V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP,
3137 				  0, 51, 1, 30);
3138 	channel->mpeg_video_hevc_b_frame_qp =
3139 		v4l2_ctrl_new_std(handler,
3140 				  &allegro_ctrl_ops,
3141 				  V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP,
3142 				  0, 51, 1, 30);
3143 
3144 	channel->mpeg_video_frame_rc_enable =
3145 		v4l2_ctrl_new_std(handler,
3146 				  &allegro_ctrl_ops,
3147 				  V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE,
3148 				  false, 0x1,
3149 				  true, false);
3150 	channel->mpeg_video_bitrate_mode = v4l2_ctrl_new_std_menu(handler,
3151 			&allegro_ctrl_ops,
3152 			V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
3153 			V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 0,
3154 			V4L2_MPEG_VIDEO_BITRATE_MODE_CBR);
3155 
3156 	if (channel->codec == V4L2_PIX_FMT_H264) {
3157 		bitrate_max = h264_maximum_bitrate(V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
3158 		bitrate_def = h264_maximum_bitrate(V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
3159 		cpb_size_max = h264_maximum_cpb_size(V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
3160 		cpb_size_def = h264_maximum_cpb_size(V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
3161 	} else {
3162 		bitrate_max = hevc_maximum_bitrate(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1);
3163 		bitrate_def = hevc_maximum_bitrate(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1);
3164 		cpb_size_max = hevc_maximum_cpb_size(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1);
3165 		cpb_size_def = hevc_maximum_cpb_size(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1);
3166 	}
3167 	channel->mpeg_video_bitrate = v4l2_ctrl_new_std(handler,
3168 			&allegro_ctrl_ops,
3169 			V4L2_CID_MPEG_VIDEO_BITRATE,
3170 			0, bitrate_max, 1, bitrate_def);
3171 	channel->mpeg_video_bitrate_peak = v4l2_ctrl_new_std(handler,
3172 			&allegro_ctrl_ops,
3173 			V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
3174 			0, bitrate_max, 1, bitrate_def);
3175 	channel->mpeg_video_cpb_size = v4l2_ctrl_new_std(handler,
3176 			&allegro_ctrl_ops,
3177 			V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE,
3178 			0, cpb_size_max, 1, cpb_size_def);
3179 	channel->mpeg_video_gop_size = v4l2_ctrl_new_std(handler,
3180 			&allegro_ctrl_ops,
3181 			V4L2_CID_MPEG_VIDEO_GOP_SIZE,
3182 			0, ALLEGRO_GOP_SIZE_MAX,
3183 			1, ALLEGRO_GOP_SIZE_DEFAULT);
3184 	channel->encoder_buffer = v4l2_ctrl_new_custom(handler,
3185 			&allegro_encoder_buffer_ctrl_config, NULL);
3186 	v4l2_ctrl_new_std(handler,
3187 			  &allegro_ctrl_ops,
3188 			  V4L2_CID_MIN_BUFFERS_FOR_OUTPUT,
3189 			  1, 32,
3190 			  1, 1);
3191 	if (handler->error != 0) {
3192 		ret = handler->error;
3193 		goto error;
3194 	}
3195 
3196 	channel->fh.ctrl_handler = handler;
3197 
3198 	v4l2_ctrl_cluster(3, &channel->mpeg_video_bitrate_mode);
3199 
3200 	v4l2_ctrl_handler_setup(handler);
3201 
3202 	channel->mcu_channel_id = -1;
3203 	channel->user_id = -1;
3204 
3205 	INIT_LIST_HEAD(&channel->buffers_reference);
3206 	INIT_LIST_HEAD(&channel->buffers_intermediate);
3207 
3208 	channel->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, channel,
3209 						allegro_queue_init);
3210 
3211 	if (IS_ERR(channel->fh.m2m_ctx)) {
3212 		ret = PTR_ERR(channel->fh.m2m_ctx);
3213 		goto error;
3214 	}
3215 
3216 	list_add(&channel->list, &dev->channels);
3217 	file->private_data = &channel->fh;
3218 	v4l2_fh_add(&channel->fh);
3219 
3220 	allegro_channel_adjust(channel);
3221 
3222 	return 0;
3223 
3224 error:
3225 	v4l2_ctrl_handler_free(handler);
3226 	kfree(channel);
3227 	return ret;
3228 }
3229 
3230 static int allegro_release(struct file *file)
3231 {
3232 	struct allegro_channel *channel = fh_to_channel(file->private_data);
3233 
3234 	v4l2_m2m_ctx_release(channel->fh.m2m_ctx);
3235 
3236 	list_del(&channel->list);
3237 
3238 	v4l2_ctrl_handler_free(&channel->ctrl_handler);
3239 
3240 	v4l2_fh_del(&channel->fh);
3241 	v4l2_fh_exit(&channel->fh);
3242 
3243 	kfree(channel);
3244 
3245 	return 0;
3246 }
3247 
3248 static int allegro_querycap(struct file *file, void *fh,
3249 			    struct v4l2_capability *cap)
3250 {
3251 	strscpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver));
3252 	strscpy(cap->card, "Allegro DVT Video Encoder", sizeof(cap->card));
3253 
3254 	return 0;
3255 }
3256 
3257 static int allegro_enum_fmt_vid(struct file *file, void *fh,
3258 				struct v4l2_fmtdesc *f)
3259 {
3260 	switch (f->type) {
3261 	case V4L2_BUF_TYPE_VIDEO_OUTPUT:
3262 		if (f->index >= 1)
3263 			return -EINVAL;
3264 		f->pixelformat = V4L2_PIX_FMT_NV12;
3265 		break;
3266 	case V4L2_BUF_TYPE_VIDEO_CAPTURE:
3267 		if (f->index >= 2)
3268 			return -EINVAL;
3269 		if (f->index == 0)
3270 			f->pixelformat = V4L2_PIX_FMT_H264;
3271 		if (f->index == 1)
3272 			f->pixelformat = V4L2_PIX_FMT_HEVC;
3273 		break;
3274 	default:
3275 		return -EINVAL;
3276 	}
3277 	return 0;
3278 }
3279 
3280 static int allegro_g_fmt_vid_cap(struct file *file, void *fh,
3281 				 struct v4l2_format *f)
3282 {
3283 	struct allegro_channel *channel = fh_to_channel(fh);
3284 
3285 	f->fmt.pix.field = V4L2_FIELD_NONE;
3286 	f->fmt.pix.width = channel->width;
3287 	f->fmt.pix.height = channel->height;
3288 
3289 	f->fmt.pix.colorspace = channel->colorspace;
3290 	f->fmt.pix.ycbcr_enc = channel->ycbcr_enc;
3291 	f->fmt.pix.quantization = channel->quantization;
3292 	f->fmt.pix.xfer_func = channel->xfer_func;
3293 
3294 	f->fmt.pix.pixelformat = channel->codec;
3295 	f->fmt.pix.bytesperline = 0;
3296 	f->fmt.pix.sizeimage = channel->sizeimage_encoded;
3297 
3298 	return 0;
3299 }
3300 
3301 static int allegro_try_fmt_vid_cap(struct file *file, void *fh,
3302 				   struct v4l2_format *f)
3303 {
3304 	f->fmt.pix.field = V4L2_FIELD_NONE;
3305 
3306 	f->fmt.pix.width = clamp_t(__u32, f->fmt.pix.width,
3307 				   ALLEGRO_WIDTH_MIN, ALLEGRO_WIDTH_MAX);
3308 	f->fmt.pix.height = clamp_t(__u32, f->fmt.pix.height,
3309 				    ALLEGRO_HEIGHT_MIN, ALLEGRO_HEIGHT_MAX);
3310 
3311 	if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_HEVC &&
3312 	    f->fmt.pix.pixelformat != V4L2_PIX_FMT_H264)
3313 		f->fmt.pix.pixelformat = V4L2_PIX_FMT_H264;
3314 
3315 	f->fmt.pix.bytesperline = 0;
3316 	f->fmt.pix.sizeimage =
3317 		estimate_stream_size(f->fmt.pix.width, f->fmt.pix.height);
3318 
3319 	return 0;
3320 }
3321 
3322 static int allegro_s_fmt_vid_cap(struct file *file, void *fh,
3323 				 struct v4l2_format *f)
3324 {
3325 	struct allegro_channel *channel = fh_to_channel(fh);
3326 	struct vb2_queue *vq;
3327 	int err;
3328 
3329 	err = allegro_try_fmt_vid_cap(file, fh, f);
3330 	if (err)
3331 		return err;
3332 
3333 	vq = v4l2_m2m_get_vq(channel->fh.m2m_ctx, f->type);
3334 	if (!vq)
3335 		return -EINVAL;
3336 	if (vb2_is_busy(vq))
3337 		return -EBUSY;
3338 
3339 	channel->codec = f->fmt.pix.pixelformat;
3340 
3341 	allegro_channel_adjust(channel);
3342 
3343 	return 0;
3344 }
3345 
3346 static int allegro_g_fmt_vid_out(struct file *file, void *fh,
3347 				 struct v4l2_format *f)
3348 {
3349 	struct allegro_channel *channel = fh_to_channel(fh);
3350 
3351 	f->fmt.pix.field = V4L2_FIELD_NONE;
3352 
3353 	f->fmt.pix.width = channel->width;
3354 	f->fmt.pix.height = channel->height;
3355 
3356 	f->fmt.pix.colorspace = channel->colorspace;
3357 	f->fmt.pix.ycbcr_enc = channel->ycbcr_enc;
3358 	f->fmt.pix.quantization = channel->quantization;
3359 	f->fmt.pix.xfer_func = channel->xfer_func;
3360 
3361 	f->fmt.pix.pixelformat = channel->pixelformat;
3362 	f->fmt.pix.bytesperline = channel->stride;
3363 	f->fmt.pix.sizeimage = channel->sizeimage_raw;
3364 
3365 	return 0;
3366 }
3367 
3368 static int allegro_try_fmt_vid_out(struct file *file, void *fh,
3369 				   struct v4l2_format *f)
3370 {
3371 	f->fmt.pix.field = V4L2_FIELD_NONE;
3372 
3373 	/*
3374 	 * The firmware of the Allegro codec handles the padding internally
3375 	 * and expects the visual frame size when configuring a channel.
3376 	 * Therefore, unlike other encoder drivers, this driver does not round
3377 	 * up the width and height to macroblock alignment and does not
3378 	 * implement the selection api.
3379 	 */
3380 	f->fmt.pix.width = clamp_t(__u32, f->fmt.pix.width,
3381 				   ALLEGRO_WIDTH_MIN, ALLEGRO_WIDTH_MAX);
3382 	f->fmt.pix.height = clamp_t(__u32, f->fmt.pix.height,
3383 				    ALLEGRO_HEIGHT_MIN, ALLEGRO_HEIGHT_MAX);
3384 
3385 	f->fmt.pix.pixelformat = V4L2_PIX_FMT_NV12;
3386 	f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 32);
3387 	f->fmt.pix.sizeimage =
3388 		f->fmt.pix.bytesperline * f->fmt.pix.height * 3 / 2;
3389 
3390 	return 0;
3391 }
3392 
3393 static int allegro_s_fmt_vid_out(struct file *file, void *fh,
3394 				 struct v4l2_format *f)
3395 {
3396 	struct allegro_channel *channel = fh_to_channel(fh);
3397 	int err;
3398 
3399 	err = allegro_try_fmt_vid_out(file, fh, f);
3400 	if (err)
3401 		return err;
3402 
3403 	channel->width = f->fmt.pix.width;
3404 	channel->height = f->fmt.pix.height;
3405 	channel->stride = f->fmt.pix.bytesperline;
3406 	channel->sizeimage_raw = f->fmt.pix.sizeimage;
3407 
3408 	channel->colorspace = f->fmt.pix.colorspace;
3409 	channel->ycbcr_enc = f->fmt.pix.ycbcr_enc;
3410 	channel->quantization = f->fmt.pix.quantization;
3411 	channel->xfer_func = f->fmt.pix.xfer_func;
3412 
3413 	allegro_channel_adjust(channel);
3414 
3415 	return 0;
3416 }
3417 
3418 static int allegro_channel_cmd_stop(struct allegro_channel *channel)
3419 {
3420 	if (v4l2_m2m_has_stopped(channel->fh.m2m_ctx))
3421 		allegro_channel_eos_event(channel);
3422 
3423 	return 0;
3424 }
3425 
3426 static int allegro_channel_cmd_start(struct allegro_channel *channel)
3427 {
3428 	if (v4l2_m2m_has_stopped(channel->fh.m2m_ctx))
3429 		vb2_clear_last_buffer_dequeued(&channel->fh.m2m_ctx->cap_q_ctx.q);
3430 
3431 	return 0;
3432 }
3433 
3434 static int allegro_encoder_cmd(struct file *file, void *fh,
3435 			       struct v4l2_encoder_cmd *cmd)
3436 {
3437 	struct allegro_channel *channel = fh_to_channel(fh);
3438 	int err;
3439 
3440 	err = v4l2_m2m_ioctl_try_encoder_cmd(file, fh, cmd);
3441 	if (err)
3442 		return err;
3443 
3444 	err = v4l2_m2m_ioctl_encoder_cmd(file, fh, cmd);
3445 	if (err)
3446 		return err;
3447 
3448 	if (cmd->cmd == V4L2_ENC_CMD_STOP)
3449 		err = allegro_channel_cmd_stop(channel);
3450 
3451 	if (cmd->cmd == V4L2_ENC_CMD_START)
3452 		err = allegro_channel_cmd_start(channel);
3453 
3454 	return err;
3455 }
3456 
3457 static int allegro_enum_framesizes(struct file *file, void *fh,
3458 				   struct v4l2_frmsizeenum *fsize)
3459 {
3460 	switch (fsize->pixel_format) {
3461 	case V4L2_PIX_FMT_HEVC:
3462 	case V4L2_PIX_FMT_H264:
3463 	case V4L2_PIX_FMT_NV12:
3464 		break;
3465 	default:
3466 		return -EINVAL;
3467 	}
3468 
3469 	if (fsize->index)
3470 		return -EINVAL;
3471 
3472 	fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS;
3473 	fsize->stepwise.min_width = ALLEGRO_WIDTH_MIN;
3474 	fsize->stepwise.max_width = ALLEGRO_WIDTH_MAX;
3475 	fsize->stepwise.step_width = 1;
3476 	fsize->stepwise.min_height = ALLEGRO_HEIGHT_MIN;
3477 	fsize->stepwise.max_height = ALLEGRO_HEIGHT_MAX;
3478 	fsize->stepwise.step_height = 1;
3479 
3480 	return 0;
3481 }
3482 
3483 static int allegro_ioctl_streamon(struct file *file, void *priv,
3484 				  enum v4l2_buf_type type)
3485 {
3486 	struct v4l2_fh *fh = file->private_data;
3487 	struct allegro_channel *channel = fh_to_channel(fh);
3488 	int err;
3489 
3490 	if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
3491 		err = allegro_create_channel(channel);
3492 		if (err)
3493 			return err;
3494 	}
3495 
3496 	return v4l2_m2m_streamon(file, fh->m2m_ctx, type);
3497 }
3498 
3499 static int allegro_g_parm(struct file *file, void *fh,
3500 			  struct v4l2_streamparm *a)
3501 {
3502 	struct allegro_channel *channel = fh_to_channel(fh);
3503 	struct v4l2_fract *timeperframe;
3504 
3505 	if (a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
3506 		return -EINVAL;
3507 
3508 	a->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
3509 	timeperframe = &a->parm.output.timeperframe;
3510 	timeperframe->numerator = channel->framerate.denominator;
3511 	timeperframe->denominator = channel->framerate.numerator;
3512 
3513 	return 0;
3514 }
3515 
3516 static int allegro_s_parm(struct file *file, void *fh,
3517 			  struct v4l2_streamparm *a)
3518 {
3519 	struct allegro_channel *channel = fh_to_channel(fh);
3520 	struct v4l2_fract *timeperframe;
3521 	int div;
3522 
3523 	if (a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
3524 		return -EINVAL;
3525 
3526 	a->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
3527 	timeperframe = &a->parm.output.timeperframe;
3528 
3529 	if (timeperframe->numerator == 0 || timeperframe->denominator == 0)
3530 		return allegro_g_parm(file, fh, a);
3531 
3532 	div = gcd(timeperframe->denominator, timeperframe->numerator);
3533 	channel->framerate.numerator = timeperframe->denominator / div;
3534 	channel->framerate.denominator = timeperframe->numerator / div;
3535 
3536 	return 0;
3537 }
3538 
3539 static int allegro_subscribe_event(struct v4l2_fh *fh,
3540 				   const struct v4l2_event_subscription *sub)
3541 {
3542 	switch (sub->type) {
3543 	case V4L2_EVENT_EOS:
3544 		return v4l2_event_subscribe(fh, sub, 0, NULL);
3545 	default:
3546 		return v4l2_ctrl_subscribe_event(fh, sub);
3547 	}
3548 }
3549 
3550 static const struct v4l2_ioctl_ops allegro_ioctl_ops = {
3551 	.vidioc_querycap = allegro_querycap,
3552 	.vidioc_enum_fmt_vid_cap = allegro_enum_fmt_vid,
3553 	.vidioc_enum_fmt_vid_out = allegro_enum_fmt_vid,
3554 	.vidioc_g_fmt_vid_cap = allegro_g_fmt_vid_cap,
3555 	.vidioc_try_fmt_vid_cap = allegro_try_fmt_vid_cap,
3556 	.vidioc_s_fmt_vid_cap = allegro_s_fmt_vid_cap,
3557 	.vidioc_g_fmt_vid_out = allegro_g_fmt_vid_out,
3558 	.vidioc_try_fmt_vid_out = allegro_try_fmt_vid_out,
3559 	.vidioc_s_fmt_vid_out = allegro_s_fmt_vid_out,
3560 
3561 	.vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs,
3562 	.vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs,
3563 
3564 	.vidioc_expbuf = v4l2_m2m_ioctl_expbuf,
3565 	.vidioc_querybuf = v4l2_m2m_ioctl_querybuf,
3566 	.vidioc_qbuf = v4l2_m2m_ioctl_qbuf,
3567 	.vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf,
3568 	.vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf,
3569 
3570 	.vidioc_streamon = allegro_ioctl_streamon,
3571 	.vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
3572 
3573 	.vidioc_try_encoder_cmd = v4l2_m2m_ioctl_try_encoder_cmd,
3574 	.vidioc_encoder_cmd = allegro_encoder_cmd,
3575 	.vidioc_enum_framesizes = allegro_enum_framesizes,
3576 
3577 	.vidioc_g_parm		= allegro_g_parm,
3578 	.vidioc_s_parm		= allegro_s_parm,
3579 
3580 	.vidioc_subscribe_event = allegro_subscribe_event,
3581 	.vidioc_unsubscribe_event = v4l2_event_unsubscribe,
3582 };
3583 
3584 static const struct v4l2_file_operations allegro_fops = {
3585 	.owner = THIS_MODULE,
3586 	.open = allegro_open,
3587 	.release = allegro_release,
3588 	.poll = v4l2_m2m_fop_poll,
3589 	.unlocked_ioctl = video_ioctl2,
3590 	.mmap = v4l2_m2m_fop_mmap,
3591 };
3592 
3593 static int allegro_register_device(struct allegro_dev *dev)
3594 {
3595 	struct video_device *video_dev = &dev->video_dev;
3596 
3597 	strscpy(video_dev->name, "allegro", sizeof(video_dev->name));
3598 	video_dev->fops = &allegro_fops;
3599 	video_dev->ioctl_ops = &allegro_ioctl_ops;
3600 	video_dev->release = video_device_release_empty;
3601 	video_dev->lock = &dev->lock;
3602 	video_dev->v4l2_dev = &dev->v4l2_dev;
3603 	video_dev->vfl_dir = VFL_DIR_M2M;
3604 	video_dev->device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING;
3605 	video_set_drvdata(video_dev, dev);
3606 
3607 	return video_register_device(video_dev, VFL_TYPE_VIDEO, 0);
3608 }
3609 
3610 static void allegro_device_run(void *priv)
3611 {
3612 	struct allegro_channel *channel = priv;
3613 	struct allegro_dev *dev = channel->dev;
3614 	struct vb2_v4l2_buffer *src_buf;
3615 	struct vb2_v4l2_buffer *dst_buf;
3616 	dma_addr_t src_y;
3617 	dma_addr_t src_uv;
3618 	dma_addr_t dst_addr;
3619 	unsigned long dst_size;
3620 	u64 src_handle;
3621 	u64 dst_handle;
3622 
3623 	dst_buf = v4l2_m2m_dst_buf_remove(channel->fh.m2m_ctx);
3624 	dst_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
3625 	dst_size = vb2_plane_size(&dst_buf->vb2_buf, 0);
3626 	dst_handle = allegro_put_buffer(channel, &channel->stream_shadow_list,
3627 					dst_buf);
3628 	allegro_mcu_send_put_stream_buffer(dev, channel, dst_addr, dst_size,
3629 					   dst_handle);
3630 
3631 	src_buf = v4l2_m2m_src_buf_remove(channel->fh.m2m_ctx);
3632 	src_buf->sequence = channel->osequence++;
3633 	src_y = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
3634 	src_uv = src_y + (channel->stride * channel->height);
3635 	src_handle = allegro_put_buffer(channel, &channel->source_shadow_list,
3636 					src_buf);
3637 	allegro_mcu_send_encode_frame(dev, channel, src_y, src_uv, src_handle);
3638 
3639 	v4l2_m2m_job_finish(dev->m2m_dev, channel->fh.m2m_ctx);
3640 }
3641 
3642 static const struct v4l2_m2m_ops allegro_m2m_ops = {
3643 	.device_run = allegro_device_run,
3644 };
3645 
3646 static int allegro_mcu_hw_init(struct allegro_dev *dev,
3647 			       const struct fw_info *info)
3648 {
3649 	int err;
3650 
3651 	dev->mbox_command = allegro_mbox_init(dev, info->mailbox_cmd,
3652 					      info->mailbox_size);
3653 	dev->mbox_status = allegro_mbox_init(dev, info->mailbox_status,
3654 					     info->mailbox_size);
3655 	if (IS_ERR(dev->mbox_command) || IS_ERR(dev->mbox_status)) {
3656 		v4l2_err(&dev->v4l2_dev,
3657 			 "failed to initialize mailboxes\n");
3658 		return -EIO;
3659 	}
3660 
3661 	err = allegro_encoder_buffer_init(dev, &dev->encoder_buffer);
3662 	dev->has_encoder_buffer = (err == 0);
3663 	if (!dev->has_encoder_buffer)
3664 		v4l2_info(&dev->v4l2_dev, "encoder buffer not available\n");
3665 
3666 	allegro_mcu_enable_interrupts(dev);
3667 
3668 	/* The mcu sends INIT after reset. */
3669 	allegro_mcu_start(dev);
3670 	err = allegro_mcu_wait_for_init_timeout(dev, 5000);
3671 	if (err < 0) {
3672 		v4l2_err(&dev->v4l2_dev,
3673 			 "mcu did not send INIT after reset\n");
3674 		err = -EIO;
3675 		goto err_disable_interrupts;
3676 	}
3677 
3678 	err = allegro_alloc_buffer(dev, &dev->suballocator,
3679 				   info->suballocator_size);
3680 	if (err) {
3681 		v4l2_err(&dev->v4l2_dev,
3682 			 "failed to allocate %zu bytes for suballocator\n",
3683 			 info->suballocator_size);
3684 		goto err_reset_mcu;
3685 	}
3686 
3687 	allegro_mcu_send_init(dev, dev->suballocator.paddr,
3688 			      dev->suballocator.size);
3689 	err = allegro_mcu_wait_for_init_timeout(dev, 5000);
3690 	if (err < 0) {
3691 		v4l2_err(&dev->v4l2_dev,
3692 			 "mcu failed to configure sub-allocator\n");
3693 		err = -EIO;
3694 		goto err_free_suballocator;
3695 	}
3696 
3697 	return 0;
3698 
3699 err_free_suballocator:
3700 	allegro_free_buffer(dev, &dev->suballocator);
3701 err_reset_mcu:
3702 	allegro_mcu_reset(dev);
3703 err_disable_interrupts:
3704 	allegro_mcu_disable_interrupts(dev);
3705 
3706 	return err;
3707 }
3708 
3709 static int allegro_mcu_hw_deinit(struct allegro_dev *dev)
3710 {
3711 	int err;
3712 
3713 	err = allegro_mcu_reset(dev);
3714 	if (err)
3715 		v4l2_warn(&dev->v4l2_dev,
3716 			  "mcu failed to enter sleep state\n");
3717 
3718 	err = allegro_mcu_disable_interrupts(dev);
3719 	if (err)
3720 		v4l2_warn(&dev->v4l2_dev,
3721 			  "failed to disable interrupts\n");
3722 
3723 	allegro_free_buffer(dev, &dev->suballocator);
3724 
3725 	return 0;
3726 }
3727 
3728 static void allegro_fw_callback(const struct firmware *fw, void *context)
3729 {
3730 	struct allegro_dev *dev = context;
3731 	const char *fw_codec_name = "al5e.fw";
3732 	const struct firmware *fw_codec;
3733 	int err;
3734 
3735 	if (!fw)
3736 		return;
3737 
3738 	v4l2_dbg(1, debug, &dev->v4l2_dev,
3739 		 "requesting codec firmware '%s'\n", fw_codec_name);
3740 	err = request_firmware(&fw_codec, fw_codec_name, &dev->plat_dev->dev);
3741 	if (err)
3742 		goto err_release_firmware;
3743 
3744 	dev->fw_info = allegro_get_firmware_info(dev, fw, fw_codec);
3745 	if (!dev->fw_info) {
3746 		v4l2_err(&dev->v4l2_dev, "firmware is not supported\n");
3747 		goto err_release_firmware_codec;
3748 	}
3749 
3750 	v4l2_info(&dev->v4l2_dev,
3751 		  "using mcu firmware version '%s'\n", dev->fw_info->version);
3752 
3753 	pm_runtime_enable(&dev->plat_dev->dev);
3754 	err = pm_runtime_resume_and_get(&dev->plat_dev->dev);
3755 	if (err)
3756 		goto err_release_firmware_codec;
3757 
3758 	/* Ensure that the mcu is sleeping at the reset vector */
3759 	err = allegro_mcu_reset(dev);
3760 	if (err) {
3761 		v4l2_err(&dev->v4l2_dev, "failed to reset mcu\n");
3762 		goto err_suspend;
3763 	}
3764 
3765 	allegro_copy_firmware(dev, fw->data, fw->size);
3766 	allegro_copy_fw_codec(dev, fw_codec->data, fw_codec->size);
3767 
3768 	err = allegro_mcu_hw_init(dev, dev->fw_info);
3769 	if (err) {
3770 		v4l2_err(&dev->v4l2_dev, "failed to initialize mcu\n");
3771 		goto err_free_fw_codec;
3772 	}
3773 
3774 	dev->m2m_dev = v4l2_m2m_init(&allegro_m2m_ops);
3775 	if (IS_ERR(dev->m2m_dev)) {
3776 		v4l2_err(&dev->v4l2_dev, "failed to init mem2mem device\n");
3777 		goto err_mcu_hw_deinit;
3778 	}
3779 
3780 	err = allegro_register_device(dev);
3781 	if (err) {
3782 		v4l2_err(&dev->v4l2_dev, "failed to register video device\n");
3783 		goto err_m2m_release;
3784 	}
3785 
3786 	v4l2_dbg(1, debug, &dev->v4l2_dev,
3787 		 "allegro codec registered as /dev/video%d\n",
3788 		 dev->video_dev.num);
3789 
3790 	dev->initialized = true;
3791 
3792 	release_firmware(fw_codec);
3793 	release_firmware(fw);
3794 
3795 	return;
3796 
3797 err_m2m_release:
3798 	v4l2_m2m_release(dev->m2m_dev);
3799 	dev->m2m_dev = NULL;
3800 err_mcu_hw_deinit:
3801 	allegro_mcu_hw_deinit(dev);
3802 err_free_fw_codec:
3803 	allegro_free_fw_codec(dev);
3804 err_suspend:
3805 	pm_runtime_put(&dev->plat_dev->dev);
3806 	pm_runtime_disable(&dev->plat_dev->dev);
3807 err_release_firmware_codec:
3808 	release_firmware(fw_codec);
3809 err_release_firmware:
3810 	release_firmware(fw);
3811 }
3812 
3813 static int allegro_firmware_request_nowait(struct allegro_dev *dev)
3814 {
3815 	const char *fw = "al5e_b.fw";
3816 
3817 	v4l2_dbg(1, debug, &dev->v4l2_dev,
3818 		 "requesting firmware '%s'\n", fw);
3819 	return request_firmware_nowait(THIS_MODULE, true, fw,
3820 				       &dev->plat_dev->dev, GFP_KERNEL, dev,
3821 				       allegro_fw_callback);
3822 }
3823 
3824 static int allegro_probe(struct platform_device *pdev)
3825 {
3826 	struct allegro_dev *dev;
3827 	struct resource *res, *sram_res;
3828 	int ret;
3829 	int irq;
3830 	void __iomem *regs, *sram_regs;
3831 
3832 	dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
3833 	if (!dev)
3834 		return -ENOMEM;
3835 	dev->plat_dev = pdev;
3836 	init_completion(&dev->init_complete);
3837 	INIT_LIST_HEAD(&dev->channels);
3838 
3839 	mutex_init(&dev->lock);
3840 
3841 	dev->initialized = false;
3842 
3843 	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
3844 	if (!res) {
3845 		dev_err(&pdev->dev,
3846 			"regs resource missing from device tree\n");
3847 		return -EINVAL;
3848 	}
3849 	regs = devm_ioremap(&pdev->dev, res->start, resource_size(res));
3850 	if (!regs) {
3851 		dev_err(&pdev->dev, "failed to map registers\n");
3852 		return -ENOMEM;
3853 	}
3854 	dev->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
3855 					    &allegro_regmap_config);
3856 	if (IS_ERR(dev->regmap)) {
3857 		dev_err(&pdev->dev, "failed to init regmap\n");
3858 		return PTR_ERR(dev->regmap);
3859 	}
3860 
3861 	sram_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
3862 	if (!sram_res) {
3863 		dev_err(&pdev->dev,
3864 			"sram resource missing from device tree\n");
3865 		return -EINVAL;
3866 	}
3867 	sram_regs = devm_ioremap(&pdev->dev,
3868 				 sram_res->start,
3869 				 resource_size(sram_res));
3870 	if (!sram_regs) {
3871 		dev_err(&pdev->dev, "failed to map sram\n");
3872 		return -ENOMEM;
3873 	}
3874 	dev->sram = devm_regmap_init_mmio(&pdev->dev, sram_regs,
3875 					  &allegro_sram_config);
3876 	if (IS_ERR(dev->sram)) {
3877 		dev_err(&pdev->dev, "failed to init sram\n");
3878 		return PTR_ERR(dev->sram);
3879 	}
3880 
3881 	dev->settings = syscon_regmap_lookup_by_compatible("xlnx,vcu-settings");
3882 	if (IS_ERR(dev->settings))
3883 		dev_warn(&pdev->dev, "failed to open settings\n");
3884 
3885 	dev->clk_core = devm_clk_get(&pdev->dev, "core_clk");
3886 	if (IS_ERR(dev->clk_core))
3887 		return PTR_ERR(dev->clk_core);
3888 
3889 	dev->clk_mcu = devm_clk_get(&pdev->dev, "mcu_clk");
3890 	if (IS_ERR(dev->clk_mcu))
3891 		return PTR_ERR(dev->clk_mcu);
3892 
3893 	irq = platform_get_irq(pdev, 0);
3894 	if (irq < 0)
3895 		return irq;
3896 	ret = devm_request_threaded_irq(&pdev->dev, irq,
3897 					allegro_hardirq,
3898 					allegro_irq_thread,
3899 					IRQF_SHARED, dev_name(&pdev->dev), dev);
3900 	if (ret < 0) {
3901 		dev_err(&pdev->dev, "failed to request irq: %d\n", ret);
3902 		return ret;
3903 	}
3904 
3905 	ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
3906 	if (ret)
3907 		return ret;
3908 
3909 	platform_set_drvdata(pdev, dev);
3910 
3911 	ret = allegro_firmware_request_nowait(dev);
3912 	if (ret < 0) {
3913 		v4l2_err(&dev->v4l2_dev,
3914 			 "failed to request firmware: %d\n", ret);
3915 		return ret;
3916 	}
3917 
3918 	return 0;
3919 }
3920 
3921 static void allegro_remove(struct platform_device *pdev)
3922 {
3923 	struct allegro_dev *dev = platform_get_drvdata(pdev);
3924 
3925 	if (dev->initialized) {
3926 		video_unregister_device(&dev->video_dev);
3927 		if (dev->m2m_dev)
3928 			v4l2_m2m_release(dev->m2m_dev);
3929 		allegro_mcu_hw_deinit(dev);
3930 		allegro_free_fw_codec(dev);
3931 	}
3932 
3933 	pm_runtime_put(&dev->plat_dev->dev);
3934 	pm_runtime_disable(&dev->plat_dev->dev);
3935 
3936 	v4l2_device_unregister(&dev->v4l2_dev);
3937 }
3938 
3939 static int allegro_runtime_resume(struct device *device)
3940 {
3941 	struct allegro_dev *dev = dev_get_drvdata(device);
3942 	struct regmap *settings = dev->settings;
3943 	unsigned int clk_mcu;
3944 	unsigned int clk_core;
3945 	int err;
3946 
3947 	if (!settings)
3948 		return -EINVAL;
3949 
3950 #define MHZ_TO_HZ(freq) ((freq) * 1000 * 1000)
3951 
3952 	err = regmap_read(settings, VCU_CORE_CLK, &clk_core);
3953 	if (err < 0)
3954 		return err;
3955 	err = clk_set_rate(dev->clk_core, MHZ_TO_HZ(clk_core));
3956 	if (err < 0)
3957 		return err;
3958 	err = clk_prepare_enable(dev->clk_core);
3959 	if (err)
3960 		return err;
3961 
3962 	err = regmap_read(settings, VCU_MCU_CLK, &clk_mcu);
3963 	if (err < 0)
3964 		goto disable_clk_core;
3965 	err = clk_set_rate(dev->clk_mcu, MHZ_TO_HZ(clk_mcu));
3966 	if (err < 0)
3967 		goto disable_clk_core;
3968 	err = clk_prepare_enable(dev->clk_mcu);
3969 	if (err)
3970 		goto disable_clk_core;
3971 
3972 #undef MHZ_TO_HZ
3973 
3974 	return 0;
3975 
3976 disable_clk_core:
3977 	clk_disable_unprepare(dev->clk_core);
3978 
3979 	return err;
3980 }
3981 
3982 static int allegro_runtime_suspend(struct device *device)
3983 {
3984 	struct allegro_dev *dev = dev_get_drvdata(device);
3985 
3986 	clk_disable_unprepare(dev->clk_mcu);
3987 	clk_disable_unprepare(dev->clk_core);
3988 
3989 	return 0;
3990 }
3991 
3992 static const struct of_device_id allegro_dt_ids[] = {
3993 	{ .compatible = "allegro,al5e-1.1" },
3994 	{ /* sentinel */ }
3995 };
3996 
3997 MODULE_DEVICE_TABLE(of, allegro_dt_ids);
3998 
3999 static const struct dev_pm_ops allegro_pm_ops = {
4000 	.runtime_resume = allegro_runtime_resume,
4001 	.runtime_suspend = allegro_runtime_suspend,
4002 };
4003 
4004 static struct platform_driver allegro_driver = {
4005 	.probe = allegro_probe,
4006 	.remove_new = allegro_remove,
4007 	.driver = {
4008 		.name = "allegro",
4009 		.of_match_table = allegro_dt_ids,
4010 		.pm = &allegro_pm_ops,
4011 	},
4012 };
4013 
4014 module_platform_driver(allegro_driver);
4015 
4016 MODULE_LICENSE("GPL");
4017 MODULE_AUTHOR("Michael Tretter <kernel@pengutronix.de>");
4018 MODULE_DESCRIPTION("Allegro DVT encoder driver");
4019