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