brintos

brintos / linux-shallow public Read only

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