Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (C) 2019 Pengutronix, Michael Tretter <kernel@pengutronix.de>
0004  *
0005  * Allegro DVT video encoder driver
0006  */
0007 
0008 #include <linux/bits.h>
0009 #include <linux/clk.h>
0010 #include <linux/firmware.h>
0011 #include <linux/gcd.h>
0012 #include <linux/interrupt.h>
0013 #include <linux/io.h>
0014 #include <linux/kernel.h>
0015 #include <linux/log2.h>
0016 #include <linux/mfd/syscon.h>
0017 #include <linux/mfd/syscon/xlnx-vcu.h>
0018 #include <linux/module.h>
0019 #include <linux/of.h>
0020 #include <linux/of_device.h>
0021 #include <linux/platform_device.h>
0022 #include <linux/pm_runtime.h>
0023 #include <linux/regmap.h>
0024 #include <linux/sizes.h>
0025 #include <linux/slab.h>
0026 #include <linux/videodev2.h>
0027 #include <media/v4l2-ctrls.h>
0028 #include <media/v4l2-device.h>
0029 #include <media/v4l2-event.h>
0030 #include <media/v4l2-ioctl.h>
0031 #include <media/v4l2-mem2mem.h>
0032 #include <media/videobuf2-dma-contig.h>
0033 #include <media/videobuf2-v4l2.h>
0034 
0035 #include "allegro-mail.h"
0036 #include "nal-h264.h"
0037 #include "nal-hevc.h"
0038 
0039 /*
0040  * Support up to 4k video streams. The hardware actually supports higher
0041  * resolutions, which are specified in PG252 June 6, 2018 (H.264/H.265 Video
0042  * Codec Unit v1.1) Chapter 3.
0043  */
0044 #define ALLEGRO_WIDTH_MIN 128
0045 #define ALLEGRO_WIDTH_DEFAULT 1920
0046 #define ALLEGRO_WIDTH_MAX 3840
0047 #define ALLEGRO_HEIGHT_MIN 64
0048 #define ALLEGRO_HEIGHT_DEFAULT 1080
0049 #define ALLEGRO_HEIGHT_MAX 2160
0050 
0051 #define ALLEGRO_FRAMERATE_DEFAULT ((struct v4l2_fract) { 30, 1 })
0052 
0053 #define ALLEGRO_GOP_SIZE_DEFAULT 25
0054 #define ALLEGRO_GOP_SIZE_MAX 1000
0055 
0056 /*
0057  * MCU Control Registers
0058  *
0059  * The Zynq UltraScale+ Devices Register Reference documents the registers
0060  * with an offset of 0x9000, which equals the size of the SRAM and one page
0061  * gap. The driver handles SRAM and registers separately and, therefore, is
0062  * oblivious of the offset.
0063  */
0064 #define AL5_MCU_RESET                   0x0000
0065 #define AL5_MCU_RESET_SOFT              BIT(0)
0066 #define AL5_MCU_RESET_REGS              BIT(1)
0067 #define AL5_MCU_RESET_MODE              0x0004
0068 #define AL5_MCU_RESET_MODE_SLEEP        BIT(0)
0069 #define AL5_MCU_RESET_MODE_HALT         BIT(1)
0070 #define AL5_MCU_STA                     0x0008
0071 #define AL5_MCU_STA_SLEEP               BIT(0)
0072 #define AL5_MCU_WAKEUP                  0x000c
0073 
0074 #define AL5_ICACHE_ADDR_OFFSET_MSB      0x0010
0075 #define AL5_ICACHE_ADDR_OFFSET_LSB      0x0014
0076 #define AL5_DCACHE_ADDR_OFFSET_MSB      0x0018
0077 #define AL5_DCACHE_ADDR_OFFSET_LSB      0x001c
0078 
0079 #define AL5_MCU_INTERRUPT               0x0100
0080 #define AL5_ITC_CPU_IRQ_MSK             0x0104
0081 #define AL5_ITC_CPU_IRQ_CLR             0x0108
0082 #define AL5_ITC_CPU_IRQ_STA             0x010C
0083 #define AL5_ITC_CPU_IRQ_STA_TRIGGERED   BIT(0)
0084 
0085 #define AXI_ADDR_OFFSET_IP              0x0208
0086 
0087 /*
0088  * The MCU accesses the system memory with a 2G offset compared to CPU
0089  * physical addresses.
0090  */
0091 #define MCU_CACHE_OFFSET SZ_2G
0092 
0093 /*
0094  * The driver needs to reserve some space at the beginning of capture buffers,
0095  * because it needs to write SPS/PPS NAL units. The encoder writes the actual
0096  * frame data after the offset.
0097  */
0098 #define ENCODER_STREAM_OFFSET SZ_128
0099 
0100 #define SIZE_MACROBLOCK 16
0101 
0102 /* Encoding options */
0103 #define LOG2_MAX_FRAME_NUM      4
0104 #define LOG2_MAX_PIC_ORDER_CNT      10
0105 #define BETA_OFFSET_DIV_2       -1
0106 #define TC_OFFSET_DIV_2         -1
0107 
0108 /*
0109  * This control allows applications to explicitly disable the encoder buffer.
0110  * This value is Allegro specific.
0111  */
0112 #define V4L2_CID_USER_ALLEGRO_ENCODER_BUFFER (V4L2_CID_USER_ALLEGRO_BASE + 0)
0113 
0114 static int debug;
0115 module_param(debug, int, 0644);
0116 MODULE_PARM_DESC(debug, "Debug level (0-2)");
0117 
0118 struct allegro_buffer {
0119     void *vaddr;
0120     dma_addr_t paddr;
0121     size_t size;
0122     struct list_head head;
0123 };
0124 
0125 struct allegro_dev;
0126 struct allegro_channel;
0127 
0128 struct allegro_mbox {
0129     struct allegro_dev *dev;
0130     unsigned int head;
0131     unsigned int tail;
0132     unsigned int data;
0133     size_t size;
0134     /* protect mailbox from simultaneous accesses */
0135     struct mutex lock;
0136 };
0137 
0138 struct allegro_encoder_buffer {
0139     unsigned int size;
0140     unsigned int color_depth;
0141     unsigned int num_cores;
0142     unsigned int clk_rate;
0143 };
0144 
0145 struct allegro_dev {
0146     struct v4l2_device v4l2_dev;
0147     struct video_device video_dev;
0148     struct v4l2_m2m_dev *m2m_dev;
0149     struct platform_device *plat_dev;
0150 
0151     /* mutex protecting vb2_queue structure */
0152     struct mutex lock;
0153 
0154     struct regmap *regmap;
0155     struct regmap *sram;
0156     struct regmap *settings;
0157 
0158     struct clk *clk_core;
0159     struct clk *clk_mcu;
0160 
0161     const struct fw_info *fw_info;
0162     struct allegro_buffer firmware;
0163     struct allegro_buffer suballocator;
0164     bool has_encoder_buffer;
0165     struct allegro_encoder_buffer encoder_buffer;
0166 
0167     struct completion init_complete;
0168     bool initialized;
0169 
0170     /* The mailbox interface */
0171     struct allegro_mbox *mbox_command;
0172     struct allegro_mbox *mbox_status;
0173 
0174     /*
0175      * The downstream driver limits the users to 64 users, thus I can use
0176      * a bitfield for the user_ids that are in use. See also user_id in
0177      * struct allegro_channel.
0178      */
0179     unsigned long channel_user_ids;
0180     struct list_head channels;
0181 };
0182 
0183 static struct regmap_config allegro_regmap_config = {
0184     .name = "regmap",
0185     .reg_bits = 32,
0186     .val_bits = 32,
0187     .reg_stride = 4,
0188     .max_register = 0xfff,
0189     .cache_type = REGCACHE_NONE,
0190 };
0191 
0192 static struct regmap_config allegro_sram_config = {
0193     .name = "sram",
0194     .reg_bits = 32,
0195     .val_bits = 32,
0196     .reg_stride = 4,
0197     .max_register = 0x7fff,
0198     .cache_type = REGCACHE_NONE,
0199 };
0200 
0201 #define fh_to_channel(__fh) container_of(__fh, struct allegro_channel, fh)
0202 
0203 struct allegro_channel {
0204     struct allegro_dev *dev;
0205     struct v4l2_fh fh;
0206     struct v4l2_ctrl_handler ctrl_handler;
0207 
0208     unsigned int width;
0209     unsigned int height;
0210     unsigned int stride;
0211     struct v4l2_fract framerate;
0212 
0213     enum v4l2_colorspace colorspace;
0214     enum v4l2_ycbcr_encoding ycbcr_enc;
0215     enum v4l2_quantization quantization;
0216     enum v4l2_xfer_func xfer_func;
0217 
0218     u32 pixelformat;
0219     unsigned int sizeimage_raw;
0220     unsigned int osequence;
0221 
0222     u32 codec;
0223     unsigned int sizeimage_encoded;
0224     unsigned int csequence;
0225 
0226     bool frame_rc_enable;
0227     unsigned int bitrate;
0228     unsigned int bitrate_peak;
0229 
0230     struct allegro_buffer config_blob;
0231 
0232     unsigned int log2_max_frame_num;
0233     bool temporal_mvp_enable;
0234 
0235     bool enable_loop_filter_across_tiles;
0236     bool enable_loop_filter_across_slices;
0237     bool enable_deblocking_filter_override;
0238     bool enable_reordering;
0239     bool dbf_ovr_en;
0240 
0241     unsigned int num_ref_idx_l0;
0242     unsigned int num_ref_idx_l1;
0243 
0244     /* Maximum range for motion estimation */
0245     int b_hrz_me_range;
0246     int b_vrt_me_range;
0247     int p_hrz_me_range;
0248     int p_vrt_me_range;
0249     /* Size limits of coding unit */
0250     int min_cu_size;
0251     int max_cu_size;
0252     /* Size limits of transform unit */
0253     int min_tu_size;
0254     int max_tu_size;
0255     int max_transfo_depth_intra;
0256     int max_transfo_depth_inter;
0257 
0258     struct v4l2_ctrl *mpeg_video_h264_profile;
0259     struct v4l2_ctrl *mpeg_video_h264_level;
0260     struct v4l2_ctrl *mpeg_video_h264_i_frame_qp;
0261     struct v4l2_ctrl *mpeg_video_h264_max_qp;
0262     struct v4l2_ctrl *mpeg_video_h264_min_qp;
0263     struct v4l2_ctrl *mpeg_video_h264_p_frame_qp;
0264     struct v4l2_ctrl *mpeg_video_h264_b_frame_qp;
0265 
0266     struct v4l2_ctrl *mpeg_video_hevc_profile;
0267     struct v4l2_ctrl *mpeg_video_hevc_level;
0268     struct v4l2_ctrl *mpeg_video_hevc_tier;
0269     struct v4l2_ctrl *mpeg_video_hevc_i_frame_qp;
0270     struct v4l2_ctrl *mpeg_video_hevc_max_qp;
0271     struct v4l2_ctrl *mpeg_video_hevc_min_qp;
0272     struct v4l2_ctrl *mpeg_video_hevc_p_frame_qp;
0273     struct v4l2_ctrl *mpeg_video_hevc_b_frame_qp;
0274 
0275     struct v4l2_ctrl *mpeg_video_frame_rc_enable;
0276     struct { /* video bitrate mode control cluster */
0277         struct v4l2_ctrl *mpeg_video_bitrate_mode;
0278         struct v4l2_ctrl *mpeg_video_bitrate;
0279         struct v4l2_ctrl *mpeg_video_bitrate_peak;
0280     };
0281     struct v4l2_ctrl *mpeg_video_cpb_size;
0282     struct v4l2_ctrl *mpeg_video_gop_size;
0283 
0284     struct v4l2_ctrl *encoder_buffer;
0285 
0286     /* user_id is used to identify the channel during CREATE_CHANNEL */
0287     /* not sure, what to set here and if this is actually required */
0288     int user_id;
0289     /* channel_id is set by the mcu and used by all later commands */
0290     int mcu_channel_id;
0291 
0292     struct list_head buffers_reference;
0293     struct list_head buffers_intermediate;
0294 
0295     struct list_head source_shadow_list;
0296     struct list_head stream_shadow_list;
0297     /* protect shadow lists of buffers passed to firmware */
0298     struct mutex shadow_list_lock;
0299 
0300     struct list_head list;
0301     struct completion completion;
0302 
0303     unsigned int error;
0304 };
0305 
0306 static inline int
0307 allegro_channel_get_i_frame_qp(struct allegro_channel *channel)
0308 {
0309     if (channel->codec == V4L2_PIX_FMT_HEVC)
0310         return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_i_frame_qp);
0311     else
0312         return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_i_frame_qp);
0313 }
0314 
0315 static inline int
0316 allegro_channel_get_p_frame_qp(struct allegro_channel *channel)
0317 {
0318     if (channel->codec == V4L2_PIX_FMT_HEVC)
0319         return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_p_frame_qp);
0320     else
0321         return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_p_frame_qp);
0322 }
0323 
0324 static inline int
0325 allegro_channel_get_b_frame_qp(struct allegro_channel *channel)
0326 {
0327     if (channel->codec == V4L2_PIX_FMT_HEVC)
0328         return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_b_frame_qp);
0329     else
0330         return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_b_frame_qp);
0331 }
0332 
0333 static inline int
0334 allegro_channel_get_min_qp(struct allegro_channel *channel)
0335 {
0336     if (channel->codec == V4L2_PIX_FMT_HEVC)
0337         return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_min_qp);
0338     else
0339         return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_min_qp);
0340 }
0341 
0342 static inline int
0343 allegro_channel_get_max_qp(struct allegro_channel *channel)
0344 {
0345     if (channel->codec == V4L2_PIX_FMT_HEVC)
0346         return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_max_qp);
0347     else
0348         return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_max_qp);
0349 }
0350 
0351 struct allegro_m2m_buffer {
0352     struct v4l2_m2m_buffer buf;
0353     struct list_head head;
0354 };
0355 
0356 #define to_allegro_m2m_buffer(__buf) \
0357     container_of(__buf, struct allegro_m2m_buffer, buf)
0358 
0359 struct fw_info {
0360     unsigned int id;
0361     unsigned int id_codec;
0362     char *version;
0363     unsigned int mailbox_cmd;
0364     unsigned int mailbox_status;
0365     size_t mailbox_size;
0366     enum mcu_msg_version mailbox_version;
0367     size_t suballocator_size;
0368 };
0369 
0370 static const struct fw_info supported_firmware[] = {
0371     {
0372         .id = 18296,
0373         .id_codec = 96272,
0374         .version = "v2018.2",
0375         .mailbox_cmd = 0x7800,
0376         .mailbox_status = 0x7c00,
0377         .mailbox_size = 0x400 - 0x8,
0378         .mailbox_version = MCU_MSG_VERSION_2018_2,
0379         .suballocator_size = SZ_16M,
0380     }, {
0381         .id = 14680,
0382         .id_codec = 126572,
0383         .version = "v2019.2",
0384         .mailbox_cmd = 0x7000,
0385         .mailbox_status = 0x7800,
0386         .mailbox_size = 0x800 - 0x8,
0387         .mailbox_version = MCU_MSG_VERSION_2019_2,
0388         .suballocator_size = SZ_32M,
0389     },
0390 };
0391 
0392 static inline u32 to_mcu_addr(struct allegro_dev *dev, dma_addr_t phys)
0393 {
0394     if (upper_32_bits(phys) || (lower_32_bits(phys) & MCU_CACHE_OFFSET))
0395         v4l2_warn(&dev->v4l2_dev,
0396               "address %pad is outside mcu window\n", &phys);
0397 
0398     return lower_32_bits(phys) | MCU_CACHE_OFFSET;
0399 }
0400 
0401 static inline u32 to_mcu_size(struct allegro_dev *dev, size_t size)
0402 {
0403     return lower_32_bits(size);
0404 }
0405 
0406 static inline u32 to_codec_addr(struct allegro_dev *dev, dma_addr_t phys)
0407 {
0408     if (upper_32_bits(phys))
0409         v4l2_warn(&dev->v4l2_dev,
0410               "address %pad cannot be used by codec\n", &phys);
0411 
0412     return lower_32_bits(phys);
0413 }
0414 
0415 static inline u64 ptr_to_u64(const void *ptr)
0416 {
0417     return (uintptr_t)ptr;
0418 }
0419 
0420 /* Helper functions for channel and user operations */
0421 
0422 static unsigned long allegro_next_user_id(struct allegro_dev *dev)
0423 {
0424     if (dev->channel_user_ids == ~0UL)
0425         return -EBUSY;
0426 
0427     return ffz(dev->channel_user_ids);
0428 }
0429 
0430 static struct allegro_channel *
0431 allegro_find_channel_by_user_id(struct allegro_dev *dev,
0432                 unsigned int user_id)
0433 {
0434     struct allegro_channel *channel;
0435 
0436     list_for_each_entry(channel, &dev->channels, list) {
0437         if (channel->user_id == user_id)
0438             return channel;
0439     }
0440 
0441     return ERR_PTR(-EINVAL);
0442 }
0443 
0444 static struct allegro_channel *
0445 allegro_find_channel_by_channel_id(struct allegro_dev *dev,
0446                    unsigned int channel_id)
0447 {
0448     struct allegro_channel *channel;
0449 
0450     list_for_each_entry(channel, &dev->channels, list) {
0451         if (channel->mcu_channel_id == channel_id)
0452             return channel;
0453     }
0454 
0455     return ERR_PTR(-EINVAL);
0456 }
0457 
0458 static inline bool channel_exists(struct allegro_channel *channel)
0459 {
0460     return channel->mcu_channel_id != -1;
0461 }
0462 
0463 #define AL_ERROR            0x80
0464 #define AL_ERR_INIT_FAILED      0x81
0465 #define AL_ERR_NO_FRAME_DECODED     0x82
0466 #define AL_ERR_RESOLUTION_CHANGE    0x85
0467 #define AL_ERR_NO_MEMORY        0x87
0468 #define AL_ERR_STREAM_OVERFLOW      0x88
0469 #define AL_ERR_TOO_MANY_SLICES      0x89
0470 #define AL_ERR_BUF_NOT_READY        0x8c
0471 #define AL_ERR_NO_CHANNEL_AVAILABLE 0x8d
0472 #define AL_ERR_RESOURCE_UNAVAILABLE 0x8e
0473 #define AL_ERR_NOT_ENOUGH_CORES     0x8f
0474 #define AL_ERR_REQUEST_MALFORMED    0x90
0475 #define AL_ERR_CMD_NOT_ALLOWED      0x91
0476 #define AL_ERR_INVALID_CMD_VALUE    0x92
0477 
0478 static inline const char *allegro_err_to_string(unsigned int err)
0479 {
0480     switch (err) {
0481     case AL_ERR_INIT_FAILED:
0482         return "initialization failed";
0483     case AL_ERR_NO_FRAME_DECODED:
0484         return "no frame decoded";
0485     case AL_ERR_RESOLUTION_CHANGE:
0486         return "resolution change";
0487     case AL_ERR_NO_MEMORY:
0488         return "out of memory";
0489     case AL_ERR_STREAM_OVERFLOW:
0490         return "stream buffer overflow";
0491     case AL_ERR_TOO_MANY_SLICES:
0492         return "too many slices";
0493     case AL_ERR_BUF_NOT_READY:
0494         return "buffer not ready";
0495     case AL_ERR_NO_CHANNEL_AVAILABLE:
0496         return "no channel available";
0497     case AL_ERR_RESOURCE_UNAVAILABLE:
0498         return "resource unavailable";
0499     case AL_ERR_NOT_ENOUGH_CORES:
0500         return "not enough cores";
0501     case AL_ERR_REQUEST_MALFORMED:
0502         return "request malformed";
0503     case AL_ERR_CMD_NOT_ALLOWED:
0504         return "command not allowed";
0505     case AL_ERR_INVALID_CMD_VALUE:
0506         return "invalid command value";
0507     case AL_ERROR:
0508     default:
0509         return "unknown error";
0510     }
0511 }
0512 
0513 static unsigned int estimate_stream_size(unsigned int width,
0514                      unsigned int height)
0515 {
0516     unsigned int offset = ENCODER_STREAM_OFFSET;
0517     unsigned int num_blocks = DIV_ROUND_UP(width, SIZE_MACROBLOCK) *
0518                     DIV_ROUND_UP(height, SIZE_MACROBLOCK);
0519     unsigned int pcm_size = SZ_256;
0520     unsigned int partition_table = SZ_256;
0521 
0522     return round_up(offset + num_blocks * pcm_size + partition_table, 32);
0523 }
0524 
0525 static enum v4l2_mpeg_video_h264_level
0526 select_minimum_h264_level(unsigned int width, unsigned int height)
0527 {
0528     unsigned int pic_width_in_mb = DIV_ROUND_UP(width, SIZE_MACROBLOCK);
0529     unsigned int frame_height_in_mb = DIV_ROUND_UP(height, SIZE_MACROBLOCK);
0530     unsigned int frame_size_in_mb = pic_width_in_mb * frame_height_in_mb;
0531     enum v4l2_mpeg_video_h264_level level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
0532 
0533     /*
0534      * The level limits are specified in Rec. ITU-T H.264 Annex A.3.1 and
0535      * also specify limits regarding bit rate and CBP size. Only approximate
0536      * the levels using the frame size.
0537      *
0538      * Level 5.1 allows up to 4k video resolution.
0539      */
0540     if (frame_size_in_mb <= 99)
0541         level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0;
0542     else if (frame_size_in_mb <= 396)
0543         level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1;
0544     else if (frame_size_in_mb <= 792)
0545         level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1;
0546     else if (frame_size_in_mb <= 1620)
0547         level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2;
0548     else if (frame_size_in_mb <= 3600)
0549         level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1;
0550     else if (frame_size_in_mb <= 5120)
0551         level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2;
0552     else if (frame_size_in_mb <= 8192)
0553         level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0;
0554     else if (frame_size_in_mb <= 8704)
0555         level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2;
0556     else if (frame_size_in_mb <= 22080)
0557         level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0;
0558     else
0559         level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1;
0560 
0561     return level;
0562 }
0563 
0564 static unsigned int h264_maximum_bitrate(enum v4l2_mpeg_video_h264_level level)
0565 {
0566     switch (level) {
0567     case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
0568         return 64000;
0569     case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
0570         return 128000;
0571     case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
0572         return 192000;
0573     case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
0574         return 384000;
0575     case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
0576         return 768000;
0577     case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
0578         return 2000000;
0579     case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
0580         return 4000000;
0581     case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
0582         return 4000000;
0583     case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
0584         return 10000000;
0585     case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
0586         return 14000000;
0587     case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
0588         return 20000000;
0589     case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
0590         return 20000000;
0591     case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
0592         return 50000000;
0593     case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
0594         return 50000000;
0595     case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
0596         return 135000000;
0597     case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
0598     default:
0599         return 240000000;
0600     }
0601 }
0602 
0603 static unsigned int h264_maximum_cpb_size(enum v4l2_mpeg_video_h264_level level)
0604 {
0605     switch (level) {
0606     case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
0607         return 175;
0608     case V4L2_MPEG_VIDEO_H264_LEVEL_1B:
0609         return 350;
0610     case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
0611         return 500;
0612     case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
0613         return 1000;
0614     case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
0615         return 2000;
0616     case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
0617         return 2000;
0618     case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
0619         return 4000;
0620     case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
0621         return 4000;
0622     case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
0623         return 10000;
0624     case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
0625         return 14000;
0626     case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
0627         return 20000;
0628     case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
0629         return 25000;
0630     case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
0631         return 62500;
0632     case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
0633         return 62500;
0634     case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
0635         return 135000;
0636     case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
0637     default:
0638         return 240000;
0639     }
0640 }
0641 
0642 static enum v4l2_mpeg_video_hevc_level
0643 select_minimum_hevc_level(unsigned int width, unsigned int height)
0644 {
0645     unsigned int luma_picture_size = width * height;
0646     enum v4l2_mpeg_video_hevc_level level;
0647 
0648     if (luma_picture_size <= 36864)
0649         level = V4L2_MPEG_VIDEO_HEVC_LEVEL_1;
0650     else if (luma_picture_size <= 122880)
0651         level = V4L2_MPEG_VIDEO_HEVC_LEVEL_2;
0652     else if (luma_picture_size <= 245760)
0653         level = V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1;
0654     else if (luma_picture_size <= 552960)
0655         level = V4L2_MPEG_VIDEO_HEVC_LEVEL_3;
0656     else if (luma_picture_size <= 983040)
0657         level = V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1;
0658     else if (luma_picture_size <= 2228224)
0659         level = V4L2_MPEG_VIDEO_HEVC_LEVEL_4;
0660     else if (luma_picture_size <= 8912896)
0661         level = V4L2_MPEG_VIDEO_HEVC_LEVEL_5;
0662     else
0663         level = V4L2_MPEG_VIDEO_HEVC_LEVEL_6;
0664 
0665     return level;
0666 }
0667 
0668 static unsigned int hevc_maximum_bitrate(enum v4l2_mpeg_video_hevc_level level)
0669 {
0670     /*
0671      * See Rec. ITU-T H.265 v5 (02/2018), A.4.2 Profile-specific level
0672      * limits for the video profiles.
0673      */
0674     switch (level) {
0675     case V4L2_MPEG_VIDEO_HEVC_LEVEL_1:
0676         return 128;
0677     case V4L2_MPEG_VIDEO_HEVC_LEVEL_2:
0678         return 1500;
0679     case V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1:
0680         return 3000;
0681     case V4L2_MPEG_VIDEO_HEVC_LEVEL_3:
0682         return 6000;
0683     case V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1:
0684         return 10000;
0685     case V4L2_MPEG_VIDEO_HEVC_LEVEL_4:
0686         return 12000;
0687     case V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1:
0688         return 20000;
0689     case V4L2_MPEG_VIDEO_HEVC_LEVEL_5:
0690         return 25000;
0691     default:
0692     case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1:
0693         return 40000;
0694     }
0695 }
0696 
0697 static unsigned int hevc_maximum_cpb_size(enum v4l2_mpeg_video_hevc_level level)
0698 {
0699     switch (level) {
0700     case V4L2_MPEG_VIDEO_HEVC_LEVEL_1:
0701         return 350;
0702     case V4L2_MPEG_VIDEO_HEVC_LEVEL_2:
0703         return 1500;
0704     case V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1:
0705         return 3000;
0706     case V4L2_MPEG_VIDEO_HEVC_LEVEL_3:
0707         return 6000;
0708     case V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1:
0709         return 10000;
0710     case V4L2_MPEG_VIDEO_HEVC_LEVEL_4:
0711         return 12000;
0712     case V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1:
0713         return 20000;
0714     case V4L2_MPEG_VIDEO_HEVC_LEVEL_5:
0715         return 25000;
0716     default:
0717     case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1:
0718         return 40000;
0719     }
0720 }
0721 
0722 static const struct fw_info *
0723 allegro_get_firmware_info(struct allegro_dev *dev,
0724               const struct firmware *fw,
0725               const struct firmware *fw_codec)
0726 {
0727     int i;
0728     unsigned int id = fw->size;
0729     unsigned int id_codec = fw_codec->size;
0730 
0731     for (i = 0; i < ARRAY_SIZE(supported_firmware); i++)
0732         if (supported_firmware[i].id == id &&
0733             supported_firmware[i].id_codec == id_codec)
0734             return &supported_firmware[i];
0735 
0736     return NULL;
0737 }
0738 
0739 /*
0740  * Buffers that are used internally by the MCU.
0741  */
0742 
0743 static int allegro_alloc_buffer(struct allegro_dev *dev,
0744                 struct allegro_buffer *buffer, size_t size)
0745 {
0746     buffer->vaddr = dma_alloc_coherent(&dev->plat_dev->dev, size,
0747                        &buffer->paddr, GFP_KERNEL);
0748     if (!buffer->vaddr)
0749         return -ENOMEM;
0750     buffer->size = size;
0751 
0752     return 0;
0753 }
0754 
0755 static void allegro_free_buffer(struct allegro_dev *dev,
0756                 struct allegro_buffer *buffer)
0757 {
0758     if (buffer->vaddr) {
0759         dma_free_coherent(&dev->plat_dev->dev, buffer->size,
0760                   buffer->vaddr, buffer->paddr);
0761         buffer->vaddr = NULL;
0762         buffer->size = 0;
0763     }
0764 }
0765 
0766 /*
0767  * Mailbox interface to send messages to the MCU.
0768  */
0769 
0770 static void allegro_mcu_interrupt(struct allegro_dev *dev);
0771 static void allegro_handle_message(struct allegro_dev *dev,
0772                    union mcu_msg_response *msg);
0773 
0774 static struct allegro_mbox *allegro_mbox_init(struct allegro_dev *dev,
0775                           unsigned int base, size_t size)
0776 {
0777     struct allegro_mbox *mbox;
0778 
0779     mbox = devm_kmalloc(&dev->plat_dev->dev, sizeof(*mbox), GFP_KERNEL);
0780     if (!mbox)
0781         return ERR_PTR(-ENOMEM);
0782 
0783     mbox->dev = dev;
0784 
0785     mbox->head = base;
0786     mbox->tail = base + 0x4;
0787     mbox->data = base + 0x8;
0788     mbox->size = size;
0789     mutex_init(&mbox->lock);
0790 
0791     regmap_write(dev->sram, mbox->head, 0);
0792     regmap_write(dev->sram, mbox->tail, 0);
0793 
0794     return mbox;
0795 }
0796 
0797 static int allegro_mbox_write(struct allegro_mbox *mbox,
0798                   const u32 *src, size_t size)
0799 {
0800     struct regmap *sram = mbox->dev->sram;
0801     unsigned int tail;
0802     size_t size_no_wrap;
0803     int err = 0;
0804     int stride = regmap_get_reg_stride(sram);
0805 
0806     if (!src)
0807         return -EINVAL;
0808 
0809     if (size > mbox->size)
0810         return -EINVAL;
0811 
0812     mutex_lock(&mbox->lock);
0813     regmap_read(sram, mbox->tail, &tail);
0814     if (tail > mbox->size) {
0815         err = -EIO;
0816         goto out;
0817     }
0818     size_no_wrap = min(size, mbox->size - (size_t)tail);
0819     regmap_bulk_write(sram, mbox->data + tail,
0820               src, size_no_wrap / stride);
0821     regmap_bulk_write(sram, mbox->data,
0822               src + (size_no_wrap / sizeof(*src)),
0823               (size - size_no_wrap) / stride);
0824     regmap_write(sram, mbox->tail, (tail + size) % mbox->size);
0825 
0826 out:
0827     mutex_unlock(&mbox->lock);
0828 
0829     return err;
0830 }
0831 
0832 static ssize_t allegro_mbox_read(struct allegro_mbox *mbox,
0833                  u32 *dst, size_t nbyte)
0834 {
0835     struct {
0836         u16 length;
0837         u16 type;
0838     } __attribute__ ((__packed__)) *header;
0839     struct regmap *sram = mbox->dev->sram;
0840     unsigned int head;
0841     ssize_t size;
0842     size_t body_no_wrap;
0843     int stride = regmap_get_reg_stride(sram);
0844 
0845     regmap_read(sram, mbox->head, &head);
0846     if (head > mbox->size)
0847         return -EIO;
0848 
0849     /* Assume that the header does not wrap. */
0850     regmap_bulk_read(sram, mbox->data + head,
0851              dst, sizeof(*header) / stride);
0852     header = (void *)dst;
0853     size = header->length + sizeof(*header);
0854     if (size > mbox->size || size & 0x3)
0855         return -EIO;
0856     if (size > nbyte)
0857         return -EINVAL;
0858 
0859     /*
0860      * The message might wrap within the mailbox. If the message does not
0861      * wrap, the first read will read the entire message, otherwise the
0862      * first read will read message until the end of the mailbox and the
0863      * second read will read the remaining bytes from the beginning of the
0864      * mailbox.
0865      *
0866      * Skip the header, as was already read to get the size of the body.
0867      */
0868     body_no_wrap = min((size_t)header->length,
0869                (size_t)(mbox->size - (head + sizeof(*header))));
0870     regmap_bulk_read(sram, mbox->data + head + sizeof(*header),
0871              dst + (sizeof(*header) / sizeof(*dst)),
0872              body_no_wrap / stride);
0873     regmap_bulk_read(sram, mbox->data,
0874              dst + (sizeof(*header) + body_no_wrap) / sizeof(*dst),
0875              (header->length - body_no_wrap) / stride);
0876 
0877     regmap_write(sram, mbox->head, (head + size) % mbox->size);
0878 
0879     return size;
0880 }
0881 
0882 /**
0883  * allegro_mbox_send() - Send a message via the mailbox
0884  * @mbox: the mailbox which is used to send the message
0885  * @msg: the message to send
0886  */
0887 static int allegro_mbox_send(struct allegro_mbox *mbox, void *msg)
0888 {
0889     struct allegro_dev *dev = mbox->dev;
0890     ssize_t size;
0891     int err;
0892     u32 *tmp;
0893 
0894     tmp = kzalloc(mbox->size, GFP_KERNEL);
0895     if (!tmp) {
0896         err = -ENOMEM;
0897         goto out;
0898     }
0899 
0900     size = allegro_encode_mail(tmp, msg);
0901 
0902     err = allegro_mbox_write(mbox, tmp, size);
0903     kfree(tmp);
0904     if (err)
0905         goto out;
0906 
0907     allegro_mcu_interrupt(dev);
0908 
0909 out:
0910     return err;
0911 }
0912 
0913 /**
0914  * allegro_mbox_notify() - Notify the mailbox about a new message
0915  * @mbox: The allegro_mbox to notify
0916  */
0917 static void allegro_mbox_notify(struct allegro_mbox *mbox)
0918 {
0919     struct allegro_dev *dev = mbox->dev;
0920     union mcu_msg_response *msg;
0921     ssize_t size;
0922     u32 *tmp;
0923     int err;
0924 
0925     msg = kmalloc(sizeof(*msg), GFP_KERNEL);
0926     if (!msg)
0927         return;
0928 
0929     msg->header.version = dev->fw_info->mailbox_version;
0930 
0931     tmp = kmalloc(mbox->size, GFP_KERNEL);
0932     if (!tmp)
0933         goto out;
0934 
0935     size = allegro_mbox_read(mbox, tmp, mbox->size);
0936     if (size < 0)
0937         goto out;
0938 
0939     err = allegro_decode_mail(msg, tmp);
0940     if (err)
0941         goto out;
0942 
0943     allegro_handle_message(dev, msg);
0944 
0945 out:
0946     kfree(tmp);
0947     kfree(msg);
0948 }
0949 
0950 static int allegro_encoder_buffer_init(struct allegro_dev *dev,
0951                        struct allegro_encoder_buffer *buffer)
0952 {
0953     int err;
0954     struct regmap *settings = dev->settings;
0955     unsigned int supports_10_bit;
0956     unsigned int memory_depth;
0957     unsigned int num_cores;
0958     unsigned int color_depth;
0959     unsigned long clk_rate;
0960 
0961     /* We don't support the encoder buffer pre Firmware version 2019.2 */
0962     if (dev->fw_info->mailbox_version < MCU_MSG_VERSION_2019_2)
0963         return -ENODEV;
0964 
0965     if (!settings)
0966         return -EINVAL;
0967 
0968     err = regmap_read(settings, VCU_ENC_COLOR_DEPTH, &supports_10_bit);
0969     if (err < 0)
0970         return err;
0971     err = regmap_read(settings, VCU_MEMORY_DEPTH, &memory_depth);
0972     if (err < 0)
0973         return err;
0974     err = regmap_read(settings, VCU_NUM_CORE, &num_cores);
0975     if (err < 0)
0976         return err;
0977 
0978     clk_rate = clk_get_rate(dev->clk_core);
0979     if (clk_rate == 0)
0980         return -EINVAL;
0981 
0982     color_depth = supports_10_bit ? 10 : 8;
0983     /* The firmware expects the encoder buffer size in bits. */
0984     buffer->size = color_depth * 32 * memory_depth;
0985     buffer->color_depth = color_depth;
0986     buffer->num_cores = num_cores;
0987     buffer->clk_rate = clk_rate;
0988 
0989     v4l2_dbg(1, debug, &dev->v4l2_dev,
0990          "using %d bits encoder buffer with %d-bit color depth\n",
0991          buffer->size, color_depth);
0992 
0993     return 0;
0994 }
0995 
0996 static void allegro_mcu_send_init(struct allegro_dev *dev,
0997                   dma_addr_t suballoc_dma, size_t suballoc_size)
0998 {
0999     struct mcu_msg_init_request msg;
1000 
1001     memset(&msg, 0, sizeof(msg));
1002 
1003     msg.header.type = MCU_MSG_TYPE_INIT;
1004     msg.header.version = dev->fw_info->mailbox_version;
1005 
1006     msg.suballoc_dma = to_mcu_addr(dev, suballoc_dma);
1007     msg.suballoc_size = to_mcu_size(dev, suballoc_size);
1008 
1009     if (dev->has_encoder_buffer) {
1010         msg.encoder_buffer_size = dev->encoder_buffer.size;
1011         msg.encoder_buffer_color_depth = dev->encoder_buffer.color_depth;
1012         msg.num_cores = dev->encoder_buffer.num_cores;
1013         msg.clk_rate = dev->encoder_buffer.clk_rate;
1014     } else {
1015         msg.encoder_buffer_size = -1;
1016         msg.encoder_buffer_color_depth = -1;
1017         msg.num_cores = -1;
1018         msg.clk_rate = -1;
1019     }
1020 
1021     allegro_mbox_send(dev->mbox_command, &msg);
1022 }
1023 
1024 static u32 v4l2_pixelformat_to_mcu_format(u32 pixelformat)
1025 {
1026     switch (pixelformat) {
1027     case V4L2_PIX_FMT_NV12:
1028         /* AL_420_8BITS: 0x100 -> NV12, 0x88 -> 8 bit */
1029         return 0x100 | 0x88;
1030     default:
1031         return -EINVAL;
1032     }
1033 }
1034 
1035 static u32 v4l2_colorspace_to_mcu_colorspace(enum v4l2_colorspace colorspace)
1036 {
1037     switch (colorspace) {
1038     case V4L2_COLORSPACE_REC709:
1039         return 2;
1040     case V4L2_COLORSPACE_SMPTE170M:
1041         return 3;
1042     case V4L2_COLORSPACE_SMPTE240M:
1043         return 4;
1044     case V4L2_COLORSPACE_SRGB:
1045         return 7;
1046     default:
1047         /* UNKNOWN */
1048         return 0;
1049     }
1050 }
1051 
1052 static u8 v4l2_profile_to_mcu_profile(enum v4l2_mpeg_video_h264_profile profile)
1053 {
1054     switch (profile) {
1055     case V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE:
1056     default:
1057         return 66;
1058     }
1059 }
1060 
1061 static u16 v4l2_level_to_mcu_level(enum v4l2_mpeg_video_h264_level level)
1062 {
1063     switch (level) {
1064     case V4L2_MPEG_VIDEO_H264_LEVEL_1_0:
1065         return 10;
1066     case V4L2_MPEG_VIDEO_H264_LEVEL_1_1:
1067         return 11;
1068     case V4L2_MPEG_VIDEO_H264_LEVEL_1_2:
1069         return 12;
1070     case V4L2_MPEG_VIDEO_H264_LEVEL_1_3:
1071         return 13;
1072     case V4L2_MPEG_VIDEO_H264_LEVEL_2_0:
1073         return 20;
1074     case V4L2_MPEG_VIDEO_H264_LEVEL_2_1:
1075         return 21;
1076     case V4L2_MPEG_VIDEO_H264_LEVEL_2_2:
1077         return 22;
1078     case V4L2_MPEG_VIDEO_H264_LEVEL_3_0:
1079         return 30;
1080     case V4L2_MPEG_VIDEO_H264_LEVEL_3_1:
1081         return 31;
1082     case V4L2_MPEG_VIDEO_H264_LEVEL_3_2:
1083         return 32;
1084     case V4L2_MPEG_VIDEO_H264_LEVEL_4_0:
1085         return 40;
1086     case V4L2_MPEG_VIDEO_H264_LEVEL_4_1:
1087         return 41;
1088     case V4L2_MPEG_VIDEO_H264_LEVEL_4_2:
1089         return 42;
1090     case V4L2_MPEG_VIDEO_H264_LEVEL_5_0:
1091         return 50;
1092     case V4L2_MPEG_VIDEO_H264_LEVEL_5_1:
1093     default:
1094         return 51;
1095     }
1096 }
1097 
1098 static u8 hevc_profile_to_mcu_profile(enum v4l2_mpeg_video_hevc_profile profile)
1099 {
1100     switch (profile) {
1101     default:
1102     case V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN:
1103         return 1;
1104     case V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10:
1105         return 2;
1106     case V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE:
1107         return 3;
1108     }
1109 }
1110 
1111 static u16 hevc_level_to_mcu_level(enum v4l2_mpeg_video_hevc_level level)
1112 {
1113     switch (level) {
1114     case V4L2_MPEG_VIDEO_HEVC_LEVEL_1:
1115         return 10;
1116     case V4L2_MPEG_VIDEO_HEVC_LEVEL_2:
1117         return 20;
1118     case V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1:
1119         return 21;
1120     case V4L2_MPEG_VIDEO_HEVC_LEVEL_3:
1121         return 30;
1122     case V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1:
1123         return 31;
1124     case V4L2_MPEG_VIDEO_HEVC_LEVEL_4:
1125         return 40;
1126     case V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1:
1127         return 41;
1128     case V4L2_MPEG_VIDEO_HEVC_LEVEL_5:
1129         return 50;
1130     default:
1131     case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1:
1132         return 51;
1133     }
1134 }
1135 
1136 static u8 hevc_tier_to_mcu_tier(enum v4l2_mpeg_video_hevc_tier tier)
1137 {
1138     switch (tier) {
1139     default:
1140     case V4L2_MPEG_VIDEO_HEVC_TIER_MAIN:
1141         return 0;
1142     case V4L2_MPEG_VIDEO_HEVC_TIER_HIGH:
1143         return 1;
1144     }
1145 }
1146 
1147 static u32
1148 v4l2_bitrate_mode_to_mcu_mode(enum v4l2_mpeg_video_bitrate_mode mode)
1149 {
1150     switch (mode) {
1151     case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR:
1152         return 2;
1153     case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR:
1154     default:
1155         return 1;
1156     }
1157 }
1158 
1159 static u32 v4l2_cpb_size_to_mcu(unsigned int cpb_size, unsigned int bitrate)
1160 {
1161     unsigned int cpb_size_kbit;
1162     unsigned int bitrate_kbps;
1163 
1164     /*
1165      * The mcu expects the CPB size in units of a 90 kHz clock, but the
1166      * channel follows the V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE and stores
1167      * the CPB size in kilobytes.
1168      */
1169     cpb_size_kbit = cpb_size * BITS_PER_BYTE;
1170     bitrate_kbps = bitrate / 1000;
1171 
1172     return (cpb_size_kbit * 90000) / bitrate_kbps;
1173 }
1174 
1175 static s16 get_qp_delta(int minuend, int subtrahend)
1176 {
1177     if (minuend == subtrahend)
1178         return -1;
1179     else
1180         return minuend - subtrahend;
1181 }
1182 
1183 static u32 allegro_channel_get_entropy_mode(struct allegro_channel *channel)
1184 {
1185 #define ALLEGRO_ENTROPY_MODE_CAVLC 0
1186 #define ALLEGRO_ENTROPY_MODE_CABAC 1
1187 
1188     /* HEVC always uses CABAC, but this has to be explicitly set */
1189     if (channel->codec == V4L2_PIX_FMT_HEVC)
1190         return ALLEGRO_ENTROPY_MODE_CABAC;
1191 
1192     return ALLEGRO_ENTROPY_MODE_CAVLC;
1193 }
1194 
1195 static int fill_create_channel_param(struct allegro_channel *channel,
1196                      struct create_channel_param *param)
1197 {
1198     int i_frame_qp = allegro_channel_get_i_frame_qp(channel);
1199     int p_frame_qp = allegro_channel_get_p_frame_qp(channel);
1200     int b_frame_qp = allegro_channel_get_b_frame_qp(channel);
1201     int bitrate_mode = v4l2_ctrl_g_ctrl(channel->mpeg_video_bitrate_mode);
1202     unsigned int cpb_size = v4l2_ctrl_g_ctrl(channel->mpeg_video_cpb_size);
1203 
1204     param->width = channel->width;
1205     param->height = channel->height;
1206     param->format = v4l2_pixelformat_to_mcu_format(channel->pixelformat);
1207     param->colorspace =
1208         v4l2_colorspace_to_mcu_colorspace(channel->colorspace);
1209     param->src_mode = 0x0;
1210 
1211     param->codec = channel->codec;
1212     if (channel->codec == V4L2_PIX_FMT_H264) {
1213         enum v4l2_mpeg_video_h264_profile profile;
1214         enum v4l2_mpeg_video_h264_level level;
1215 
1216         profile = v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_profile);
1217         level = v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_level);
1218 
1219         param->profile = v4l2_profile_to_mcu_profile(profile);
1220         param->constraint_set_flags = BIT(1);
1221         param->level = v4l2_level_to_mcu_level(level);
1222     } else {
1223         enum v4l2_mpeg_video_hevc_profile profile;
1224         enum v4l2_mpeg_video_hevc_level level;
1225         enum v4l2_mpeg_video_hevc_tier tier;
1226 
1227         profile = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_profile);
1228         level = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_level);
1229         tier = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_tier);
1230 
1231         param->profile = hevc_profile_to_mcu_profile(profile);
1232         param->level = hevc_level_to_mcu_level(level);
1233         param->tier = hevc_tier_to_mcu_tier(tier);
1234     }
1235 
1236     param->log2_max_poc = LOG2_MAX_PIC_ORDER_CNT;
1237     param->log2_max_frame_num = channel->log2_max_frame_num;
1238     param->temporal_mvp_enable = channel->temporal_mvp_enable;
1239 
1240     param->dbf_ovr_en = channel->dbf_ovr_en;
1241     param->override_lf = channel->enable_deblocking_filter_override;
1242     param->enable_reordering = channel->enable_reordering;
1243     param->entropy_mode = allegro_channel_get_entropy_mode(channel);
1244     param->rdo_cost_mode = 1;
1245     param->custom_lda = 1;
1246     param->lf = 1;
1247     param->lf_x_tile = channel->enable_loop_filter_across_tiles;
1248     param->lf_x_slice = channel->enable_loop_filter_across_slices;
1249 
1250     param->src_bit_depth = 8;
1251 
1252     param->beta_offset = BETA_OFFSET_DIV_2;
1253     param->tc_offset = TC_OFFSET_DIV_2;
1254     param->num_slices = 1;
1255     param->me_range[0] = channel->b_hrz_me_range;
1256     param->me_range[1] = channel->b_vrt_me_range;
1257     param->me_range[2] = channel->p_hrz_me_range;
1258     param->me_range[3] = channel->p_vrt_me_range;
1259     param->max_cu_size = channel->max_cu_size;
1260     param->min_cu_size = channel->min_cu_size;
1261     param->max_tu_size = channel->max_tu_size;
1262     param->min_tu_size = channel->min_tu_size;
1263     param->max_transfo_depth_intra = channel->max_transfo_depth_intra;
1264     param->max_transfo_depth_inter = channel->max_transfo_depth_inter;
1265 
1266     param->encoder_buffer_enabled = v4l2_ctrl_g_ctrl(channel->encoder_buffer);
1267     param->encoder_buffer_offset = 0;
1268 
1269     param->rate_control_mode = channel->frame_rc_enable ?
1270         v4l2_bitrate_mode_to_mcu_mode(bitrate_mode) : 0;
1271 
1272     param->cpb_size = v4l2_cpb_size_to_mcu(cpb_size, channel->bitrate_peak);
1273     /* Shall be ]0;cpb_size in 90 kHz units]. Use maximum value. */
1274     param->initial_rem_delay = param->cpb_size;
1275     param->framerate = DIV_ROUND_UP(channel->framerate.numerator,
1276                     channel->framerate.denominator);
1277     param->clk_ratio = channel->framerate.denominator == 1001 ? 1001 : 1000;
1278     param->target_bitrate = channel->bitrate;
1279     param->max_bitrate = channel->bitrate_peak;
1280     param->initial_qp = i_frame_qp;
1281     param->min_qp = allegro_channel_get_min_qp(channel);
1282     param->max_qp = allegro_channel_get_max_qp(channel);
1283     param->ip_delta = get_qp_delta(i_frame_qp, p_frame_qp);
1284     param->pb_delta = get_qp_delta(p_frame_qp, b_frame_qp);
1285     param->golden_ref = 0;
1286     param->golden_delta = 2;
1287     param->golden_ref_frequency = 10;
1288     param->rate_control_option = 0x00000000;
1289 
1290     param->num_pixel = channel->width + channel->height;
1291     param->max_psnr = 4200;
1292     param->max_pixel_value = 255;
1293 
1294     param->gop_ctrl_mode = 0x00000002;
1295     param->freq_idr = v4l2_ctrl_g_ctrl(channel->mpeg_video_gop_size);
1296     param->freq_lt = 0;
1297     param->gdr_mode = 0x00000000;
1298     param->gop_length = v4l2_ctrl_g_ctrl(channel->mpeg_video_gop_size);
1299     param->subframe_latency = 0x00000000;
1300 
1301     param->lda_factors[0] = 51;
1302     param->lda_factors[1] = 90;
1303     param->lda_factors[2] = 151;
1304     param->lda_factors[3] = 151;
1305     param->lda_factors[4] = 151;
1306     param->lda_factors[5] = 151;
1307 
1308     param->max_num_merge_cand = 5;
1309 
1310     return 0;
1311 }
1312 
1313 static int allegro_mcu_send_create_channel(struct allegro_dev *dev,
1314                        struct allegro_channel *channel)
1315 {
1316     struct mcu_msg_create_channel msg;
1317     struct allegro_buffer *blob = &channel->config_blob;
1318     struct create_channel_param param;
1319     size_t size;
1320 
1321     memset(&param, 0, sizeof(param));
1322     fill_create_channel_param(channel, &param);
1323     allegro_alloc_buffer(dev, blob, sizeof(struct create_channel_param));
1324     param.version = dev->fw_info->mailbox_version;
1325     size = allegro_encode_config_blob(blob->vaddr, &param);
1326 
1327     memset(&msg, 0, sizeof(msg));
1328 
1329     msg.header.type = MCU_MSG_TYPE_CREATE_CHANNEL;
1330     msg.header.version = dev->fw_info->mailbox_version;
1331 
1332     msg.user_id = channel->user_id;
1333 
1334     msg.blob = blob->vaddr;
1335     msg.blob_size = size;
1336     msg.blob_mcu_addr = to_mcu_addr(dev, blob->paddr);
1337 
1338     allegro_mbox_send(dev->mbox_command, &msg);
1339 
1340     return 0;
1341 }
1342 
1343 static int allegro_mcu_send_destroy_channel(struct allegro_dev *dev,
1344                         struct allegro_channel *channel)
1345 {
1346     struct mcu_msg_destroy_channel msg;
1347 
1348     memset(&msg, 0, sizeof(msg));
1349 
1350     msg.header.type = MCU_MSG_TYPE_DESTROY_CHANNEL;
1351     msg.header.version = dev->fw_info->mailbox_version;
1352 
1353     msg.channel_id = channel->mcu_channel_id;
1354 
1355     allegro_mbox_send(dev->mbox_command, &msg);
1356 
1357     return 0;
1358 }
1359 
1360 static int allegro_mcu_send_put_stream_buffer(struct allegro_dev *dev,
1361                           struct allegro_channel *channel,
1362                           dma_addr_t paddr,
1363                           unsigned long size,
1364                           u64 dst_handle)
1365 {
1366     struct mcu_msg_put_stream_buffer msg;
1367 
1368     memset(&msg, 0, sizeof(msg));
1369 
1370     msg.header.type = MCU_MSG_TYPE_PUT_STREAM_BUFFER;
1371     msg.header.version = dev->fw_info->mailbox_version;
1372 
1373     msg.channel_id = channel->mcu_channel_id;
1374     msg.dma_addr = to_codec_addr(dev, paddr);
1375     msg.mcu_addr = to_mcu_addr(dev, paddr);
1376     msg.size = size;
1377     msg.offset = ENCODER_STREAM_OFFSET;
1378     /* copied to mcu_msg_encode_frame_response */
1379     msg.dst_handle = dst_handle;
1380 
1381     allegro_mbox_send(dev->mbox_command, &msg);
1382 
1383     return 0;
1384 }
1385 
1386 static int allegro_mcu_send_encode_frame(struct allegro_dev *dev,
1387                      struct allegro_channel *channel,
1388                      dma_addr_t src_y, dma_addr_t src_uv,
1389                      u64 src_handle)
1390 {
1391     struct mcu_msg_encode_frame msg;
1392     bool use_encoder_buffer = v4l2_ctrl_g_ctrl(channel->encoder_buffer);
1393 
1394     memset(&msg, 0, sizeof(msg));
1395 
1396     msg.header.type = MCU_MSG_TYPE_ENCODE_FRAME;
1397     msg.header.version = dev->fw_info->mailbox_version;
1398 
1399     msg.channel_id = channel->mcu_channel_id;
1400     msg.encoding_options = AL_OPT_FORCE_LOAD;
1401     if (use_encoder_buffer)
1402         msg.encoding_options |= AL_OPT_USE_L2;
1403     msg.pps_qp = 26; /* qp are relative to 26 */
1404     msg.user_param = 0; /* copied to mcu_msg_encode_frame_response */
1405     /* src_handle is copied to mcu_msg_encode_frame_response */
1406     msg.src_handle = src_handle;
1407     msg.src_y = to_codec_addr(dev, src_y);
1408     msg.src_uv = to_codec_addr(dev, src_uv);
1409     msg.stride = channel->stride;
1410 
1411     allegro_mbox_send(dev->mbox_command, &msg);
1412 
1413     return 0;
1414 }
1415 
1416 static int allegro_mcu_wait_for_init_timeout(struct allegro_dev *dev,
1417                          unsigned long timeout_ms)
1418 {
1419     unsigned long tmo;
1420 
1421     tmo = wait_for_completion_timeout(&dev->init_complete,
1422                       msecs_to_jiffies(timeout_ms));
1423     if (tmo == 0)
1424         return -ETIMEDOUT;
1425 
1426     reinit_completion(&dev->init_complete);
1427     return 0;
1428 }
1429 
1430 static int allegro_mcu_push_buffer_internal(struct allegro_channel *channel,
1431                         enum mcu_msg_type type)
1432 {
1433     struct allegro_dev *dev = channel->dev;
1434     struct mcu_msg_push_buffers_internal *msg;
1435     struct mcu_msg_push_buffers_internal_buffer *buffer;
1436     unsigned int num_buffers = 0;
1437     size_t size;
1438     struct allegro_buffer *al_buffer;
1439     struct list_head *list;
1440     int err;
1441 
1442     switch (type) {
1443     case MCU_MSG_TYPE_PUSH_BUFFER_REFERENCE:
1444         list = &channel->buffers_reference;
1445         break;
1446     case MCU_MSG_TYPE_PUSH_BUFFER_INTERMEDIATE:
1447         list = &channel->buffers_intermediate;
1448         break;
1449     default:
1450         return -EINVAL;
1451     }
1452 
1453     list_for_each_entry(al_buffer, list, head)
1454         num_buffers++;
1455     size = struct_size(msg, buffer, num_buffers);
1456 
1457     msg = kmalloc(size, GFP_KERNEL);
1458     if (!msg)
1459         return -ENOMEM;
1460 
1461     msg->header.type = type;
1462     msg->header.version = dev->fw_info->mailbox_version;
1463 
1464     msg->channel_id = channel->mcu_channel_id;
1465     msg->num_buffers = num_buffers;
1466 
1467     buffer = msg->buffer;
1468     list_for_each_entry(al_buffer, list, head) {
1469         buffer->dma_addr = to_codec_addr(dev, al_buffer->paddr);
1470         buffer->mcu_addr = to_mcu_addr(dev, al_buffer->paddr);
1471         buffer->size = to_mcu_size(dev, al_buffer->size);
1472         buffer++;
1473     }
1474 
1475     err = allegro_mbox_send(dev->mbox_command, msg);
1476 
1477     kfree(msg);
1478     return err;
1479 }
1480 
1481 static int allegro_mcu_push_buffer_intermediate(struct allegro_channel *channel)
1482 {
1483     enum mcu_msg_type type = MCU_MSG_TYPE_PUSH_BUFFER_INTERMEDIATE;
1484 
1485     return allegro_mcu_push_buffer_internal(channel, type);
1486 }
1487 
1488 static int allegro_mcu_push_buffer_reference(struct allegro_channel *channel)
1489 {
1490     enum mcu_msg_type type = MCU_MSG_TYPE_PUSH_BUFFER_REFERENCE;
1491 
1492     return allegro_mcu_push_buffer_internal(channel, type);
1493 }
1494 
1495 static int allocate_buffers_internal(struct allegro_channel *channel,
1496                      struct list_head *list,
1497                      size_t n, size_t size)
1498 {
1499     struct allegro_dev *dev = channel->dev;
1500     unsigned int i;
1501     int err;
1502     struct allegro_buffer *buffer, *tmp;
1503 
1504     for (i = 0; i < n; i++) {
1505         buffer = kmalloc(sizeof(*buffer), GFP_KERNEL);
1506         if (!buffer) {
1507             err = -ENOMEM;
1508             goto err;
1509         }
1510         INIT_LIST_HEAD(&buffer->head);
1511 
1512         err = allegro_alloc_buffer(dev, buffer, size);
1513         if (err)
1514             goto err;
1515         list_add(&buffer->head, list);
1516     }
1517 
1518     return 0;
1519 
1520 err:
1521     list_for_each_entry_safe(buffer, tmp, list, head) {
1522         list_del(&buffer->head);
1523         allegro_free_buffer(dev, buffer);
1524         kfree(buffer);
1525     }
1526     return err;
1527 }
1528 
1529 static void destroy_buffers_internal(struct allegro_channel *channel,
1530                      struct list_head *list)
1531 {
1532     struct allegro_dev *dev = channel->dev;
1533     struct allegro_buffer *buffer, *tmp;
1534 
1535     list_for_each_entry_safe(buffer, tmp, list, head) {
1536         list_del(&buffer->head);
1537         allegro_free_buffer(dev, buffer);
1538         kfree(buffer);
1539     }
1540 }
1541 
1542 static void destroy_reference_buffers(struct allegro_channel *channel)
1543 {
1544     return destroy_buffers_internal(channel, &channel->buffers_reference);
1545 }
1546 
1547 static void destroy_intermediate_buffers(struct allegro_channel *channel)
1548 {
1549     return destroy_buffers_internal(channel,
1550                     &channel->buffers_intermediate);
1551 }
1552 
1553 static int allocate_intermediate_buffers(struct allegro_channel *channel,
1554                      size_t n, size_t size)
1555 {
1556     return allocate_buffers_internal(channel,
1557                      &channel->buffers_intermediate,
1558                      n, size);
1559 }
1560 
1561 static int allocate_reference_buffers(struct allegro_channel *channel,
1562                       size_t n, size_t size)
1563 {
1564     return allocate_buffers_internal(channel,
1565                      &channel->buffers_reference,
1566                      n, PAGE_ALIGN(size));
1567 }
1568 
1569 static ssize_t allegro_h264_write_sps(struct allegro_channel *channel,
1570                       void *dest, size_t n)
1571 {
1572     struct allegro_dev *dev = channel->dev;
1573     struct nal_h264_sps *sps;
1574     ssize_t size;
1575     unsigned int size_mb = SIZE_MACROBLOCK;
1576     /* Calculation of crop units in Rec. ITU-T H.264 (04/2017) p. 76 */
1577     unsigned int crop_unit_x = 2;
1578     unsigned int crop_unit_y = 2;
1579     enum v4l2_mpeg_video_h264_profile profile;
1580     enum v4l2_mpeg_video_h264_level level;
1581     unsigned int cpb_size;
1582     unsigned int cpb_size_scale;
1583 
1584     sps = kzalloc(sizeof(*sps), GFP_KERNEL);
1585     if (!sps)
1586         return -ENOMEM;
1587 
1588     profile = v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_profile);
1589     level = v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_level);
1590 
1591     sps->profile_idc = nal_h264_profile(profile);
1592     sps->constraint_set0_flag = 0;
1593     sps->constraint_set1_flag = 1;
1594     sps->constraint_set2_flag = 0;
1595     sps->constraint_set3_flag = 0;
1596     sps->constraint_set4_flag = 0;
1597     sps->constraint_set5_flag = 0;
1598     sps->level_idc = nal_h264_level(level);
1599     sps->seq_parameter_set_id = 0;
1600     sps->log2_max_frame_num_minus4 = LOG2_MAX_FRAME_NUM - 4;
1601     sps->pic_order_cnt_type = 0;
1602     sps->log2_max_pic_order_cnt_lsb_minus4 = LOG2_MAX_PIC_ORDER_CNT - 4;
1603     sps->max_num_ref_frames = 3;
1604     sps->gaps_in_frame_num_value_allowed_flag = 0;
1605     sps->pic_width_in_mbs_minus1 =
1606         DIV_ROUND_UP(channel->width, size_mb) - 1;
1607     sps->pic_height_in_map_units_minus1 =
1608         DIV_ROUND_UP(channel->height, size_mb) - 1;
1609     sps->frame_mbs_only_flag = 1;
1610     sps->mb_adaptive_frame_field_flag = 0;
1611     sps->direct_8x8_inference_flag = 1;
1612     sps->frame_cropping_flag =
1613         (channel->width % size_mb) || (channel->height % size_mb);
1614     if (sps->frame_cropping_flag) {
1615         sps->crop_left = 0;
1616         sps->crop_right = (round_up(channel->width, size_mb) - channel->width) / crop_unit_x;
1617         sps->crop_top = 0;
1618         sps->crop_bottom = (round_up(channel->height, size_mb) - channel->height) / crop_unit_y;
1619     }
1620     sps->vui_parameters_present_flag = 1;
1621     sps->vui.aspect_ratio_info_present_flag = 0;
1622     sps->vui.overscan_info_present_flag = 0;
1623 
1624     sps->vui.video_signal_type_present_flag = 1;
1625     sps->vui.video_format = 5; /* unspecified */
1626     sps->vui.video_full_range_flag = nal_h264_full_range(channel->quantization);
1627     sps->vui.colour_description_present_flag = 1;
1628     sps->vui.colour_primaries = nal_h264_color_primaries(channel->colorspace);
1629     sps->vui.transfer_characteristics =
1630         nal_h264_transfer_characteristics(channel->colorspace, channel->xfer_func);
1631     sps->vui.matrix_coefficients =
1632         nal_h264_matrix_coeffs(channel->colorspace, channel->ycbcr_enc);
1633 
1634     sps->vui.chroma_loc_info_present_flag = 1;
1635     sps->vui.chroma_sample_loc_type_top_field = 0;
1636     sps->vui.chroma_sample_loc_type_bottom_field = 0;
1637 
1638     sps->vui.timing_info_present_flag = 1;
1639     sps->vui.num_units_in_tick = channel->framerate.denominator;
1640     sps->vui.time_scale = 2 * channel->framerate.numerator;
1641 
1642     sps->vui.fixed_frame_rate_flag = 1;
1643     sps->vui.nal_hrd_parameters_present_flag = 0;
1644     sps->vui.vcl_hrd_parameters_present_flag = 1;
1645     sps->vui.vcl_hrd_parameters.cpb_cnt_minus1 = 0;
1646     /* See Rec. ITU-T H.264 (04/2017) p. 410 E-53 */
1647     sps->vui.vcl_hrd_parameters.bit_rate_scale =
1648         ffs(channel->bitrate_peak) - 6;
1649     sps->vui.vcl_hrd_parameters.bit_rate_value_minus1[0] =
1650         channel->bitrate_peak / (1 << (6 + sps->vui.vcl_hrd_parameters.bit_rate_scale)) - 1;
1651     /* See Rec. ITU-T H.264 (04/2017) p. 410 E-54 */
1652     cpb_size = v4l2_ctrl_g_ctrl(channel->mpeg_video_cpb_size);
1653     cpb_size_scale = ffs(cpb_size) - 4;
1654     sps->vui.vcl_hrd_parameters.cpb_size_scale = cpb_size_scale;
1655     sps->vui.vcl_hrd_parameters.cpb_size_value_minus1[0] =
1656         (cpb_size * 1000) / (1 << (4 + cpb_size_scale)) - 1;
1657     sps->vui.vcl_hrd_parameters.cbr_flag[0] =
1658         !v4l2_ctrl_g_ctrl(channel->mpeg_video_frame_rc_enable);
1659     sps->vui.vcl_hrd_parameters.initial_cpb_removal_delay_length_minus1 = 31;
1660     sps->vui.vcl_hrd_parameters.cpb_removal_delay_length_minus1 = 31;
1661     sps->vui.vcl_hrd_parameters.dpb_output_delay_length_minus1 = 31;
1662     sps->vui.vcl_hrd_parameters.time_offset_length = 0;
1663     sps->vui.low_delay_hrd_flag = 0;
1664     sps->vui.pic_struct_present_flag = 1;
1665     sps->vui.bitstream_restriction_flag = 0;
1666 
1667     size = nal_h264_write_sps(&dev->plat_dev->dev, dest, n, sps);
1668 
1669     kfree(sps);
1670 
1671     return size;
1672 }
1673 
1674 static ssize_t allegro_h264_write_pps(struct allegro_channel *channel,
1675                       void *dest, size_t n)
1676 {
1677     struct allegro_dev *dev = channel->dev;
1678     struct nal_h264_pps *pps;
1679     ssize_t size;
1680 
1681     pps = kzalloc(sizeof(*pps), GFP_KERNEL);
1682     if (!pps)
1683         return -ENOMEM;
1684 
1685     pps->pic_parameter_set_id = 0;
1686     pps->seq_parameter_set_id = 0;
1687     pps->entropy_coding_mode_flag = 0;
1688     pps->bottom_field_pic_order_in_frame_present_flag = 0;
1689     pps->num_slice_groups_minus1 = 0;
1690     pps->num_ref_idx_l0_default_active_minus1 = channel->num_ref_idx_l0 - 1;
1691     pps->num_ref_idx_l1_default_active_minus1 = channel->num_ref_idx_l1 - 1;
1692     pps->weighted_pred_flag = 0;
1693     pps->weighted_bipred_idc = 0;
1694     pps->pic_init_qp_minus26 = 0;
1695     pps->pic_init_qs_minus26 = 0;
1696     pps->chroma_qp_index_offset = 0;
1697     pps->deblocking_filter_control_present_flag = 1;
1698     pps->constrained_intra_pred_flag = 0;
1699     pps->redundant_pic_cnt_present_flag = 0;
1700     pps->transform_8x8_mode_flag = 0;
1701     pps->pic_scaling_matrix_present_flag = 0;
1702     pps->second_chroma_qp_index_offset = 0;
1703 
1704     size = nal_h264_write_pps(&dev->plat_dev->dev, dest, n, pps);
1705 
1706     kfree(pps);
1707 
1708     return size;
1709 }
1710 
1711 static void allegro_channel_eos_event(struct allegro_channel *channel)
1712 {
1713     const struct v4l2_event eos_event = {
1714         .type = V4L2_EVENT_EOS
1715     };
1716 
1717     v4l2_event_queue_fh(&channel->fh, &eos_event);
1718 }
1719 
1720 static ssize_t allegro_hevc_write_vps(struct allegro_channel *channel,
1721                       void *dest, size_t n)
1722 {
1723     struct allegro_dev *dev = channel->dev;
1724     struct nal_hevc_vps *vps;
1725     struct nal_hevc_profile_tier_level *ptl;
1726     ssize_t size;
1727     unsigned int num_ref_frames = channel->num_ref_idx_l0;
1728     s32 profile = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_profile);
1729     s32 level = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_level);
1730     s32 tier = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_tier);
1731 
1732     vps = kzalloc(sizeof(*vps), GFP_KERNEL);
1733     if (!vps)
1734         return -ENOMEM;
1735 
1736     vps->base_layer_internal_flag = 1;
1737     vps->base_layer_available_flag = 1;
1738     vps->temporal_id_nesting_flag = 1;
1739 
1740     ptl = &vps->profile_tier_level;
1741     ptl->general_profile_idc = nal_hevc_profile(profile);
1742     ptl->general_profile_compatibility_flag[ptl->general_profile_idc] = 1;
1743     ptl->general_tier_flag = nal_hevc_tier(tier);
1744     ptl->general_progressive_source_flag = 1;
1745     ptl->general_frame_only_constraint_flag = 1;
1746     ptl->general_level_idc = nal_hevc_level(level);
1747 
1748     vps->sub_layer_ordering_info_present_flag = 0;
1749     vps->max_dec_pic_buffering_minus1[0] = num_ref_frames;
1750     vps->max_num_reorder_pics[0] = num_ref_frames;
1751 
1752     size = nal_hevc_write_vps(&dev->plat_dev->dev, dest, n, vps);
1753 
1754     kfree(vps);
1755 
1756     return size;
1757 }
1758 
1759 static ssize_t allegro_hevc_write_sps(struct allegro_channel *channel,
1760                       void *dest, size_t n)
1761 {
1762     struct allegro_dev *dev = channel->dev;
1763     struct nal_hevc_sps *sps;
1764     struct nal_hevc_profile_tier_level *ptl;
1765     struct nal_hevc_vui_parameters *vui;
1766     struct nal_hevc_hrd_parameters *hrd;
1767     ssize_t size;
1768     unsigned int cpb_size;
1769     unsigned int num_ref_frames = channel->num_ref_idx_l0;
1770     s32 profile = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_profile);
1771     s32 level = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_level);
1772     s32 tier = v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_tier);
1773 
1774     sps = kzalloc(sizeof(*sps), GFP_KERNEL);
1775     if (!sps)
1776         return -ENOMEM;
1777 
1778     sps->temporal_id_nesting_flag = 1;
1779 
1780     ptl = &sps->profile_tier_level;
1781     ptl->general_profile_idc = nal_hevc_profile(profile);
1782     ptl->general_profile_compatibility_flag[ptl->general_profile_idc] = 1;
1783     ptl->general_tier_flag = nal_hevc_tier(tier);
1784     ptl->general_progressive_source_flag = 1;
1785     ptl->general_frame_only_constraint_flag = 1;
1786     ptl->general_level_idc = nal_hevc_level(level);
1787 
1788     sps->seq_parameter_set_id = 0;
1789     sps->chroma_format_idc = 1; /* Only 4:2:0 sampling supported */
1790     sps->pic_width_in_luma_samples = round_up(channel->width, 8);
1791     sps->pic_height_in_luma_samples = round_up(channel->height, 8);
1792     sps->conf_win_right_offset =
1793         sps->pic_width_in_luma_samples - channel->width;
1794     sps->conf_win_bottom_offset =
1795         sps->pic_height_in_luma_samples - channel->height;
1796     sps->conformance_window_flag =
1797         sps->conf_win_right_offset || sps->conf_win_bottom_offset;
1798 
1799     sps->log2_max_pic_order_cnt_lsb_minus4 = LOG2_MAX_PIC_ORDER_CNT - 4;
1800 
1801     sps->sub_layer_ordering_info_present_flag = 1;
1802     sps->max_dec_pic_buffering_minus1[0] = num_ref_frames;
1803     sps->max_num_reorder_pics[0] = num_ref_frames;
1804 
1805     sps->log2_min_luma_coding_block_size_minus3 =
1806         channel->min_cu_size - 3;
1807     sps->log2_diff_max_min_luma_coding_block_size =
1808         channel->max_cu_size - channel->min_cu_size;
1809     sps->log2_min_luma_transform_block_size_minus2 =
1810         channel->min_tu_size - 2;
1811     sps->log2_diff_max_min_luma_transform_block_size =
1812         channel->max_tu_size - channel->min_tu_size;
1813     sps->max_transform_hierarchy_depth_intra =
1814         channel->max_transfo_depth_intra;
1815     sps->max_transform_hierarchy_depth_inter =
1816         channel->max_transfo_depth_inter;
1817 
1818     sps->sps_temporal_mvp_enabled_flag = channel->temporal_mvp_enable;
1819     sps->strong_intra_smoothing_enabled_flag = channel->max_cu_size > 4;
1820 
1821     sps->vui_parameters_present_flag = 1;
1822     vui = &sps->vui;
1823 
1824     vui->video_signal_type_present_flag = 1;
1825     vui->video_format = 5; /* unspecified */
1826     vui->video_full_range_flag = nal_hevc_full_range(channel->quantization);
1827     vui->colour_description_present_flag = 1;
1828     vui->colour_primaries = nal_hevc_color_primaries(channel->colorspace);
1829     vui->transfer_characteristics = nal_hevc_transfer_characteristics(channel->colorspace,
1830                                       channel->xfer_func);
1831     vui->matrix_coeffs = nal_hevc_matrix_coeffs(channel->colorspace, channel->ycbcr_enc);
1832 
1833     vui->chroma_loc_info_present_flag = 1;
1834     vui->chroma_sample_loc_type_top_field = 0;
1835     vui->chroma_sample_loc_type_bottom_field = 0;
1836 
1837     vui->vui_timing_info_present_flag = 1;
1838     vui->vui_num_units_in_tick = channel->framerate.denominator;
1839     vui->vui_time_scale = channel->framerate.numerator;
1840 
1841     vui->bitstream_restriction_flag = 1;
1842     vui->motion_vectors_over_pic_boundaries_flag = 1;
1843     vui->restricted_ref_pic_lists_flag = 1;
1844     vui->log2_max_mv_length_horizontal = 15;
1845     vui->log2_max_mv_length_vertical = 15;
1846 
1847     vui->vui_hrd_parameters_present_flag = 1;
1848     hrd = &vui->nal_hrd_parameters;
1849     hrd->vcl_hrd_parameters_present_flag = 1;
1850 
1851     hrd->initial_cpb_removal_delay_length_minus1 = 31;
1852     hrd->au_cpb_removal_delay_length_minus1 = 30;
1853     hrd->dpb_output_delay_length_minus1 = 30;
1854 
1855     hrd->bit_rate_scale = ffs(channel->bitrate_peak) - 6;
1856     hrd->vcl_hrd[0].bit_rate_value_minus1[0] =
1857         (channel->bitrate_peak >> (6 + hrd->bit_rate_scale)) - 1;
1858 
1859     cpb_size = v4l2_ctrl_g_ctrl(channel->mpeg_video_cpb_size) * 1000;
1860     hrd->cpb_size_scale = ffs(cpb_size) - 4;
1861     hrd->vcl_hrd[0].cpb_size_value_minus1[0] = (cpb_size >> (4 + hrd->cpb_size_scale)) - 1;
1862 
1863     hrd->vcl_hrd[0].cbr_flag[0] = !v4l2_ctrl_g_ctrl(channel->mpeg_video_frame_rc_enable);
1864 
1865     size = nal_hevc_write_sps(&dev->plat_dev->dev, dest, n, sps);
1866 
1867     kfree(sps);
1868 
1869     return size;
1870 }
1871 
1872 static ssize_t allegro_hevc_write_pps(struct allegro_channel *channel,
1873                       struct mcu_msg_encode_frame_response *msg,
1874                       void *dest, size_t n)
1875 {
1876     struct allegro_dev *dev = channel->dev;
1877     struct nal_hevc_pps *pps;
1878     ssize_t size;
1879     int i;
1880 
1881     pps = kzalloc(sizeof(*pps), GFP_KERNEL);
1882     if (!pps)
1883         return -ENOMEM;
1884 
1885     pps->pps_pic_parameter_set_id = 0;
1886     pps->pps_seq_parameter_set_id = 0;
1887 
1888     if (msg->num_column > 1 || msg->num_row > 1) {
1889         pps->tiles_enabled_flag = 1;
1890         pps->num_tile_columns_minus1 = msg->num_column - 1;
1891         pps->num_tile_rows_minus1 = msg->num_row - 1;
1892 
1893         for (i = 0; i < msg->num_column; i++)
1894             pps->column_width_minus1[i] = msg->tile_width[i] - 1;
1895 
1896         for (i = 0; i < msg->num_row; i++)
1897             pps->row_height_minus1[i] = msg->tile_height[i] - 1;
1898     }
1899 
1900     pps->loop_filter_across_tiles_enabled_flag =
1901         channel->enable_loop_filter_across_tiles;
1902     pps->pps_loop_filter_across_slices_enabled_flag =
1903         channel->enable_loop_filter_across_slices;
1904     pps->deblocking_filter_control_present_flag = 1;
1905     pps->deblocking_filter_override_enabled_flag =
1906         channel->enable_deblocking_filter_override;
1907     pps->pps_beta_offset_div2 = BETA_OFFSET_DIV_2;
1908     pps->pps_tc_offset_div2 = TC_OFFSET_DIV_2;
1909 
1910     pps->lists_modification_present_flag = channel->enable_reordering;
1911 
1912     size = nal_hevc_write_pps(&dev->plat_dev->dev, dest, n, pps);
1913 
1914     kfree(pps);
1915 
1916     return size;
1917 }
1918 
1919 static u64 allegro_put_buffer(struct allegro_channel *channel,
1920                   struct list_head *list,
1921                   struct vb2_v4l2_buffer *buffer)
1922 {
1923     struct v4l2_m2m_buffer *b = container_of(buffer,
1924                          struct v4l2_m2m_buffer, vb);
1925     struct allegro_m2m_buffer *shadow = to_allegro_m2m_buffer(b);
1926 
1927     mutex_lock(&channel->shadow_list_lock);
1928     list_add_tail(&shadow->head, list);
1929     mutex_unlock(&channel->shadow_list_lock);
1930 
1931     return ptr_to_u64(buffer);
1932 }
1933 
1934 static struct vb2_v4l2_buffer *
1935 allegro_get_buffer(struct allegro_channel *channel,
1936            struct list_head *list, u64 handle)
1937 {
1938     struct allegro_m2m_buffer *shadow, *tmp;
1939     struct vb2_v4l2_buffer *buffer = NULL;
1940 
1941     mutex_lock(&channel->shadow_list_lock);
1942     list_for_each_entry_safe(shadow, tmp, list, head) {
1943         if (handle == ptr_to_u64(&shadow->buf.vb)) {
1944             buffer = &shadow->buf.vb;
1945             list_del_init(&shadow->head);
1946             break;
1947         }
1948     }
1949     mutex_unlock(&channel->shadow_list_lock);
1950 
1951     return buffer;
1952 }
1953 
1954 static void allegro_channel_finish_frame(struct allegro_channel *channel,
1955         struct mcu_msg_encode_frame_response *msg)
1956 {
1957     struct allegro_dev *dev = channel->dev;
1958     struct vb2_v4l2_buffer *src_buf;
1959     struct vb2_v4l2_buffer *dst_buf;
1960     struct {
1961         u32 offset;
1962         u32 size;
1963     } *partition;
1964     enum vb2_buffer_state state = VB2_BUF_STATE_ERROR;
1965     char *curr;
1966     ssize_t len;
1967     ssize_t free;
1968 
1969     src_buf = allegro_get_buffer(channel, &channel->source_shadow_list,
1970                      msg->src_handle);
1971     if (!src_buf)
1972         v4l2_warn(&dev->v4l2_dev,
1973               "channel %d: invalid source buffer\n",
1974               channel->mcu_channel_id);
1975 
1976     dst_buf = allegro_get_buffer(channel, &channel->stream_shadow_list,
1977                      msg->dst_handle);
1978     if (!dst_buf)
1979         v4l2_warn(&dev->v4l2_dev,
1980               "channel %d: invalid stream buffer\n",
1981               channel->mcu_channel_id);
1982 
1983     if (!src_buf || !dst_buf)
1984         goto err;
1985 
1986     if (v4l2_m2m_is_last_draining_src_buf(channel->fh.m2m_ctx, src_buf)) {
1987         dst_buf->flags |= V4L2_BUF_FLAG_LAST;
1988         allegro_channel_eos_event(channel);
1989         v4l2_m2m_mark_stopped(channel->fh.m2m_ctx);
1990     }
1991 
1992     dst_buf->sequence = channel->csequence++;
1993 
1994     if (msg->error_code & AL_ERROR) {
1995         v4l2_err(&dev->v4l2_dev,
1996              "channel %d: failed to encode frame: %s (%x)\n",
1997              channel->mcu_channel_id,
1998              allegro_err_to_string(msg->error_code),
1999              msg->error_code);
2000         goto err;
2001     }
2002 
2003     if (msg->partition_table_size != 1) {
2004         v4l2_warn(&dev->v4l2_dev,
2005               "channel %d: only handling first partition table entry (%d entries)\n",
2006               channel->mcu_channel_id, msg->partition_table_size);
2007     }
2008 
2009     if (msg->partition_table_offset +
2010         msg->partition_table_size * sizeof(*partition) >
2011         vb2_plane_size(&dst_buf->vb2_buf, 0)) {
2012         v4l2_err(&dev->v4l2_dev,
2013              "channel %d: partition table outside of dst_buf\n",
2014              channel->mcu_channel_id);
2015         goto err;
2016     }
2017 
2018     partition =
2019         vb2_plane_vaddr(&dst_buf->vb2_buf, 0) + msg->partition_table_offset;
2020     if (partition->offset + partition->size >
2021         vb2_plane_size(&dst_buf->vb2_buf, 0)) {
2022         v4l2_err(&dev->v4l2_dev,
2023              "channel %d: encoded frame is outside of dst_buf (offset 0x%x, size 0x%x)\n",
2024              channel->mcu_channel_id, partition->offset,
2025              partition->size);
2026         goto err;
2027     }
2028 
2029     v4l2_dbg(2, debug, &dev->v4l2_dev,
2030          "channel %d: encoded frame of size %d is at offset 0x%x\n",
2031          channel->mcu_channel_id, partition->size, partition->offset);
2032 
2033     /*
2034      * The payload must include the data before the partition offset,
2035      * because we will put the sps and pps data there.
2036      */
2037     vb2_set_plane_payload(&dst_buf->vb2_buf, 0,
2038                   partition->offset + partition->size);
2039 
2040     curr = vb2_plane_vaddr(&dst_buf->vb2_buf, 0);
2041     free = partition->offset;
2042 
2043     if (channel->codec == V4L2_PIX_FMT_HEVC && msg->is_idr) {
2044         len = allegro_hevc_write_vps(channel, curr, free);
2045         if (len < 0) {
2046             v4l2_err(&dev->v4l2_dev,
2047                  "not enough space for video parameter set: %zd left\n",
2048                  free);
2049             goto err;
2050         }
2051         curr += len;
2052         free -= len;
2053         v4l2_dbg(1, debug, &dev->v4l2_dev,
2054              "channel %d: wrote %zd byte VPS nal unit\n",
2055              channel->mcu_channel_id, len);
2056     }
2057 
2058     if (msg->is_idr) {
2059         if (channel->codec == V4L2_PIX_FMT_H264)
2060             len = allegro_h264_write_sps(channel, curr, free);
2061         else
2062             len = allegro_hevc_write_sps(channel, curr, free);
2063         if (len < 0) {
2064             v4l2_err(&dev->v4l2_dev,
2065                  "not enough space for sequence parameter set: %zd left\n",
2066                  free);
2067             goto err;
2068         }
2069         curr += len;
2070         free -= len;
2071         v4l2_dbg(1, debug, &dev->v4l2_dev,
2072              "channel %d: wrote %zd byte SPS nal unit\n",
2073              channel->mcu_channel_id, len);
2074     }
2075 
2076     if (msg->slice_type == AL_ENC_SLICE_TYPE_I) {
2077         if (channel->codec == V4L2_PIX_FMT_H264)
2078             len = allegro_h264_write_pps(channel, curr, free);
2079         else
2080             len = allegro_hevc_write_pps(channel, msg, curr, free);
2081         if (len < 0) {
2082             v4l2_err(&dev->v4l2_dev,
2083                  "not enough space for picture parameter set: %zd left\n",
2084                  free);
2085             goto err;
2086         }
2087         curr += len;
2088         free -= len;
2089         v4l2_dbg(1, debug, &dev->v4l2_dev,
2090              "channel %d: wrote %zd byte PPS nal unit\n",
2091              channel->mcu_channel_id, len);
2092     }
2093 
2094     if (msg->slice_type != AL_ENC_SLICE_TYPE_I && !msg->is_idr) {
2095         dst_buf->vb2_buf.planes[0].data_offset = free;
2096         free = 0;
2097     } else {
2098         if (channel->codec == V4L2_PIX_FMT_H264)
2099             len = nal_h264_write_filler(&dev->plat_dev->dev, curr, free);
2100         else
2101             len = nal_hevc_write_filler(&dev->plat_dev->dev, curr, free);
2102         if (len < 0) {
2103             v4l2_err(&dev->v4l2_dev,
2104                  "failed to write %zd filler data\n", free);
2105             goto err;
2106         }
2107         curr += len;
2108         free -= len;
2109         v4l2_dbg(2, debug, &dev->v4l2_dev,
2110              "channel %d: wrote %zd bytes filler nal unit\n",
2111              channel->mcu_channel_id, len);
2112     }
2113 
2114     if (free != 0) {
2115         v4l2_err(&dev->v4l2_dev,
2116              "non-VCL NAL units do not fill space until VCL NAL unit: %zd bytes left\n",
2117              free);
2118         goto err;
2119     }
2120 
2121     state = VB2_BUF_STATE_DONE;
2122 
2123     v4l2_m2m_buf_copy_metadata(src_buf, dst_buf, false);
2124     if (msg->is_idr)
2125         dst_buf->flags |= V4L2_BUF_FLAG_KEYFRAME;
2126     else
2127         dst_buf->flags |= V4L2_BUF_FLAG_PFRAME;
2128 
2129     v4l2_dbg(1, debug, &dev->v4l2_dev,
2130          "channel %d: encoded frame #%03d (%s%s, QP %d, %d bytes)\n",
2131          channel->mcu_channel_id,
2132          dst_buf->sequence,
2133          msg->is_idr ? "IDR, " : "",
2134          msg->slice_type == AL_ENC_SLICE_TYPE_I ? "I slice" :
2135          msg->slice_type == AL_ENC_SLICE_TYPE_P ? "P slice" : "unknown",
2136          msg->qp, partition->size);
2137 
2138 err:
2139     if (src_buf)
2140         v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
2141 
2142     if (dst_buf)
2143         v4l2_m2m_buf_done(dst_buf, state);
2144 }
2145 
2146 static int allegro_handle_init(struct allegro_dev *dev,
2147                    struct mcu_msg_init_response *msg)
2148 {
2149     complete(&dev->init_complete);
2150 
2151     return 0;
2152 }
2153 
2154 static int
2155 allegro_handle_create_channel(struct allegro_dev *dev,
2156                   struct mcu_msg_create_channel_response *msg)
2157 {
2158     struct allegro_channel *channel;
2159     int err = 0;
2160     struct create_channel_param param;
2161 
2162     channel = allegro_find_channel_by_user_id(dev, msg->user_id);
2163     if (IS_ERR(channel)) {
2164         v4l2_warn(&dev->v4l2_dev,
2165               "received %s for unknown user %d\n",
2166               msg_type_name(msg->header.type),
2167               msg->user_id);
2168         return -EINVAL;
2169     }
2170 
2171     if (msg->error_code) {
2172         v4l2_err(&dev->v4l2_dev,
2173              "user %d: mcu failed to create channel: %s (%x)\n",
2174              channel->user_id,
2175              allegro_err_to_string(msg->error_code),
2176              msg->error_code);
2177         err = -EIO;
2178         goto out;
2179     }
2180 
2181     channel->mcu_channel_id = msg->channel_id;
2182     v4l2_dbg(1, debug, &dev->v4l2_dev,
2183          "user %d: channel has channel id %d\n",
2184          channel->user_id, channel->mcu_channel_id);
2185 
2186     err = allegro_decode_config_blob(&param, msg, channel->config_blob.vaddr);
2187     allegro_free_buffer(channel->dev, &channel->config_blob);
2188     if (err)
2189         goto out;
2190 
2191     channel->num_ref_idx_l0 = param.num_ref_idx_l0;
2192     channel->num_ref_idx_l1 = param.num_ref_idx_l1;
2193 
2194     v4l2_dbg(1, debug, &dev->v4l2_dev,
2195          "channel %d: intermediate buffers: %d x %d bytes\n",
2196          channel->mcu_channel_id,
2197          msg->int_buffers_count, msg->int_buffers_size);
2198     err = allocate_intermediate_buffers(channel, msg->int_buffers_count,
2199                         msg->int_buffers_size);
2200     if (err) {
2201         v4l2_err(&dev->v4l2_dev,
2202              "channel %d: failed to allocate intermediate buffers\n",
2203              channel->mcu_channel_id);
2204         goto out;
2205     }
2206     err = allegro_mcu_push_buffer_intermediate(channel);
2207     if (err)
2208         goto out;
2209 
2210     v4l2_dbg(1, debug, &dev->v4l2_dev,
2211          "channel %d: reference buffers: %d x %d bytes\n",
2212          channel->mcu_channel_id,
2213          msg->rec_buffers_count, msg->rec_buffers_size);
2214     err = allocate_reference_buffers(channel, msg->rec_buffers_count,
2215                      msg->rec_buffers_size);
2216     if (err) {
2217         v4l2_err(&dev->v4l2_dev,
2218              "channel %d: failed to allocate reference buffers\n",
2219              channel->mcu_channel_id);
2220         goto out;
2221     }
2222     err = allegro_mcu_push_buffer_reference(channel);
2223     if (err)
2224         goto out;
2225 
2226 out:
2227     channel->error = err;
2228     complete(&channel->completion);
2229 
2230     /* Handled successfully, error is passed via channel->error */
2231     return 0;
2232 }
2233 
2234 static int
2235 allegro_handle_destroy_channel(struct allegro_dev *dev,
2236                    struct mcu_msg_destroy_channel_response *msg)
2237 {
2238     struct allegro_channel *channel;
2239 
2240     channel = allegro_find_channel_by_channel_id(dev, msg->channel_id);
2241     if (IS_ERR(channel)) {
2242         v4l2_err(&dev->v4l2_dev,
2243              "received %s for unknown channel %d\n",
2244              msg_type_name(msg->header.type),
2245              msg->channel_id);
2246         return -EINVAL;
2247     }
2248 
2249     v4l2_dbg(2, debug, &dev->v4l2_dev,
2250          "user %d: vcu destroyed channel %d\n",
2251          channel->user_id, channel->mcu_channel_id);
2252     complete(&channel->completion);
2253 
2254     return 0;
2255 }
2256 
2257 static int
2258 allegro_handle_encode_frame(struct allegro_dev *dev,
2259                 struct mcu_msg_encode_frame_response *msg)
2260 {
2261     struct allegro_channel *channel;
2262 
2263     channel = allegro_find_channel_by_channel_id(dev, msg->channel_id);
2264     if (IS_ERR(channel)) {
2265         v4l2_err(&dev->v4l2_dev,
2266              "received %s for unknown channel %d\n",
2267              msg_type_name(msg->header.type),
2268              msg->channel_id);
2269         return -EINVAL;
2270     }
2271 
2272     allegro_channel_finish_frame(channel, msg);
2273 
2274     return 0;
2275 }
2276 
2277 static void allegro_handle_message(struct allegro_dev *dev,
2278                    union mcu_msg_response *msg)
2279 {
2280     switch (msg->header.type) {
2281     case MCU_MSG_TYPE_INIT:
2282         allegro_handle_init(dev, &msg->init);
2283         break;
2284     case MCU_MSG_TYPE_CREATE_CHANNEL:
2285         allegro_handle_create_channel(dev, &msg->create_channel);
2286         break;
2287     case MCU_MSG_TYPE_DESTROY_CHANNEL:
2288         allegro_handle_destroy_channel(dev, &msg->destroy_channel);
2289         break;
2290     case MCU_MSG_TYPE_ENCODE_FRAME:
2291         allegro_handle_encode_frame(dev, &msg->encode_frame);
2292         break;
2293     default:
2294         v4l2_warn(&dev->v4l2_dev,
2295               "%s: unknown message %s\n",
2296               __func__, msg_type_name(msg->header.type));
2297         break;
2298     }
2299 }
2300 
2301 static irqreturn_t allegro_hardirq(int irq, void *data)
2302 {
2303     struct allegro_dev *dev = data;
2304     unsigned int status;
2305 
2306     regmap_read(dev->regmap, AL5_ITC_CPU_IRQ_STA, &status);
2307     if (!(status & AL5_ITC_CPU_IRQ_STA_TRIGGERED))
2308         return IRQ_NONE;
2309 
2310     regmap_write(dev->regmap, AL5_ITC_CPU_IRQ_CLR, status);
2311 
2312     return IRQ_WAKE_THREAD;
2313 }
2314 
2315 static irqreturn_t allegro_irq_thread(int irq, void *data)
2316 {
2317     struct allegro_dev *dev = data;
2318 
2319     /*
2320      * The firmware is initialized after the mailbox is setup. We further
2321      * check the AL5_ITC_CPU_IRQ_STA register, if the firmware actually
2322      * triggered the interrupt. Although this should not happen, make sure
2323      * that we ignore interrupts, if the mailbox is not initialized.
2324      */
2325     if (!dev->mbox_status)
2326         return IRQ_NONE;
2327 
2328     allegro_mbox_notify(dev->mbox_status);
2329 
2330     return IRQ_HANDLED;
2331 }
2332 
2333 static void allegro_copy_firmware(struct allegro_dev *dev,
2334                   const u8 * const buf, size_t size)
2335 {
2336     int err = 0;
2337 
2338     v4l2_dbg(1, debug, &dev->v4l2_dev,
2339          "copy mcu firmware (%zu B) to SRAM\n", size);
2340     err = regmap_bulk_write(dev->sram, 0x0, buf, size / 4);
2341     if (err)
2342         v4l2_err(&dev->v4l2_dev,
2343              "failed to copy firmware: %d\n", err);
2344 }
2345 
2346 static void allegro_copy_fw_codec(struct allegro_dev *dev,
2347                   const u8 * const buf, size_t size)
2348 {
2349     int err;
2350     dma_addr_t icache_offset, dcache_offset;
2351 
2352     /*
2353      * The downstream allocates 600 KB for the codec firmware to have some
2354      * extra space for "possible extensions." My tests were fine with
2355      * allocating just enough memory for the actual firmware, but I am not
2356      * sure that the firmware really does not use the remaining space.
2357      */
2358     err = allegro_alloc_buffer(dev, &dev->firmware, size);
2359     if (err) {
2360         v4l2_err(&dev->v4l2_dev,
2361              "failed to allocate %zu bytes for firmware\n", size);
2362         return;
2363     }
2364 
2365     v4l2_dbg(1, debug, &dev->v4l2_dev,
2366          "copy codec firmware (%zd B) to phys %pad\n",
2367          size, &dev->firmware.paddr);
2368     memcpy(dev->firmware.vaddr, buf, size);
2369 
2370     regmap_write(dev->regmap, AXI_ADDR_OFFSET_IP,
2371              upper_32_bits(dev->firmware.paddr));
2372 
2373     icache_offset = dev->firmware.paddr - MCU_CACHE_OFFSET;
2374     v4l2_dbg(2, debug, &dev->v4l2_dev,
2375          "icache_offset: msb = 0x%x, lsb = 0x%x\n",
2376          upper_32_bits(icache_offset), lower_32_bits(icache_offset));
2377     regmap_write(dev->regmap, AL5_ICACHE_ADDR_OFFSET_MSB,
2378              upper_32_bits(icache_offset));
2379     regmap_write(dev->regmap, AL5_ICACHE_ADDR_OFFSET_LSB,
2380              lower_32_bits(icache_offset));
2381 
2382     dcache_offset =
2383         (dev->firmware.paddr & 0xffffffff00000000ULL) - MCU_CACHE_OFFSET;
2384     v4l2_dbg(2, debug, &dev->v4l2_dev,
2385          "dcache_offset: msb = 0x%x, lsb = 0x%x\n",
2386          upper_32_bits(dcache_offset), lower_32_bits(dcache_offset));
2387     regmap_write(dev->regmap, AL5_DCACHE_ADDR_OFFSET_MSB,
2388              upper_32_bits(dcache_offset));
2389     regmap_write(dev->regmap, AL5_DCACHE_ADDR_OFFSET_LSB,
2390              lower_32_bits(dcache_offset));
2391 }
2392 
2393 static void allegro_free_fw_codec(struct allegro_dev *dev)
2394 {
2395     allegro_free_buffer(dev, &dev->firmware);
2396 }
2397 
2398 /*
2399  * Control functions for the MCU
2400  */
2401 
2402 static int allegro_mcu_enable_interrupts(struct allegro_dev *dev)
2403 {
2404     return regmap_write(dev->regmap, AL5_ITC_CPU_IRQ_MSK, BIT(0));
2405 }
2406 
2407 static int allegro_mcu_disable_interrupts(struct allegro_dev *dev)
2408 {
2409     return regmap_write(dev->regmap, AL5_ITC_CPU_IRQ_MSK, 0);
2410 }
2411 
2412 static int allegro_mcu_wait_for_sleep(struct allegro_dev *dev)
2413 {
2414     unsigned long timeout;
2415     unsigned int status;
2416 
2417     timeout = jiffies + msecs_to_jiffies(100);
2418     while (regmap_read(dev->regmap, AL5_MCU_STA, &status) == 0 &&
2419            status != AL5_MCU_STA_SLEEP) {
2420         if (time_after(jiffies, timeout))
2421             return -ETIMEDOUT;
2422         cpu_relax();
2423     }
2424 
2425     return 0;
2426 }
2427 
2428 static int allegro_mcu_start(struct allegro_dev *dev)
2429 {
2430     unsigned long timeout;
2431     unsigned int status;
2432     int err;
2433 
2434     err = regmap_write(dev->regmap, AL5_MCU_WAKEUP, BIT(0));
2435     if (err)
2436         return err;
2437 
2438     timeout = jiffies + msecs_to_jiffies(100);
2439     while (regmap_read(dev->regmap, AL5_MCU_STA, &status) == 0 &&
2440            status == AL5_MCU_STA_SLEEP) {
2441         if (time_after(jiffies, timeout))
2442             return -ETIMEDOUT;
2443         cpu_relax();
2444     }
2445 
2446     err = regmap_write(dev->regmap, AL5_MCU_WAKEUP, 0);
2447     if (err)
2448         return err;
2449 
2450     return 0;
2451 }
2452 
2453 static int allegro_mcu_reset(struct allegro_dev *dev)
2454 {
2455     int err;
2456 
2457     /*
2458      * Ensure that the AL5_MCU_WAKEUP bit is set to 0 otherwise the mcu
2459      * does not go to sleep after the reset.
2460      */
2461     err = regmap_write(dev->regmap, AL5_MCU_WAKEUP, 0);
2462     if (err)
2463         return err;
2464 
2465     err = regmap_write(dev->regmap,
2466                AL5_MCU_RESET_MODE, AL5_MCU_RESET_MODE_SLEEP);
2467     if (err < 0)
2468         return err;
2469 
2470     err = regmap_write(dev->regmap, AL5_MCU_RESET, AL5_MCU_RESET_SOFT);
2471     if (err < 0)
2472         return err;
2473 
2474     return allegro_mcu_wait_for_sleep(dev);
2475 }
2476 
2477 static void allegro_mcu_interrupt(struct allegro_dev *dev)
2478 {
2479     regmap_write(dev->regmap, AL5_MCU_INTERRUPT, BIT(0));
2480 }
2481 
2482 static void allegro_destroy_channel(struct allegro_channel *channel)
2483 {
2484     struct allegro_dev *dev = channel->dev;
2485     unsigned long timeout;
2486 
2487     if (channel_exists(channel)) {
2488         reinit_completion(&channel->completion);
2489         allegro_mcu_send_destroy_channel(dev, channel);
2490         timeout = wait_for_completion_timeout(&channel->completion,
2491                               msecs_to_jiffies(5000));
2492         if (timeout == 0)
2493             v4l2_warn(&dev->v4l2_dev,
2494                   "channel %d: timeout while destroying\n",
2495                   channel->mcu_channel_id);
2496 
2497         channel->mcu_channel_id = -1;
2498     }
2499 
2500     destroy_intermediate_buffers(channel);
2501     destroy_reference_buffers(channel);
2502 
2503     v4l2_ctrl_grab(channel->mpeg_video_h264_profile, false);
2504     v4l2_ctrl_grab(channel->mpeg_video_h264_level, false);
2505     v4l2_ctrl_grab(channel->mpeg_video_h264_i_frame_qp, false);
2506     v4l2_ctrl_grab(channel->mpeg_video_h264_max_qp, false);
2507     v4l2_ctrl_grab(channel->mpeg_video_h264_min_qp, false);
2508     v4l2_ctrl_grab(channel->mpeg_video_h264_p_frame_qp, false);
2509     v4l2_ctrl_grab(channel->mpeg_video_h264_b_frame_qp, false);
2510 
2511     v4l2_ctrl_grab(channel->mpeg_video_hevc_profile, false);
2512     v4l2_ctrl_grab(channel->mpeg_video_hevc_level, false);
2513     v4l2_ctrl_grab(channel->mpeg_video_hevc_tier, false);
2514     v4l2_ctrl_grab(channel->mpeg_video_hevc_i_frame_qp, false);
2515     v4l2_ctrl_grab(channel->mpeg_video_hevc_max_qp, false);
2516     v4l2_ctrl_grab(channel->mpeg_video_hevc_min_qp, false);
2517     v4l2_ctrl_grab(channel->mpeg_video_hevc_p_frame_qp, false);
2518     v4l2_ctrl_grab(channel->mpeg_video_hevc_b_frame_qp, false);
2519 
2520     v4l2_ctrl_grab(channel->mpeg_video_frame_rc_enable, false);
2521     v4l2_ctrl_grab(channel->mpeg_video_bitrate_mode, false);
2522     v4l2_ctrl_grab(channel->mpeg_video_bitrate, false);
2523     v4l2_ctrl_grab(channel->mpeg_video_bitrate_peak, false);
2524     v4l2_ctrl_grab(channel->mpeg_video_cpb_size, false);
2525     v4l2_ctrl_grab(channel->mpeg_video_gop_size, false);
2526 
2527     v4l2_ctrl_grab(channel->encoder_buffer, false);
2528 
2529     if (channel->user_id != -1) {
2530         clear_bit(channel->user_id, &dev->channel_user_ids);
2531         channel->user_id = -1;
2532     }
2533 }
2534 
2535 /*
2536  * Create the MCU channel
2537  *
2538  * After the channel has been created, the picture size, format, colorspace
2539  * and framerate are fixed. Also the codec, profile, bitrate, etc. cannot be
2540  * changed anymore.
2541  *
2542  * The channel can be created only once. The MCU will accept source buffers
2543  * and stream buffers only after a channel has been created.
2544  */
2545 static int allegro_create_channel(struct allegro_channel *channel)
2546 {
2547     struct allegro_dev *dev = channel->dev;
2548     unsigned long timeout;
2549 
2550     if (channel_exists(channel)) {
2551         v4l2_warn(&dev->v4l2_dev,
2552               "channel already exists\n");
2553         return 0;
2554     }
2555 
2556     channel->user_id = allegro_next_user_id(dev);
2557     if (channel->user_id < 0) {
2558         v4l2_err(&dev->v4l2_dev,
2559              "no free channels available\n");
2560         return -EBUSY;
2561     }
2562     set_bit(channel->user_id, &dev->channel_user_ids);
2563 
2564     v4l2_dbg(1, debug, &dev->v4l2_dev,
2565          "user %d: creating channel (%4.4s, %dx%d@%d)\n",
2566          channel->user_id,
2567          (char *)&channel->codec, channel->width, channel->height,
2568          DIV_ROUND_UP(channel->framerate.numerator,
2569                   channel->framerate.denominator));
2570 
2571     v4l2_ctrl_grab(channel->mpeg_video_h264_profile, true);
2572     v4l2_ctrl_grab(channel->mpeg_video_h264_level, true);
2573     v4l2_ctrl_grab(channel->mpeg_video_h264_i_frame_qp, true);
2574     v4l2_ctrl_grab(channel->mpeg_video_h264_max_qp, true);
2575     v4l2_ctrl_grab(channel->mpeg_video_h264_min_qp, true);
2576     v4l2_ctrl_grab(channel->mpeg_video_h264_p_frame_qp, true);
2577     v4l2_ctrl_grab(channel->mpeg_video_h264_b_frame_qp, true);
2578 
2579     v4l2_ctrl_grab(channel->mpeg_video_hevc_profile, true);
2580     v4l2_ctrl_grab(channel->mpeg_video_hevc_level, true);
2581     v4l2_ctrl_grab(channel->mpeg_video_hevc_tier, true);
2582     v4l2_ctrl_grab(channel->mpeg_video_hevc_i_frame_qp, true);
2583     v4l2_ctrl_grab(channel->mpeg_video_hevc_max_qp, true);
2584     v4l2_ctrl_grab(channel->mpeg_video_hevc_min_qp, true);
2585     v4l2_ctrl_grab(channel->mpeg_video_hevc_p_frame_qp, true);
2586     v4l2_ctrl_grab(channel->mpeg_video_hevc_b_frame_qp, true);
2587 
2588     v4l2_ctrl_grab(channel->mpeg_video_frame_rc_enable, true);
2589     v4l2_ctrl_grab(channel->mpeg_video_bitrate_mode, true);
2590     v4l2_ctrl_grab(channel->mpeg_video_bitrate, true);
2591     v4l2_ctrl_grab(channel->mpeg_video_bitrate_peak, true);
2592     v4l2_ctrl_grab(channel->mpeg_video_cpb_size, true);
2593     v4l2_ctrl_grab(channel->mpeg_video_gop_size, true);
2594 
2595     v4l2_ctrl_grab(channel->encoder_buffer, true);
2596 
2597     reinit_completion(&channel->completion);
2598     allegro_mcu_send_create_channel(dev, channel);
2599     timeout = wait_for_completion_timeout(&channel->completion,
2600                           msecs_to_jiffies(5000));
2601     if (timeout == 0)
2602         channel->error = -ETIMEDOUT;
2603     if (channel->error)
2604         goto err;
2605 
2606     v4l2_dbg(1, debug, &dev->v4l2_dev,
2607          "channel %d: accepting buffers\n",
2608          channel->mcu_channel_id);
2609 
2610     return 0;
2611 
2612 err:
2613     allegro_destroy_channel(channel);
2614 
2615     return channel->error;
2616 }
2617 
2618 /**
2619  * allegro_channel_adjust() - Adjust channel parameters to current format
2620  * @channel: the channel to adjust
2621  *
2622  * Various parameters of a channel and their limits depend on the currently
2623  * set format. Adjust the parameters after a format change in one go.
2624  */
2625 static void allegro_channel_adjust(struct allegro_channel *channel)
2626 {
2627     struct allegro_dev *dev = channel->dev;
2628     u32 codec = channel->codec;
2629     struct v4l2_ctrl *ctrl;
2630     s64 min;
2631     s64 max;
2632 
2633     channel->sizeimage_encoded =
2634         estimate_stream_size(channel->width, channel->height);
2635 
2636     if (codec == V4L2_PIX_FMT_H264) {
2637         ctrl = channel->mpeg_video_h264_level;
2638         min = select_minimum_h264_level(channel->width, channel->height);
2639     } else {
2640         ctrl = channel->mpeg_video_hevc_level;
2641         min = select_minimum_hevc_level(channel->width, channel->height);
2642     }
2643     if (ctrl->minimum > min)
2644         v4l2_dbg(1, debug, &dev->v4l2_dev,
2645              "%s.minimum: %lld -> %lld\n",
2646              v4l2_ctrl_get_name(ctrl->id), ctrl->minimum, min);
2647     v4l2_ctrl_lock(ctrl);
2648     __v4l2_ctrl_modify_range(ctrl, min, ctrl->maximum,
2649                  ctrl->step, ctrl->default_value);
2650     v4l2_ctrl_unlock(ctrl);
2651 
2652     ctrl = channel->mpeg_video_bitrate;
2653     if (codec == V4L2_PIX_FMT_H264)
2654         max = h264_maximum_bitrate(v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_level));
2655     else
2656         max = hevc_maximum_bitrate(v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_level));
2657     if (ctrl->maximum < max)
2658         v4l2_dbg(1, debug, &dev->v4l2_dev,
2659              "%s: maximum: %lld -> %lld\n",
2660              v4l2_ctrl_get_name(ctrl->id), ctrl->maximum, max);
2661     v4l2_ctrl_lock(ctrl);
2662     __v4l2_ctrl_modify_range(ctrl, ctrl->minimum, max,
2663                  ctrl->step, ctrl->default_value);
2664     v4l2_ctrl_unlock(ctrl);
2665 
2666     ctrl = channel->mpeg_video_bitrate_peak;
2667     v4l2_ctrl_lock(ctrl);
2668     __v4l2_ctrl_modify_range(ctrl, ctrl->minimum, max,
2669                  ctrl->step, ctrl->default_value);
2670     v4l2_ctrl_unlock(ctrl);
2671 
2672     v4l2_ctrl_activate(channel->mpeg_video_h264_profile,
2673                codec == V4L2_PIX_FMT_H264);
2674     v4l2_ctrl_activate(channel->mpeg_video_h264_level,
2675                codec == V4L2_PIX_FMT_H264);
2676     v4l2_ctrl_activate(channel->mpeg_video_h264_i_frame_qp,
2677                codec == V4L2_PIX_FMT_H264);
2678     v4l2_ctrl_activate(channel->mpeg_video_h264_max_qp,
2679                codec == V4L2_PIX_FMT_H264);
2680     v4l2_ctrl_activate(channel->mpeg_video_h264_min_qp,
2681                codec == V4L2_PIX_FMT_H264);
2682     v4l2_ctrl_activate(channel->mpeg_video_h264_p_frame_qp,
2683                codec == V4L2_PIX_FMT_H264);
2684     v4l2_ctrl_activate(channel->mpeg_video_h264_b_frame_qp,
2685                codec == V4L2_PIX_FMT_H264);
2686 
2687     v4l2_ctrl_activate(channel->mpeg_video_hevc_profile,
2688                codec == V4L2_PIX_FMT_HEVC);
2689     v4l2_ctrl_activate(channel->mpeg_video_hevc_level,
2690                codec == V4L2_PIX_FMT_HEVC);
2691     v4l2_ctrl_activate(channel->mpeg_video_hevc_tier,
2692                codec == V4L2_PIX_FMT_HEVC);
2693     v4l2_ctrl_activate(channel->mpeg_video_hevc_i_frame_qp,
2694                codec == V4L2_PIX_FMT_HEVC);
2695     v4l2_ctrl_activate(channel->mpeg_video_hevc_max_qp,
2696                codec == V4L2_PIX_FMT_HEVC);
2697     v4l2_ctrl_activate(channel->mpeg_video_hevc_min_qp,
2698                codec == V4L2_PIX_FMT_HEVC);
2699     v4l2_ctrl_activate(channel->mpeg_video_hevc_p_frame_qp,
2700                codec == V4L2_PIX_FMT_HEVC);
2701     v4l2_ctrl_activate(channel->mpeg_video_hevc_b_frame_qp,
2702                codec == V4L2_PIX_FMT_HEVC);
2703 
2704     if (codec == V4L2_PIX_FMT_H264)
2705         channel->log2_max_frame_num = LOG2_MAX_FRAME_NUM;
2706     channel->temporal_mvp_enable = true;
2707     channel->dbf_ovr_en = (codec == V4L2_PIX_FMT_H264);
2708     channel->enable_deblocking_filter_override = (codec == V4L2_PIX_FMT_HEVC);
2709     channel->enable_reordering = (codec == V4L2_PIX_FMT_HEVC);
2710     channel->enable_loop_filter_across_tiles = true;
2711     channel->enable_loop_filter_across_slices = true;
2712 
2713     if (codec == V4L2_PIX_FMT_H264) {
2714         channel->b_hrz_me_range = 8;
2715         channel->b_vrt_me_range = 8;
2716         channel->p_hrz_me_range = 16;
2717         channel->p_vrt_me_range = 16;
2718         channel->max_cu_size = ilog2(16);
2719         channel->min_cu_size = ilog2(8);
2720         channel->max_tu_size = ilog2(4);
2721         channel->min_tu_size = ilog2(4);
2722     } else {
2723         channel->b_hrz_me_range = 16;
2724         channel->b_vrt_me_range = 16;
2725         channel->p_hrz_me_range = 32;
2726         channel->p_vrt_me_range = 32;
2727         channel->max_cu_size = ilog2(32);
2728         channel->min_cu_size = ilog2(8);
2729         channel->max_tu_size = ilog2(32);
2730         channel->min_tu_size = ilog2(4);
2731     }
2732     channel->max_transfo_depth_intra = 1;
2733     channel->max_transfo_depth_inter = 1;
2734 }
2735 
2736 static void allegro_set_default_params(struct allegro_channel *channel)
2737 {
2738     channel->width = ALLEGRO_WIDTH_DEFAULT;
2739     channel->height = ALLEGRO_HEIGHT_DEFAULT;
2740     channel->stride = round_up(channel->width, 32);
2741     channel->framerate = ALLEGRO_FRAMERATE_DEFAULT;
2742 
2743     channel->colorspace = V4L2_COLORSPACE_REC709;
2744     channel->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
2745     channel->quantization = V4L2_QUANTIZATION_DEFAULT;
2746     channel->xfer_func = V4L2_XFER_FUNC_DEFAULT;
2747 
2748     channel->pixelformat = V4L2_PIX_FMT_NV12;
2749     channel->sizeimage_raw = channel->stride * channel->height * 3 / 2;
2750 
2751     channel->codec = V4L2_PIX_FMT_H264;
2752 }
2753 
2754 static int allegro_queue_setup(struct vb2_queue *vq,
2755                    unsigned int *nbuffers, unsigned int *nplanes,
2756                    unsigned int sizes[],
2757                    struct device *alloc_devs[])
2758 {
2759     struct allegro_channel *channel = vb2_get_drv_priv(vq);
2760     struct allegro_dev *dev = channel->dev;
2761 
2762     v4l2_dbg(2, debug, &dev->v4l2_dev,
2763          "%s: queue setup[%s]: nplanes = %d\n",
2764          V4L2_TYPE_IS_OUTPUT(vq->type) ? "output" : "capture",
2765          *nplanes == 0 ? "REQBUFS" : "CREATE_BUFS", *nplanes);
2766 
2767     if (*nplanes != 0) {
2768         if (V4L2_TYPE_IS_OUTPUT(vq->type)) {
2769             if (sizes[0] < channel->sizeimage_raw)
2770                 return -EINVAL;
2771         } else {
2772             if (sizes[0] < channel->sizeimage_encoded)
2773                 return -EINVAL;
2774         }
2775     } else {
2776         *nplanes = 1;
2777         if (V4L2_TYPE_IS_OUTPUT(vq->type))
2778             sizes[0] = channel->sizeimage_raw;
2779         else
2780             sizes[0] = channel->sizeimage_encoded;
2781     }
2782 
2783     return 0;
2784 }
2785 
2786 static int allegro_buf_prepare(struct vb2_buffer *vb)
2787 {
2788     struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
2789     struct allegro_channel *channel = vb2_get_drv_priv(vb->vb2_queue);
2790     struct allegro_dev *dev = channel->dev;
2791 
2792     if (V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
2793         if (vbuf->field == V4L2_FIELD_ANY)
2794             vbuf->field = V4L2_FIELD_NONE;
2795         if (vbuf->field != V4L2_FIELD_NONE) {
2796             v4l2_err(&dev->v4l2_dev,
2797                  "channel %d: unsupported field\n",
2798                  channel->mcu_channel_id);
2799             return -EINVAL;
2800         }
2801     }
2802 
2803     return 0;
2804 }
2805 
2806 static void allegro_buf_queue(struct vb2_buffer *vb)
2807 {
2808     struct allegro_channel *channel = vb2_get_drv_priv(vb->vb2_queue);
2809     struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
2810     struct vb2_queue *q = vb->vb2_queue;
2811 
2812     if (V4L2_TYPE_IS_CAPTURE(q->type) &&
2813         vb2_is_streaming(q) &&
2814         v4l2_m2m_dst_buf_is_last(channel->fh.m2m_ctx)) {
2815         unsigned int i;
2816 
2817         for (i = 0; i < vb->num_planes; i++)
2818             vb2_set_plane_payload(vb, i, 0);
2819 
2820         vbuf->field = V4L2_FIELD_NONE;
2821         vbuf->sequence = channel->csequence++;
2822 
2823         v4l2_m2m_last_buffer_done(channel->fh.m2m_ctx, vbuf);
2824         allegro_channel_eos_event(channel);
2825         return;
2826     }
2827 
2828     v4l2_m2m_buf_queue(channel->fh.m2m_ctx, vbuf);
2829 }
2830 
2831 static int allegro_start_streaming(struct vb2_queue *q, unsigned int count)
2832 {
2833     struct allegro_channel *channel = vb2_get_drv_priv(q);
2834     struct allegro_dev *dev = channel->dev;
2835 
2836     v4l2_dbg(2, debug, &dev->v4l2_dev,
2837          "%s: start streaming\n",
2838          V4L2_TYPE_IS_OUTPUT(q->type) ? "output" : "capture");
2839 
2840     v4l2_m2m_update_start_streaming_state(channel->fh.m2m_ctx, q);
2841 
2842     if (V4L2_TYPE_IS_OUTPUT(q->type))
2843         channel->osequence = 0;
2844     else
2845         channel->csequence = 0;
2846 
2847     return 0;
2848 }
2849 
2850 static void allegro_stop_streaming(struct vb2_queue *q)
2851 {
2852     struct allegro_channel *channel = vb2_get_drv_priv(q);
2853     struct allegro_dev *dev = channel->dev;
2854     struct vb2_v4l2_buffer *buffer;
2855     struct allegro_m2m_buffer *shadow, *tmp;
2856 
2857     v4l2_dbg(2, debug, &dev->v4l2_dev,
2858          "%s: stop streaming\n",
2859          V4L2_TYPE_IS_OUTPUT(q->type) ? "output" : "capture");
2860 
2861     if (V4L2_TYPE_IS_OUTPUT(q->type)) {
2862         mutex_lock(&channel->shadow_list_lock);
2863         list_for_each_entry_safe(shadow, tmp,
2864                      &channel->source_shadow_list, head) {
2865             list_del(&shadow->head);
2866             v4l2_m2m_buf_done(&shadow->buf.vb, VB2_BUF_STATE_ERROR);
2867         }
2868         mutex_unlock(&channel->shadow_list_lock);
2869 
2870         while ((buffer = v4l2_m2m_src_buf_remove(channel->fh.m2m_ctx)))
2871             v4l2_m2m_buf_done(buffer, VB2_BUF_STATE_ERROR);
2872     } else {
2873         mutex_lock(&channel->shadow_list_lock);
2874         list_for_each_entry_safe(shadow, tmp,
2875                      &channel->stream_shadow_list, head) {
2876             list_del(&shadow->head);
2877             v4l2_m2m_buf_done(&shadow->buf.vb, VB2_BUF_STATE_ERROR);
2878         }
2879         mutex_unlock(&channel->shadow_list_lock);
2880 
2881         allegro_destroy_channel(channel);
2882         while ((buffer = v4l2_m2m_dst_buf_remove(channel->fh.m2m_ctx)))
2883             v4l2_m2m_buf_done(buffer, VB2_BUF_STATE_ERROR);
2884     }
2885 
2886     v4l2_m2m_update_stop_streaming_state(channel->fh.m2m_ctx, q);
2887 
2888     if (V4L2_TYPE_IS_OUTPUT(q->type) &&
2889         v4l2_m2m_has_stopped(channel->fh.m2m_ctx))
2890         allegro_channel_eos_event(channel);
2891 }
2892 
2893 static const struct vb2_ops allegro_queue_ops = {
2894     .queue_setup = allegro_queue_setup,
2895     .buf_prepare = allegro_buf_prepare,
2896     .buf_queue = allegro_buf_queue,
2897     .start_streaming = allegro_start_streaming,
2898     .stop_streaming = allegro_stop_streaming,
2899     .wait_prepare = vb2_ops_wait_prepare,
2900     .wait_finish = vb2_ops_wait_finish,
2901 };
2902 
2903 static int allegro_queue_init(void *priv,
2904                   struct vb2_queue *src_vq,
2905                   struct vb2_queue *dst_vq)
2906 {
2907     int err;
2908     struct allegro_channel *channel = priv;
2909 
2910     src_vq->dev = &channel->dev->plat_dev->dev;
2911     src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
2912     src_vq->io_modes = VB2_DMABUF | VB2_MMAP;
2913     src_vq->mem_ops = &vb2_dma_contig_memops;
2914     src_vq->drv_priv = channel;
2915     src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2916     src_vq->ops = &allegro_queue_ops;
2917     src_vq->buf_struct_size = sizeof(struct allegro_m2m_buffer);
2918     src_vq->lock = &channel->dev->lock;
2919     err = vb2_queue_init(src_vq);
2920     if (err)
2921         return err;
2922 
2923     dst_vq->dev = &channel->dev->plat_dev->dev;
2924     dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
2925     dst_vq->io_modes = VB2_DMABUF | VB2_MMAP;
2926     dst_vq->mem_ops = &vb2_dma_contig_memops;
2927     dst_vq->drv_priv = channel;
2928     dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
2929     dst_vq->ops = &allegro_queue_ops;
2930     dst_vq->buf_struct_size = sizeof(struct allegro_m2m_buffer);
2931     dst_vq->lock = &channel->dev->lock;
2932     err = vb2_queue_init(dst_vq);
2933     if (err)
2934         return err;
2935 
2936     return 0;
2937 }
2938 
2939 static int allegro_clamp_qp(struct allegro_channel *channel,
2940                 struct v4l2_ctrl *ctrl)
2941 {
2942     struct v4l2_ctrl *next_ctrl;
2943 
2944     if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP)
2945         next_ctrl = channel->mpeg_video_h264_p_frame_qp;
2946     else if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP)
2947         next_ctrl = channel->mpeg_video_h264_b_frame_qp;
2948     else
2949         return 0;
2950 
2951     /* Modify range automatically updates the value */
2952     __v4l2_ctrl_modify_range(next_ctrl, ctrl->val, 51, 1, ctrl->val);
2953 
2954     return allegro_clamp_qp(channel, next_ctrl);
2955 }
2956 
2957 static int allegro_clamp_bitrate(struct allegro_channel *channel,
2958                  struct v4l2_ctrl *ctrl)
2959 {
2960     struct v4l2_ctrl *ctrl_bitrate = channel->mpeg_video_bitrate;
2961     struct v4l2_ctrl *ctrl_bitrate_peak = channel->mpeg_video_bitrate_peak;
2962 
2963     if (ctrl->val == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR &&
2964         ctrl_bitrate_peak->val < ctrl_bitrate->val)
2965         ctrl_bitrate_peak->val = ctrl_bitrate->val;
2966 
2967     return 0;
2968 }
2969 
2970 static int allegro_try_ctrl(struct v4l2_ctrl *ctrl)
2971 {
2972     struct allegro_channel *channel = container_of(ctrl->handler,
2973                                struct allegro_channel,
2974                                ctrl_handler);
2975 
2976     switch (ctrl->id) {
2977     case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
2978         allegro_clamp_bitrate(channel, ctrl);
2979         break;
2980     case V4L2_CID_USER_ALLEGRO_ENCODER_BUFFER:
2981         if (!channel->dev->has_encoder_buffer)
2982             ctrl->val = 0;
2983         break;
2984     }
2985 
2986     return 0;
2987 }
2988 
2989 static int allegro_s_ctrl(struct v4l2_ctrl *ctrl)
2990 {
2991     struct allegro_channel *channel = container_of(ctrl->handler,
2992                                struct allegro_channel,
2993                                ctrl_handler);
2994     struct allegro_dev *dev = channel->dev;
2995 
2996     v4l2_dbg(1, debug, &dev->v4l2_dev,
2997          "s_ctrl: %s = %d\n", v4l2_ctrl_get_name(ctrl->id), ctrl->val);
2998 
2999     switch (ctrl->id) {
3000     case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
3001         channel->frame_rc_enable = ctrl->val;
3002         break;
3003     case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
3004         channel->bitrate = channel->mpeg_video_bitrate->val;
3005         channel->bitrate_peak = channel->mpeg_video_bitrate_peak->val;
3006         v4l2_ctrl_activate(channel->mpeg_video_bitrate_peak,
3007                    ctrl->val == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR);
3008         break;
3009     case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:
3010     case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:
3011     case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP:
3012         allegro_clamp_qp(channel, ctrl);
3013         break;
3014     }
3015 
3016     return 0;
3017 }
3018 
3019 static const struct v4l2_ctrl_ops allegro_ctrl_ops = {
3020     .try_ctrl = allegro_try_ctrl,
3021     .s_ctrl = allegro_s_ctrl,
3022 };
3023 
3024 static const struct v4l2_ctrl_config allegro_encoder_buffer_ctrl_config = {
3025     .id = V4L2_CID_USER_ALLEGRO_ENCODER_BUFFER,
3026     .name = "Encoder Buffer Enable",
3027     .type = V4L2_CTRL_TYPE_BOOLEAN,
3028     .min = 0,
3029     .max = 1,
3030     .step = 1,
3031     .def = 1,
3032 };
3033 
3034 static int allegro_open(struct file *file)
3035 {
3036     struct video_device *vdev = video_devdata(file);
3037     struct allegro_dev *dev = video_get_drvdata(vdev);
3038     struct allegro_channel *channel = NULL;
3039     struct v4l2_ctrl_handler *handler;
3040     u64 mask;
3041     int ret;
3042     unsigned int bitrate_max;
3043     unsigned int bitrate_def;
3044     unsigned int cpb_size_max;
3045     unsigned int cpb_size_def;
3046 
3047     channel = kzalloc(sizeof(*channel), GFP_KERNEL);
3048     if (!channel)
3049         return -ENOMEM;
3050 
3051     v4l2_fh_init(&channel->fh, vdev);
3052 
3053     init_completion(&channel->completion);
3054     INIT_LIST_HEAD(&channel->source_shadow_list);
3055     INIT_LIST_HEAD(&channel->stream_shadow_list);
3056     mutex_init(&channel->shadow_list_lock);
3057 
3058     channel->dev = dev;
3059 
3060     allegro_set_default_params(channel);
3061 
3062     handler = &channel->ctrl_handler;
3063     v4l2_ctrl_handler_init(handler, 0);
3064     channel->mpeg_video_h264_profile = v4l2_ctrl_new_std_menu(handler,
3065             &allegro_ctrl_ops,
3066             V4L2_CID_MPEG_VIDEO_H264_PROFILE,
3067             V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE, 0x0,
3068             V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE);
3069     mask = 1 << V4L2_MPEG_VIDEO_H264_LEVEL_1B;
3070     channel->mpeg_video_h264_level = v4l2_ctrl_new_std_menu(handler,
3071             &allegro_ctrl_ops,
3072             V4L2_CID_MPEG_VIDEO_H264_LEVEL,
3073             V4L2_MPEG_VIDEO_H264_LEVEL_5_1, mask,
3074             V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
3075     channel->mpeg_video_h264_i_frame_qp =
3076         v4l2_ctrl_new_std(handler,
3077                   &allegro_ctrl_ops,
3078                   V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
3079                   0, 51, 1, 30);
3080     channel->mpeg_video_h264_max_qp =
3081         v4l2_ctrl_new_std(handler,
3082                   &allegro_ctrl_ops,
3083                   V4L2_CID_MPEG_VIDEO_H264_MAX_QP,
3084                   0, 51, 1, 51);
3085     channel->mpeg_video_h264_min_qp =
3086         v4l2_ctrl_new_std(handler,
3087                   &allegro_ctrl_ops,
3088                   V4L2_CID_MPEG_VIDEO_H264_MIN_QP,
3089                   0, 51, 1, 0);
3090     channel->mpeg_video_h264_p_frame_qp =
3091         v4l2_ctrl_new_std(handler,
3092                   &allegro_ctrl_ops,
3093                   V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP,
3094                   0, 51, 1, 30);
3095     channel->mpeg_video_h264_b_frame_qp =
3096         v4l2_ctrl_new_std(handler,
3097                   &allegro_ctrl_ops,
3098                   V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP,
3099                   0, 51, 1, 30);
3100 
3101     channel->mpeg_video_hevc_profile =
3102         v4l2_ctrl_new_std_menu(handler,
3103                        &allegro_ctrl_ops,
3104                        V4L2_CID_MPEG_VIDEO_HEVC_PROFILE,
3105                        V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN, 0x0,
3106                        V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN);
3107     channel->mpeg_video_hevc_level =
3108         v4l2_ctrl_new_std_menu(handler,
3109                        &allegro_ctrl_ops,
3110                        V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,
3111                        V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1, 0x0,
3112                        V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1);
3113     channel->mpeg_video_hevc_tier =
3114         v4l2_ctrl_new_std_menu(handler,
3115                        &allegro_ctrl_ops,
3116                        V4L2_CID_MPEG_VIDEO_HEVC_TIER,
3117                        V4L2_MPEG_VIDEO_HEVC_TIER_HIGH, 0x0,
3118                        V4L2_MPEG_VIDEO_HEVC_TIER_MAIN);
3119     channel->mpeg_video_hevc_i_frame_qp =
3120         v4l2_ctrl_new_std(handler,
3121                   &allegro_ctrl_ops,
3122                   V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP,
3123                   0, 51, 1, 30);
3124     channel->mpeg_video_hevc_max_qp =
3125         v4l2_ctrl_new_std(handler,
3126                   &allegro_ctrl_ops,
3127                   V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP,
3128                   0, 51, 1, 51);
3129     channel->mpeg_video_hevc_min_qp =
3130         v4l2_ctrl_new_std(handler,
3131                   &allegro_ctrl_ops,
3132                   V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP,
3133                   0, 51, 1, 0);
3134     channel->mpeg_video_hevc_p_frame_qp =
3135         v4l2_ctrl_new_std(handler,
3136                   &allegro_ctrl_ops,
3137                   V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP,
3138                   0, 51, 1, 30);
3139     channel->mpeg_video_hevc_b_frame_qp =
3140         v4l2_ctrl_new_std(handler,
3141                   &allegro_ctrl_ops,
3142                   V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP,
3143                   0, 51, 1, 30);
3144 
3145     channel->mpeg_video_frame_rc_enable =
3146         v4l2_ctrl_new_std(handler,
3147                   &allegro_ctrl_ops,
3148                   V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE,
3149                   false, 0x1,
3150                   true, false);
3151     channel->mpeg_video_bitrate_mode = v4l2_ctrl_new_std_menu(handler,
3152             &allegro_ctrl_ops,
3153             V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
3154             V4L2_MPEG_VIDEO_BITRATE_MODE_CBR, 0,
3155             V4L2_MPEG_VIDEO_BITRATE_MODE_CBR);
3156 
3157     if (channel->codec == V4L2_PIX_FMT_H264) {
3158         bitrate_max = h264_maximum_bitrate(V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
3159         bitrate_def = h264_maximum_bitrate(V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
3160         cpb_size_max = h264_maximum_cpb_size(V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
3161         cpb_size_def = h264_maximum_cpb_size(V4L2_MPEG_VIDEO_H264_LEVEL_5_1);
3162     } else {
3163         bitrate_max = hevc_maximum_bitrate(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1);
3164         bitrate_def = hevc_maximum_bitrate(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1);
3165         cpb_size_max = hevc_maximum_cpb_size(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1);
3166         cpb_size_def = hevc_maximum_cpb_size(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1);
3167     }
3168     channel->mpeg_video_bitrate = v4l2_ctrl_new_std(handler,
3169             &allegro_ctrl_ops,
3170             V4L2_CID_MPEG_VIDEO_BITRATE,
3171             0, bitrate_max, 1, bitrate_def);
3172     channel->mpeg_video_bitrate_peak = v4l2_ctrl_new_std(handler,
3173             &allegro_ctrl_ops,
3174             V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
3175             0, bitrate_max, 1, bitrate_def);
3176     channel->mpeg_video_cpb_size = v4l2_ctrl_new_std(handler,
3177             &allegro_ctrl_ops,
3178             V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE,
3179             0, cpb_size_max, 1, cpb_size_def);
3180     channel->mpeg_video_gop_size = v4l2_ctrl_new_std(handler,
3181             &allegro_ctrl_ops,
3182             V4L2_CID_MPEG_VIDEO_GOP_SIZE,
3183             0, ALLEGRO_GOP_SIZE_MAX,
3184             1, ALLEGRO_GOP_SIZE_DEFAULT);
3185     channel->encoder_buffer = v4l2_ctrl_new_custom(handler,
3186             &allegro_encoder_buffer_ctrl_config, NULL);
3187     v4l2_ctrl_new_std(handler,
3188               &allegro_ctrl_ops,
3189               V4L2_CID_MIN_BUFFERS_FOR_OUTPUT,
3190               1, 32,
3191               1, 1);
3192     if (handler->error != 0) {
3193         ret = handler->error;
3194         goto error;
3195     }
3196 
3197     channel->fh.ctrl_handler = handler;
3198 
3199     v4l2_ctrl_cluster(3, &channel->mpeg_video_bitrate_mode);
3200 
3201     v4l2_ctrl_handler_setup(handler);
3202 
3203     channel->mcu_channel_id = -1;
3204     channel->user_id = -1;
3205 
3206     INIT_LIST_HEAD(&channel->buffers_reference);
3207     INIT_LIST_HEAD(&channel->buffers_intermediate);
3208 
3209     channel->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev, channel,
3210                         allegro_queue_init);
3211 
3212     if (IS_ERR(channel->fh.m2m_ctx)) {
3213         ret = PTR_ERR(channel->fh.m2m_ctx);
3214         goto error;
3215     }
3216 
3217     list_add(&channel->list, &dev->channels);
3218     file->private_data = &channel->fh;
3219     v4l2_fh_add(&channel->fh);
3220 
3221     allegro_channel_adjust(channel);
3222 
3223     return 0;
3224 
3225 error:
3226     v4l2_ctrl_handler_free(handler);
3227     kfree(channel);
3228     return ret;
3229 }
3230 
3231 static int allegro_release(struct file *file)
3232 {
3233     struct allegro_channel *channel = fh_to_channel(file->private_data);
3234 
3235     v4l2_m2m_ctx_release(channel->fh.m2m_ctx);
3236 
3237     list_del(&channel->list);
3238 
3239     v4l2_ctrl_handler_free(&channel->ctrl_handler);
3240 
3241     v4l2_fh_del(&channel->fh);
3242     v4l2_fh_exit(&channel->fh);
3243 
3244     kfree(channel);
3245 
3246     return 0;
3247 }
3248 
3249 static int allegro_querycap(struct file *file, void *fh,
3250                 struct v4l2_capability *cap)
3251 {
3252     strscpy(cap->driver, KBUILD_MODNAME, sizeof(cap->driver));
3253     strscpy(cap->card, "Allegro DVT Video Encoder", sizeof(cap->card));
3254 
3255     return 0;
3256 }
3257 
3258 static int allegro_enum_fmt_vid(struct file *file, void *fh,
3259                 struct v4l2_fmtdesc *f)
3260 {
3261     switch (f->type) {
3262     case V4L2_BUF_TYPE_VIDEO_OUTPUT:
3263         if (f->index >= 1)
3264             return -EINVAL;
3265         f->pixelformat = V4L2_PIX_FMT_NV12;
3266         break;
3267     case V4L2_BUF_TYPE_VIDEO_CAPTURE:
3268         if (f->index >= 2)
3269             return -EINVAL;
3270         if (f->index == 0)
3271             f->pixelformat = V4L2_PIX_FMT_H264;
3272         if (f->index == 1)
3273             f->pixelformat = V4L2_PIX_FMT_HEVC;
3274         break;
3275     default:
3276         return -EINVAL;
3277     }
3278     return 0;
3279 }
3280 
3281 static int allegro_g_fmt_vid_cap(struct file *file, void *fh,
3282                  struct v4l2_format *f)
3283 {
3284     struct allegro_channel *channel = fh_to_channel(fh);
3285 
3286     f->fmt.pix.field = V4L2_FIELD_NONE;
3287     f->fmt.pix.width = channel->width;
3288     f->fmt.pix.height = channel->height;
3289 
3290     f->fmt.pix.colorspace = channel->colorspace;
3291     f->fmt.pix.ycbcr_enc = channel->ycbcr_enc;
3292     f->fmt.pix.quantization = channel->quantization;
3293     f->fmt.pix.xfer_func = channel->xfer_func;
3294 
3295     f->fmt.pix.pixelformat = channel->codec;
3296     f->fmt.pix.bytesperline = 0;
3297     f->fmt.pix.sizeimage = channel->sizeimage_encoded;
3298 
3299     return 0;
3300 }
3301 
3302 static int allegro_try_fmt_vid_cap(struct file *file, void *fh,
3303                    struct v4l2_format *f)
3304 {
3305     f->fmt.pix.field = V4L2_FIELD_NONE;
3306 
3307     f->fmt.pix.width = clamp_t(__u32, f->fmt.pix.width,
3308                    ALLEGRO_WIDTH_MIN, ALLEGRO_WIDTH_MAX);
3309     f->fmt.pix.height = clamp_t(__u32, f->fmt.pix.height,
3310                     ALLEGRO_HEIGHT_MIN, ALLEGRO_HEIGHT_MAX);
3311 
3312     if (f->fmt.pix.pixelformat != V4L2_PIX_FMT_HEVC &&
3313         f->fmt.pix.pixelformat != V4L2_PIX_FMT_H264)
3314         f->fmt.pix.pixelformat = V4L2_PIX_FMT_H264;
3315 
3316     f->fmt.pix.bytesperline = 0;
3317     f->fmt.pix.sizeimage =
3318         estimate_stream_size(f->fmt.pix.width, f->fmt.pix.height);
3319 
3320     return 0;
3321 }
3322 
3323 static int allegro_s_fmt_vid_cap(struct file *file, void *fh,
3324                  struct v4l2_format *f)
3325 {
3326     struct allegro_channel *channel = fh_to_channel(fh);
3327     struct vb2_queue *vq;
3328     int err;
3329 
3330     err = allegro_try_fmt_vid_cap(file, fh, f);
3331     if (err)
3332         return err;
3333 
3334     vq = v4l2_m2m_get_vq(channel->fh.m2m_ctx, f->type);
3335     if (!vq)
3336         return -EINVAL;
3337     if (vb2_is_busy(vq))
3338         return -EBUSY;
3339 
3340     channel->codec = f->fmt.pix.pixelformat;
3341 
3342     allegro_channel_adjust(channel);
3343 
3344     return 0;
3345 }
3346 
3347 static int allegro_g_fmt_vid_out(struct file *file, void *fh,
3348                  struct v4l2_format *f)
3349 {
3350     struct allegro_channel *channel = fh_to_channel(fh);
3351 
3352     f->fmt.pix.field = V4L2_FIELD_NONE;
3353 
3354     f->fmt.pix.width = channel->width;
3355     f->fmt.pix.height = channel->height;
3356 
3357     f->fmt.pix.colorspace = channel->colorspace;
3358     f->fmt.pix.ycbcr_enc = channel->ycbcr_enc;
3359     f->fmt.pix.quantization = channel->quantization;
3360     f->fmt.pix.xfer_func = channel->xfer_func;
3361 
3362     f->fmt.pix.pixelformat = channel->pixelformat;
3363     f->fmt.pix.bytesperline = channel->stride;
3364     f->fmt.pix.sizeimage = channel->sizeimage_raw;
3365 
3366     return 0;
3367 }
3368 
3369 static int allegro_try_fmt_vid_out(struct file *file, void *fh,
3370                    struct v4l2_format *f)
3371 {
3372     f->fmt.pix.field = V4L2_FIELD_NONE;
3373 
3374     /*
3375      * The firmware of the Allegro codec handles the padding internally
3376      * and expects the visual frame size when configuring a channel.
3377      * Therefore, unlike other encoder drivers, this driver does not round
3378      * up the width and height to macroblock alignment and does not
3379      * implement the selection api.
3380      */
3381     f->fmt.pix.width = clamp_t(__u32, f->fmt.pix.width,
3382                    ALLEGRO_WIDTH_MIN, ALLEGRO_WIDTH_MAX);
3383     f->fmt.pix.height = clamp_t(__u32, f->fmt.pix.height,
3384                     ALLEGRO_HEIGHT_MIN, ALLEGRO_HEIGHT_MAX);
3385 
3386     f->fmt.pix.pixelformat = V4L2_PIX_FMT_NV12;
3387     f->fmt.pix.bytesperline = round_up(f->fmt.pix.width, 32);
3388     f->fmt.pix.sizeimage =
3389         f->fmt.pix.bytesperline * f->fmt.pix.height * 3 / 2;
3390 
3391     return 0;
3392 }
3393 
3394 static int allegro_s_fmt_vid_out(struct file *file, void *fh,
3395                  struct v4l2_format *f)
3396 {
3397     struct allegro_channel *channel = fh_to_channel(fh);
3398     int err;
3399 
3400     err = allegro_try_fmt_vid_out(file, fh, f);
3401     if (err)
3402         return err;
3403 
3404     channel->width = f->fmt.pix.width;
3405     channel->height = f->fmt.pix.height;
3406     channel->stride = f->fmt.pix.bytesperline;
3407     channel->sizeimage_raw = f->fmt.pix.sizeimage;
3408 
3409     channel->colorspace = f->fmt.pix.colorspace;
3410     channel->ycbcr_enc = f->fmt.pix.ycbcr_enc;
3411     channel->quantization = f->fmt.pix.quantization;
3412     channel->xfer_func = f->fmt.pix.xfer_func;
3413 
3414     allegro_channel_adjust(channel);
3415 
3416     return 0;
3417 }
3418 
3419 static int allegro_channel_cmd_stop(struct allegro_channel *channel)
3420 {
3421     if (v4l2_m2m_has_stopped(channel->fh.m2m_ctx))
3422         allegro_channel_eos_event(channel);
3423 
3424     return 0;
3425 }
3426 
3427 static int allegro_channel_cmd_start(struct allegro_channel *channel)
3428 {
3429     if (v4l2_m2m_has_stopped(channel->fh.m2m_ctx))
3430         vb2_clear_last_buffer_dequeued(&channel->fh.m2m_ctx->cap_q_ctx.q);
3431 
3432     return 0;
3433 }
3434 
3435 static int allegro_encoder_cmd(struct file *file, void *fh,
3436                    struct v4l2_encoder_cmd *cmd)
3437 {
3438     struct allegro_channel *channel = fh_to_channel(fh);
3439     int err;
3440 
3441     err = v4l2_m2m_ioctl_try_encoder_cmd(file, fh, cmd);
3442     if (err)
3443         return err;
3444 
3445     err = v4l2_m2m_ioctl_encoder_cmd(file, fh, cmd);
3446     if (err)
3447         return err;
3448 
3449     if (cmd->cmd == V4L2_ENC_CMD_STOP)
3450         err = allegro_channel_cmd_stop(channel);
3451 
3452     if (cmd->cmd == V4L2_ENC_CMD_START)
3453         err = allegro_channel_cmd_start(channel);
3454 
3455     return err;
3456 }
3457 
3458 static int allegro_enum_framesizes(struct file *file, void *fh,
3459                    struct v4l2_frmsizeenum *fsize)
3460 {
3461     switch (fsize->pixel_format) {
3462     case V4L2_PIX_FMT_HEVC:
3463     case V4L2_PIX_FMT_H264:
3464     case V4L2_PIX_FMT_NV12:
3465         break;
3466     default:
3467         return -EINVAL;
3468     }
3469 
3470     if (fsize->index)
3471         return -EINVAL;
3472 
3473     fsize->type = V4L2_FRMSIZE_TYPE_CONTINUOUS;
3474     fsize->stepwise.min_width = ALLEGRO_WIDTH_MIN;
3475     fsize->stepwise.max_width = ALLEGRO_WIDTH_MAX;
3476     fsize->stepwise.step_width = 1;
3477     fsize->stepwise.min_height = ALLEGRO_HEIGHT_MIN;
3478     fsize->stepwise.max_height = ALLEGRO_HEIGHT_MAX;
3479     fsize->stepwise.step_height = 1;
3480 
3481     return 0;
3482 }
3483 
3484 static int allegro_ioctl_streamon(struct file *file, void *priv,
3485                   enum v4l2_buf_type type)
3486 {
3487     struct v4l2_fh *fh = file->private_data;
3488     struct allegro_channel *channel = fh_to_channel(fh);
3489     int err;
3490 
3491     if (type == V4L2_BUF_TYPE_VIDEO_CAPTURE) {
3492         err = allegro_create_channel(channel);
3493         if (err)
3494             return err;
3495     }
3496 
3497     return v4l2_m2m_streamon(file, fh->m2m_ctx, type);
3498 }
3499 
3500 static int allegro_g_parm(struct file *file, void *fh,
3501               struct v4l2_streamparm *a)
3502 {
3503     struct allegro_channel *channel = fh_to_channel(fh);
3504     struct v4l2_fract *timeperframe;
3505 
3506     if (a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
3507         return -EINVAL;
3508 
3509     a->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
3510     timeperframe = &a->parm.output.timeperframe;
3511     timeperframe->numerator = channel->framerate.denominator;
3512     timeperframe->denominator = channel->framerate.numerator;
3513 
3514     return 0;
3515 }
3516 
3517 static int allegro_s_parm(struct file *file, void *fh,
3518               struct v4l2_streamparm *a)
3519 {
3520     struct allegro_channel *channel = fh_to_channel(fh);
3521     struct v4l2_fract *timeperframe;
3522     int div;
3523 
3524     if (a->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
3525         return -EINVAL;
3526 
3527     a->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
3528     timeperframe = &a->parm.output.timeperframe;
3529 
3530     if (timeperframe->numerator == 0 || timeperframe->denominator == 0)
3531         return allegro_g_parm(file, fh, a);
3532 
3533     div = gcd(timeperframe->denominator, timeperframe->numerator);
3534     channel->framerate.numerator = timeperframe->denominator / div;
3535     channel->framerate.denominator = timeperframe->numerator / div;
3536 
3537     return 0;
3538 }
3539 
3540 static int allegro_subscribe_event(struct v4l2_fh *fh,
3541                    const struct v4l2_event_subscription *sub)
3542 {
3543     switch (sub->type) {
3544     case V4L2_EVENT_EOS:
3545         return v4l2_event_subscribe(fh, sub, 0, NULL);
3546     default:
3547         return v4l2_ctrl_subscribe_event(fh, sub);
3548     }
3549 }
3550 
3551 static const struct v4l2_ioctl_ops allegro_ioctl_ops = {
3552     .vidioc_querycap = allegro_querycap,
3553     .vidioc_enum_fmt_vid_cap = allegro_enum_fmt_vid,
3554     .vidioc_enum_fmt_vid_out = allegro_enum_fmt_vid,
3555     .vidioc_g_fmt_vid_cap = allegro_g_fmt_vid_cap,
3556     .vidioc_try_fmt_vid_cap = allegro_try_fmt_vid_cap,
3557     .vidioc_s_fmt_vid_cap = allegro_s_fmt_vid_cap,
3558     .vidioc_g_fmt_vid_out = allegro_g_fmt_vid_out,
3559     .vidioc_try_fmt_vid_out = allegro_try_fmt_vid_out,
3560     .vidioc_s_fmt_vid_out = allegro_s_fmt_vid_out,
3561 
3562     .vidioc_create_bufs = v4l2_m2m_ioctl_create_bufs,
3563     .vidioc_reqbufs = v4l2_m2m_ioctl_reqbufs,
3564 
3565     .vidioc_expbuf = v4l2_m2m_ioctl_expbuf,
3566     .vidioc_querybuf = v4l2_m2m_ioctl_querybuf,
3567     .vidioc_qbuf = v4l2_m2m_ioctl_qbuf,
3568     .vidioc_dqbuf = v4l2_m2m_ioctl_dqbuf,
3569     .vidioc_prepare_buf = v4l2_m2m_ioctl_prepare_buf,
3570 
3571     .vidioc_streamon = allegro_ioctl_streamon,
3572     .vidioc_streamoff = v4l2_m2m_ioctl_streamoff,
3573 
3574     .vidioc_try_encoder_cmd = v4l2_m2m_ioctl_try_encoder_cmd,
3575     .vidioc_encoder_cmd = allegro_encoder_cmd,
3576     .vidioc_enum_framesizes = allegro_enum_framesizes,
3577 
3578     .vidioc_g_parm      = allegro_g_parm,
3579     .vidioc_s_parm      = allegro_s_parm,
3580 
3581     .vidioc_subscribe_event = allegro_subscribe_event,
3582     .vidioc_unsubscribe_event = v4l2_event_unsubscribe,
3583 };
3584 
3585 static const struct v4l2_file_operations allegro_fops = {
3586     .owner = THIS_MODULE,
3587     .open = allegro_open,
3588     .release = allegro_release,
3589     .poll = v4l2_m2m_fop_poll,
3590     .unlocked_ioctl = video_ioctl2,
3591     .mmap = v4l2_m2m_fop_mmap,
3592 };
3593 
3594 static int allegro_register_device(struct allegro_dev *dev)
3595 {
3596     struct video_device *video_dev = &dev->video_dev;
3597 
3598     strscpy(video_dev->name, "allegro", sizeof(video_dev->name));
3599     video_dev->fops = &allegro_fops;
3600     video_dev->ioctl_ops = &allegro_ioctl_ops;
3601     video_dev->release = video_device_release_empty;
3602     video_dev->lock = &dev->lock;
3603     video_dev->v4l2_dev = &dev->v4l2_dev;
3604     video_dev->vfl_dir = VFL_DIR_M2M;
3605     video_dev->device_caps = V4L2_CAP_VIDEO_M2M | V4L2_CAP_STREAMING;
3606     video_set_drvdata(video_dev, dev);
3607 
3608     return video_register_device(video_dev, VFL_TYPE_VIDEO, 0);
3609 }
3610 
3611 static void allegro_device_run(void *priv)
3612 {
3613     struct allegro_channel *channel = priv;
3614     struct allegro_dev *dev = channel->dev;
3615     struct vb2_v4l2_buffer *src_buf;
3616     struct vb2_v4l2_buffer *dst_buf;
3617     dma_addr_t src_y;
3618     dma_addr_t src_uv;
3619     dma_addr_t dst_addr;
3620     unsigned long dst_size;
3621     u64 src_handle;
3622     u64 dst_handle;
3623 
3624     dst_buf = v4l2_m2m_dst_buf_remove(channel->fh.m2m_ctx);
3625     dst_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
3626     dst_size = vb2_plane_size(&dst_buf->vb2_buf, 0);
3627     dst_handle = allegro_put_buffer(channel, &channel->stream_shadow_list,
3628                     dst_buf);
3629     allegro_mcu_send_put_stream_buffer(dev, channel, dst_addr, dst_size,
3630                        dst_handle);
3631 
3632     src_buf = v4l2_m2m_src_buf_remove(channel->fh.m2m_ctx);
3633     src_buf->sequence = channel->osequence++;
3634     src_y = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
3635     src_uv = src_y + (channel->stride * channel->height);
3636     src_handle = allegro_put_buffer(channel, &channel->source_shadow_list,
3637                     src_buf);
3638     allegro_mcu_send_encode_frame(dev, channel, src_y, src_uv, src_handle);
3639 
3640     v4l2_m2m_job_finish(dev->m2m_dev, channel->fh.m2m_ctx);
3641 }
3642 
3643 static const struct v4l2_m2m_ops allegro_m2m_ops = {
3644     .device_run = allegro_device_run,
3645 };
3646 
3647 static int allegro_mcu_hw_init(struct allegro_dev *dev,
3648                    const struct fw_info *info)
3649 {
3650     int err;
3651 
3652     dev->mbox_command = allegro_mbox_init(dev, info->mailbox_cmd,
3653                           info->mailbox_size);
3654     dev->mbox_status = allegro_mbox_init(dev, info->mailbox_status,
3655                          info->mailbox_size);
3656     if (IS_ERR(dev->mbox_command) || IS_ERR(dev->mbox_status)) {
3657         v4l2_err(&dev->v4l2_dev,
3658              "failed to initialize mailboxes\n");
3659         return -EIO;
3660     }
3661 
3662     err = allegro_encoder_buffer_init(dev, &dev->encoder_buffer);
3663     dev->has_encoder_buffer = (err == 0);
3664     if (!dev->has_encoder_buffer)
3665         v4l2_info(&dev->v4l2_dev, "encoder buffer not available\n");
3666 
3667     allegro_mcu_enable_interrupts(dev);
3668 
3669     /* The mcu sends INIT after reset. */
3670     allegro_mcu_start(dev);
3671     err = allegro_mcu_wait_for_init_timeout(dev, 5000);
3672     if (err < 0) {
3673         v4l2_err(&dev->v4l2_dev,
3674              "mcu did not send INIT after reset\n");
3675         err = -EIO;
3676         goto err_disable_interrupts;
3677     }
3678 
3679     err = allegro_alloc_buffer(dev, &dev->suballocator,
3680                    info->suballocator_size);
3681     if (err) {
3682         v4l2_err(&dev->v4l2_dev,
3683              "failed to allocate %zu bytes for suballocator\n",
3684              info->suballocator_size);
3685         goto err_reset_mcu;
3686     }
3687 
3688     allegro_mcu_send_init(dev, dev->suballocator.paddr,
3689                   dev->suballocator.size);
3690     err = allegro_mcu_wait_for_init_timeout(dev, 5000);
3691     if (err < 0) {
3692         v4l2_err(&dev->v4l2_dev,
3693              "mcu failed to configure sub-allocator\n");
3694         err = -EIO;
3695         goto err_free_suballocator;
3696     }
3697 
3698     return 0;
3699 
3700 err_free_suballocator:
3701     allegro_free_buffer(dev, &dev->suballocator);
3702 err_reset_mcu:
3703     allegro_mcu_reset(dev);
3704 err_disable_interrupts:
3705     allegro_mcu_disable_interrupts(dev);
3706 
3707     return err;
3708 }
3709 
3710 static int allegro_mcu_hw_deinit(struct allegro_dev *dev)
3711 {
3712     int err;
3713 
3714     err = allegro_mcu_reset(dev);
3715     if (err)
3716         v4l2_warn(&dev->v4l2_dev,
3717               "mcu failed to enter sleep state\n");
3718 
3719     err = allegro_mcu_disable_interrupts(dev);
3720     if (err)
3721         v4l2_warn(&dev->v4l2_dev,
3722               "failed to disable interrupts\n");
3723 
3724     allegro_free_buffer(dev, &dev->suballocator);
3725 
3726     return 0;
3727 }
3728 
3729 static void allegro_fw_callback(const struct firmware *fw, void *context)
3730 {
3731     struct allegro_dev *dev = context;
3732     const char *fw_codec_name = "al5e.fw";
3733     const struct firmware *fw_codec;
3734     int err;
3735 
3736     if (!fw)
3737         return;
3738 
3739     v4l2_dbg(1, debug, &dev->v4l2_dev,
3740          "requesting codec firmware '%s'\n", fw_codec_name);
3741     err = request_firmware(&fw_codec, fw_codec_name, &dev->plat_dev->dev);
3742     if (err)
3743         goto err_release_firmware;
3744 
3745     dev->fw_info = allegro_get_firmware_info(dev, fw, fw_codec);
3746     if (!dev->fw_info) {
3747         v4l2_err(&dev->v4l2_dev, "firmware is not supported\n");
3748         goto err_release_firmware_codec;
3749     }
3750 
3751     v4l2_info(&dev->v4l2_dev,
3752           "using mcu firmware version '%s'\n", dev->fw_info->version);
3753 
3754     pm_runtime_enable(&dev->plat_dev->dev);
3755     err = pm_runtime_resume_and_get(&dev->plat_dev->dev);
3756     if (err)
3757         goto err_release_firmware_codec;
3758 
3759     /* Ensure that the mcu is sleeping at the reset vector */
3760     err = allegro_mcu_reset(dev);
3761     if (err) {
3762         v4l2_err(&dev->v4l2_dev, "failed to reset mcu\n");
3763         goto err_suspend;
3764     }
3765 
3766     allegro_copy_firmware(dev, fw->data, fw->size);
3767     allegro_copy_fw_codec(dev, fw_codec->data, fw_codec->size);
3768 
3769     err = allegro_mcu_hw_init(dev, dev->fw_info);
3770     if (err) {
3771         v4l2_err(&dev->v4l2_dev, "failed to initialize mcu\n");
3772         goto err_free_fw_codec;
3773     }
3774 
3775     dev->m2m_dev = v4l2_m2m_init(&allegro_m2m_ops);
3776     if (IS_ERR(dev->m2m_dev)) {
3777         v4l2_err(&dev->v4l2_dev, "failed to init mem2mem device\n");
3778         goto err_mcu_hw_deinit;
3779     }
3780 
3781     err = allegro_register_device(dev);
3782     if (err) {
3783         v4l2_err(&dev->v4l2_dev, "failed to register video device\n");
3784         goto err_m2m_release;
3785     }
3786 
3787     v4l2_dbg(1, debug, &dev->v4l2_dev,
3788          "allegro codec registered as /dev/video%d\n",
3789          dev->video_dev.num);
3790 
3791     dev->initialized = true;
3792 
3793     release_firmware(fw_codec);
3794     release_firmware(fw);
3795 
3796     return;
3797 
3798 err_m2m_release:
3799     v4l2_m2m_release(dev->m2m_dev);
3800     dev->m2m_dev = NULL;
3801 err_mcu_hw_deinit:
3802     allegro_mcu_hw_deinit(dev);
3803 err_free_fw_codec:
3804     allegro_free_fw_codec(dev);
3805 err_suspend:
3806     pm_runtime_put(&dev->plat_dev->dev);
3807     pm_runtime_disable(&dev->plat_dev->dev);
3808 err_release_firmware_codec:
3809     release_firmware(fw_codec);
3810 err_release_firmware:
3811     release_firmware(fw);
3812 }
3813 
3814 static int allegro_firmware_request_nowait(struct allegro_dev *dev)
3815 {
3816     const char *fw = "al5e_b.fw";
3817 
3818     v4l2_dbg(1, debug, &dev->v4l2_dev,
3819          "requesting firmware '%s'\n", fw);
3820     return request_firmware_nowait(THIS_MODULE, true, fw,
3821                        &dev->plat_dev->dev, GFP_KERNEL, dev,
3822                        allegro_fw_callback);
3823 }
3824 
3825 static int allegro_probe(struct platform_device *pdev)
3826 {
3827     struct allegro_dev *dev;
3828     struct resource *res, *sram_res;
3829     int ret;
3830     int irq;
3831     void __iomem *regs, *sram_regs;
3832 
3833     dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
3834     if (!dev)
3835         return -ENOMEM;
3836     dev->plat_dev = pdev;
3837     init_completion(&dev->init_complete);
3838     INIT_LIST_HEAD(&dev->channels);
3839 
3840     mutex_init(&dev->lock);
3841 
3842     dev->initialized = false;
3843 
3844     res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "regs");
3845     if (!res) {
3846         dev_err(&pdev->dev,
3847             "regs resource missing from device tree\n");
3848         return -EINVAL;
3849     }
3850     regs = devm_ioremap(&pdev->dev, res->start, resource_size(res));
3851     if (!regs) {
3852         dev_err(&pdev->dev, "failed to map registers\n");
3853         return -ENOMEM;
3854     }
3855     dev->regmap = devm_regmap_init_mmio(&pdev->dev, regs,
3856                         &allegro_regmap_config);
3857     if (IS_ERR(dev->regmap)) {
3858         dev_err(&pdev->dev, "failed to init regmap\n");
3859         return PTR_ERR(dev->regmap);
3860     }
3861 
3862     sram_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
3863     if (!sram_res) {
3864         dev_err(&pdev->dev,
3865             "sram resource missing from device tree\n");
3866         return -EINVAL;
3867     }
3868     sram_regs = devm_ioremap(&pdev->dev,
3869                  sram_res->start,
3870                  resource_size(sram_res));
3871     if (!sram_regs) {
3872         dev_err(&pdev->dev, "failed to map sram\n");
3873         return -ENOMEM;
3874     }
3875     dev->sram = devm_regmap_init_mmio(&pdev->dev, sram_regs,
3876                       &allegro_sram_config);
3877     if (IS_ERR(dev->sram)) {
3878         dev_err(&pdev->dev, "failed to init sram\n");
3879         return PTR_ERR(dev->sram);
3880     }
3881 
3882     dev->settings = syscon_regmap_lookup_by_compatible("xlnx,vcu-settings");
3883     if (IS_ERR(dev->settings))
3884         dev_warn(&pdev->dev, "failed to open settings\n");
3885 
3886     dev->clk_core = devm_clk_get(&pdev->dev, "core_clk");
3887     if (IS_ERR(dev->clk_core))
3888         return PTR_ERR(dev->clk_core);
3889 
3890     dev->clk_mcu = devm_clk_get(&pdev->dev, "mcu_clk");
3891     if (IS_ERR(dev->clk_mcu))
3892         return PTR_ERR(dev->clk_mcu);
3893 
3894     irq = platform_get_irq(pdev, 0);
3895     if (irq < 0)
3896         return irq;
3897     ret = devm_request_threaded_irq(&pdev->dev, irq,
3898                     allegro_hardirq,
3899                     allegro_irq_thread,
3900                     IRQF_SHARED, dev_name(&pdev->dev), dev);
3901     if (ret < 0) {
3902         dev_err(&pdev->dev, "failed to request irq: %d\n", ret);
3903         return ret;
3904     }
3905 
3906     ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
3907     if (ret)
3908         return ret;
3909 
3910     platform_set_drvdata(pdev, dev);
3911 
3912     ret = allegro_firmware_request_nowait(dev);
3913     if (ret < 0) {
3914         v4l2_err(&dev->v4l2_dev,
3915              "failed to request firmware: %d\n", ret);
3916         return ret;
3917     }
3918 
3919     return 0;
3920 }
3921 
3922 static int allegro_remove(struct platform_device *pdev)
3923 {
3924     struct allegro_dev *dev = platform_get_drvdata(pdev);
3925 
3926     if (dev->initialized) {
3927         video_unregister_device(&dev->video_dev);
3928         if (dev->m2m_dev)
3929             v4l2_m2m_release(dev->m2m_dev);
3930         allegro_mcu_hw_deinit(dev);
3931         allegro_free_fw_codec(dev);
3932     }
3933 
3934     pm_runtime_put(&dev->plat_dev->dev);
3935     pm_runtime_disable(&dev->plat_dev->dev);
3936 
3937     v4l2_device_unregister(&dev->v4l2_dev);
3938 
3939     return 0;
3940 }
3941 
3942 static int allegro_runtime_resume(struct device *device)
3943 {
3944     struct allegro_dev *dev = dev_get_drvdata(device);
3945     struct regmap *settings = dev->settings;
3946     unsigned int clk_mcu;
3947     unsigned int clk_core;
3948     int err;
3949 
3950     if (!settings)
3951         return -EINVAL;
3952 
3953 #define MHZ_TO_HZ(freq) ((freq) * 1000 * 1000)
3954 
3955     err = regmap_read(settings, VCU_CORE_CLK, &clk_core);
3956     if (err < 0)
3957         return err;
3958     err = clk_set_rate(dev->clk_core, MHZ_TO_HZ(clk_core));
3959     if (err < 0)
3960         return err;
3961     err = clk_prepare_enable(dev->clk_core);
3962     if (err)
3963         return err;
3964 
3965     err = regmap_read(settings, VCU_MCU_CLK, &clk_mcu);
3966     if (err < 0)
3967         goto disable_clk_core;
3968     err = clk_set_rate(dev->clk_mcu, MHZ_TO_HZ(clk_mcu));
3969     if (err < 0)
3970         goto disable_clk_core;
3971     err = clk_prepare_enable(dev->clk_mcu);
3972     if (err)
3973         goto disable_clk_core;
3974 
3975 #undef MHZ_TO_HZ
3976 
3977     return 0;
3978 
3979 disable_clk_core:
3980     clk_disable_unprepare(dev->clk_core);
3981 
3982     return err;
3983 }
3984 
3985 static int allegro_runtime_suspend(struct device *device)
3986 {
3987     struct allegro_dev *dev = dev_get_drvdata(device);
3988 
3989     clk_disable_unprepare(dev->clk_mcu);
3990     clk_disable_unprepare(dev->clk_core);
3991 
3992     return 0;
3993 }
3994 
3995 static const struct of_device_id allegro_dt_ids[] = {
3996     { .compatible = "allegro,al5e-1.1" },
3997     { /* sentinel */ }
3998 };
3999 
4000 MODULE_DEVICE_TABLE(of, allegro_dt_ids);
4001 
4002 static const struct dev_pm_ops allegro_pm_ops = {
4003     .runtime_resume = allegro_runtime_resume,
4004     .runtime_suspend = allegro_runtime_suspend,
4005 };
4006 
4007 static struct platform_driver allegro_driver = {
4008     .probe = allegro_probe,
4009     .remove = allegro_remove,
4010     .driver = {
4011         .name = "allegro",
4012         .of_match_table = of_match_ptr(allegro_dt_ids),
4013         .pm = &allegro_pm_ops,
4014     },
4015 };
4016 
4017 module_platform_driver(allegro_driver);
4018 
4019 MODULE_LICENSE("GPL");
4020 MODULE_AUTHOR("Michael Tretter <kernel@pengutronix.de>");
4021 MODULE_DESCRIPTION("Allegro DVT encoder driver");