allegro-core.c (112899B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2019 Pengutronix, Michael Tretter <kernel@pengutronix.de> 4 * 5 * Allegro DVT video encoder driver 6 */ 7 8#include <linux/bits.h> 9#include <linux/clk.h> 10#include <linux/firmware.h> 11#include <linux/gcd.h> 12#include <linux/interrupt.h> 13#include <linux/io.h> 14#include <linux/kernel.h> 15#include <linux/log2.h> 16#include <linux/mfd/syscon.h> 17#include <linux/mfd/syscon/xlnx-vcu.h> 18#include <linux/module.h> 19#include <linux/of.h> 20#include <linux/of_device.h> 21#include <linux/platform_device.h> 22#include <linux/pm_runtime.h> 23#include <linux/regmap.h> 24#include <linux/sizes.h> 25#include <linux/slab.h> 26#include <linux/videodev2.h> 27#include <media/v4l2-ctrls.h> 28#include <media/v4l2-device.h> 29#include <media/v4l2-event.h> 30#include <media/v4l2-ioctl.h> 31#include <media/v4l2-mem2mem.h> 32#include <media/videobuf2-dma-contig.h> 33#include <media/videobuf2-v4l2.h> 34 35#include "allegro-mail.h" 36#include "nal-h264.h" 37#include "nal-hevc.h" 38 39/* 40 * Support up to 4k video streams. The hardware actually supports higher 41 * resolutions, which are specified in PG252 June 6, 2018 (H.264/H.265 Video 42 * Codec Unit v1.1) Chapter 3. 43 */ 44#define ALLEGRO_WIDTH_MIN 128 45#define ALLEGRO_WIDTH_DEFAULT 1920 46#define ALLEGRO_WIDTH_MAX 3840 47#define ALLEGRO_HEIGHT_MIN 64 48#define ALLEGRO_HEIGHT_DEFAULT 1080 49#define ALLEGRO_HEIGHT_MAX 2160 50 51#define ALLEGRO_FRAMERATE_DEFAULT ((struct v4l2_fract) { 30, 1 }) 52 53#define ALLEGRO_GOP_SIZE_DEFAULT 25 54#define ALLEGRO_GOP_SIZE_MAX 1000 55 56/* 57 * MCU Control Registers 58 * 59 * The Zynq UltraScale+ Devices Register Reference documents the registers 60 * with an offset of 0x9000, which equals the size of the SRAM and one page 61 * gap. The driver handles SRAM and registers separately and, therefore, is 62 * oblivious of the offset. 63 */ 64#define AL5_MCU_RESET 0x0000 65#define AL5_MCU_RESET_SOFT BIT(0) 66#define AL5_MCU_RESET_REGS BIT(1) 67#define AL5_MCU_RESET_MODE 0x0004 68#define AL5_MCU_RESET_MODE_SLEEP BIT(0) 69#define AL5_MCU_RESET_MODE_HALT BIT(1) 70#define AL5_MCU_STA 0x0008 71#define AL5_MCU_STA_SLEEP BIT(0) 72#define AL5_MCU_WAKEUP 0x000c 73 74#define AL5_ICACHE_ADDR_OFFSET_MSB 0x0010 75#define AL5_ICACHE_ADDR_OFFSET_LSB 0x0014 76#define AL5_DCACHE_ADDR_OFFSET_MSB 0x0018 77#define AL5_DCACHE_ADDR_OFFSET_LSB 0x001c 78 79#define AL5_MCU_INTERRUPT 0x0100 80#define AL5_ITC_CPU_IRQ_MSK 0x0104 81#define AL5_ITC_CPU_IRQ_CLR 0x0108 82#define AL5_ITC_CPU_IRQ_STA 0x010C 83#define AL5_ITC_CPU_IRQ_STA_TRIGGERED BIT(0) 84 85#define AXI_ADDR_OFFSET_IP 0x0208 86 87/* 88 * The MCU accesses the system memory with a 2G offset compared to CPU 89 * physical addresses. 90 */ 91#define MCU_CACHE_OFFSET SZ_2G 92 93/* 94 * The driver needs to reserve some space at the beginning of capture buffers, 95 * because it needs to write SPS/PPS NAL units. The encoder writes the actual 96 * frame data after the offset. 97 */ 98#define ENCODER_STREAM_OFFSET SZ_128 99 100#define SIZE_MACROBLOCK 16 101 102/* Encoding options */ 103#define LOG2_MAX_FRAME_NUM 4 104#define LOG2_MAX_PIC_ORDER_CNT 10 105#define BETA_OFFSET_DIV_2 -1 106#define TC_OFFSET_DIV_2 -1 107 108/* 109 * This control allows applications to explicitly disable the encoder buffer. 110 * This value is Allegro specific. 111 */ 112#define V4L2_CID_USER_ALLEGRO_ENCODER_BUFFER (V4L2_CID_USER_ALLEGRO_BASE + 0) 113 114static int debug; 115module_param(debug, int, 0644); 116MODULE_PARM_DESC(debug, "Debug level (0-2)"); 117 118struct allegro_buffer { 119 void *vaddr; 120 dma_addr_t paddr; 121 size_t size; 122 struct list_head head; 123}; 124 125struct allegro_dev; 126struct allegro_channel; 127 128struct allegro_mbox { 129 struct allegro_dev *dev; 130 unsigned int head; 131 unsigned int tail; 132 unsigned int data; 133 size_t size; 134 /* protect mailbox from simultaneous accesses */ 135 struct mutex lock; 136}; 137 138struct allegro_encoder_buffer { 139 unsigned int size; 140 unsigned int color_depth; 141 unsigned int num_cores; 142 unsigned int clk_rate; 143}; 144 145struct allegro_dev { 146 struct v4l2_device v4l2_dev; 147 struct video_device video_dev; 148 struct v4l2_m2m_dev *m2m_dev; 149 struct platform_device *plat_dev; 150 151 /* mutex protecting vb2_queue structure */ 152 struct mutex lock; 153 154 struct regmap *regmap; 155 struct regmap *sram; 156 struct regmap *settings; 157 158 struct clk *clk_core; 159 struct clk *clk_mcu; 160 161 const struct fw_info *fw_info; 162 struct allegro_buffer firmware; 163 struct allegro_buffer suballocator; 164 bool has_encoder_buffer; 165 struct allegro_encoder_buffer encoder_buffer; 166 167 struct completion init_complete; 168 bool initialized; 169 170 /* The mailbox interface */ 171 struct allegro_mbox *mbox_command; 172 struct allegro_mbox *mbox_status; 173 174 /* 175 * The downstream driver limits the users to 64 users, thus I can use 176 * a bitfield for the user_ids that are in use. See also user_id in 177 * struct allegro_channel. 178 */ 179 unsigned long channel_user_ids; 180 struct list_head channels; 181}; 182 183static struct regmap_config allegro_regmap_config = { 184 .name = "regmap", 185 .reg_bits = 32, 186 .val_bits = 32, 187 .reg_stride = 4, 188 .max_register = 0xfff, 189 .cache_type = REGCACHE_NONE, 190}; 191 192static struct regmap_config allegro_sram_config = { 193 .name = "sram", 194 .reg_bits = 32, 195 .val_bits = 32, 196 .reg_stride = 4, 197 .max_register = 0x7fff, 198 .cache_type = REGCACHE_NONE, 199}; 200 201#define fh_to_channel(__fh) container_of(__fh, struct allegro_channel, fh) 202 203struct allegro_channel { 204 struct allegro_dev *dev; 205 struct v4l2_fh fh; 206 struct v4l2_ctrl_handler ctrl_handler; 207 208 unsigned int width; 209 unsigned int height; 210 unsigned int stride; 211 struct v4l2_fract framerate; 212 213 enum v4l2_colorspace colorspace; 214 enum v4l2_ycbcr_encoding ycbcr_enc; 215 enum v4l2_quantization quantization; 216 enum v4l2_xfer_func xfer_func; 217 218 u32 pixelformat; 219 unsigned int sizeimage_raw; 220 unsigned int osequence; 221 222 u32 codec; 223 unsigned int sizeimage_encoded; 224 unsigned int csequence; 225 226 bool frame_rc_enable; 227 unsigned int bitrate; 228 unsigned int bitrate_peak; 229 230 struct allegro_buffer config_blob; 231 232 unsigned int log2_max_frame_num; 233 bool temporal_mvp_enable; 234 235 bool enable_loop_filter_across_tiles; 236 bool enable_loop_filter_across_slices; 237 bool enable_deblocking_filter_override; 238 bool enable_reordering; 239 bool dbf_ovr_en; 240 241 unsigned int num_ref_idx_l0; 242 unsigned int num_ref_idx_l1; 243 244 /* Maximum range for motion estimation */ 245 int b_hrz_me_range; 246 int b_vrt_me_range; 247 int p_hrz_me_range; 248 int p_vrt_me_range; 249 /* Size limits of coding unit */ 250 int min_cu_size; 251 int max_cu_size; 252 /* Size limits of transform unit */ 253 int min_tu_size; 254 int max_tu_size; 255 int max_transfo_depth_intra; 256 int max_transfo_depth_inter; 257 258 struct v4l2_ctrl *mpeg_video_h264_profile; 259 struct v4l2_ctrl *mpeg_video_h264_level; 260 struct v4l2_ctrl *mpeg_video_h264_i_frame_qp; 261 struct v4l2_ctrl *mpeg_video_h264_max_qp; 262 struct v4l2_ctrl *mpeg_video_h264_min_qp; 263 struct v4l2_ctrl *mpeg_video_h264_p_frame_qp; 264 struct v4l2_ctrl *mpeg_video_h264_b_frame_qp; 265 266 struct v4l2_ctrl *mpeg_video_hevc_profile; 267 struct v4l2_ctrl *mpeg_video_hevc_level; 268 struct v4l2_ctrl *mpeg_video_hevc_tier; 269 struct v4l2_ctrl *mpeg_video_hevc_i_frame_qp; 270 struct v4l2_ctrl *mpeg_video_hevc_max_qp; 271 struct v4l2_ctrl *mpeg_video_hevc_min_qp; 272 struct v4l2_ctrl *mpeg_video_hevc_p_frame_qp; 273 struct v4l2_ctrl *mpeg_video_hevc_b_frame_qp; 274 275 struct v4l2_ctrl *mpeg_video_frame_rc_enable; 276 struct { /* video bitrate mode control cluster */ 277 struct v4l2_ctrl *mpeg_video_bitrate_mode; 278 struct v4l2_ctrl *mpeg_video_bitrate; 279 struct v4l2_ctrl *mpeg_video_bitrate_peak; 280 }; 281 struct v4l2_ctrl *mpeg_video_cpb_size; 282 struct v4l2_ctrl *mpeg_video_gop_size; 283 284 struct v4l2_ctrl *encoder_buffer; 285 286 /* user_id is used to identify the channel during CREATE_CHANNEL */ 287 /* not sure, what to set here and if this is actually required */ 288 int user_id; 289 /* channel_id is set by the mcu and used by all later commands */ 290 int mcu_channel_id; 291 292 struct list_head buffers_reference; 293 struct list_head buffers_intermediate; 294 295 struct list_head source_shadow_list; 296 struct list_head stream_shadow_list; 297 /* protect shadow lists of buffers passed to firmware */ 298 struct mutex shadow_list_lock; 299 300 struct list_head list; 301 struct completion completion; 302 303 unsigned int error; 304}; 305 306static inline int 307allegro_channel_get_i_frame_qp(struct allegro_channel *channel) 308{ 309 if (channel->codec == V4L2_PIX_FMT_HEVC) 310 return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_i_frame_qp); 311 else 312 return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_i_frame_qp); 313} 314 315static inline int 316allegro_channel_get_p_frame_qp(struct allegro_channel *channel) 317{ 318 if (channel->codec == V4L2_PIX_FMT_HEVC) 319 return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_p_frame_qp); 320 else 321 return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_p_frame_qp); 322} 323 324static inline int 325allegro_channel_get_b_frame_qp(struct allegro_channel *channel) 326{ 327 if (channel->codec == V4L2_PIX_FMT_HEVC) 328 return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_b_frame_qp); 329 else 330 return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_b_frame_qp); 331} 332 333static inline int 334allegro_channel_get_min_qp(struct allegro_channel *channel) 335{ 336 if (channel->codec == V4L2_PIX_FMT_HEVC) 337 return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_min_qp); 338 else 339 return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_min_qp); 340} 341 342static inline int 343allegro_channel_get_max_qp(struct allegro_channel *channel) 344{ 345 if (channel->codec == V4L2_PIX_FMT_HEVC) 346 return v4l2_ctrl_g_ctrl(channel->mpeg_video_hevc_max_qp); 347 else 348 return v4l2_ctrl_g_ctrl(channel->mpeg_video_h264_max_qp); 349} 350 351struct allegro_m2m_buffer { 352 struct v4l2_m2m_buffer buf; 353 struct list_head head; 354}; 355 356#define to_allegro_m2m_buffer(__buf) \ 357 container_of(__buf, struct allegro_m2m_buffer, buf) 358 359struct fw_info { 360 unsigned int id; 361 unsigned int id_codec; 362 char *version; 363 unsigned int mailbox_cmd; 364 unsigned int mailbox_status; 365 size_t mailbox_size; 366 enum mcu_msg_version mailbox_version; 367 size_t suballocator_size; 368}; 369 370static const struct fw_info supported_firmware[] = { 371 { 372 .id = 18296, 373 .id_codec = 96272, 374 .version = "v2018.2", 375 .mailbox_cmd = 0x7800, 376 .mailbox_status = 0x7c00, 377 .mailbox_size = 0x400 - 0x8, 378 .mailbox_version = MCU_MSG_VERSION_2018_2, 379 .suballocator_size = SZ_16M, 380 }, { 381 .id = 14680, 382 .id_codec = 126572, 383 .version = "v2019.2", 384 .mailbox_cmd = 0x7000, 385 .mailbox_status = 0x7800, 386 .mailbox_size = 0x800 - 0x8, 387 .mailbox_version = MCU_MSG_VERSION_2019_2, 388 .suballocator_size = SZ_32M, 389 }, 390}; 391 392static inline u32 to_mcu_addr(struct allegro_dev *dev, dma_addr_t phys) 393{ 394 if (upper_32_bits(phys) || (lower_32_bits(phys) & MCU_CACHE_OFFSET)) 395 v4l2_warn(&dev->v4l2_dev, 396 "address %pad is outside mcu window\n", &phys); 397 398 return lower_32_bits(phys) | MCU_CACHE_OFFSET; 399} 400 401static inline u32 to_mcu_size(struct allegro_dev *dev, size_t size) 402{ 403 return lower_32_bits(size); 404} 405 406static inline u32 to_codec_addr(struct allegro_dev *dev, dma_addr_t phys) 407{ 408 if (upper_32_bits(phys)) 409 v4l2_warn(&dev->v4l2_dev, 410 "address %pad cannot be used by codec\n", &phys); 411 412 return lower_32_bits(phys); 413} 414 415static inline u64 ptr_to_u64(const void *ptr) 416{ 417 return (uintptr_t)ptr; 418} 419 420/* Helper functions for channel and user operations */ 421 422static unsigned long allegro_next_user_id(struct allegro_dev *dev) 423{ 424 if (dev->channel_user_ids == ~0UL) 425 return -EBUSY; 426 427 return ffz(dev->channel_user_ids); 428} 429 430static struct allegro_channel * 431allegro_find_channel_by_user_id(struct allegro_dev *dev, 432 unsigned int user_id) 433{ 434 struct allegro_channel *channel; 435 436 list_for_each_entry(channel, &dev->channels, list) { 437 if (channel->user_id == user_id) 438 return channel; 439 } 440 441 return ERR_PTR(-EINVAL); 442} 443 444static struct allegro_channel * 445allegro_find_channel_by_channel_id(struct allegro_dev *dev, 446 unsigned int channel_id) 447{ 448 struct allegro_channel *channel; 449 450 list_for_each_entry(channel, &dev->channels, list) { 451 if (channel->mcu_channel_id == channel_id) 452 return channel; 453 } 454 455 return ERR_PTR(-EINVAL); 456} 457 458static inline bool channel_exists(struct allegro_channel *channel) 459{ 460 return channel->mcu_channel_id != -1; 461} 462 463#define AL_ERROR 0x80 464#define AL_ERR_INIT_FAILED 0x81 465#define AL_ERR_NO_FRAME_DECODED 0x82 466#define AL_ERR_RESOLUTION_CHANGE 0x85 467#define AL_ERR_NO_MEMORY 0x87 468#define AL_ERR_STREAM_OVERFLOW 0x88 469#define AL_ERR_TOO_MANY_SLICES 0x89 470#define AL_ERR_BUF_NOT_READY 0x8c 471#define AL_ERR_NO_CHANNEL_AVAILABLE 0x8d 472#define AL_ERR_RESOURCE_UNAVAILABLE 0x8e 473#define AL_ERR_NOT_ENOUGH_CORES 0x8f 474#define AL_ERR_REQUEST_MALFORMED 0x90 475#define AL_ERR_CMD_NOT_ALLOWED 0x91 476#define AL_ERR_INVALID_CMD_VALUE 0x92 477 478static inline const char *allegro_err_to_string(unsigned int err) 479{ 480 switch (err) { 481 case AL_ERR_INIT_FAILED: 482 return "initialization failed"; 483 case AL_ERR_NO_FRAME_DECODED: 484 return "no frame decoded"; 485 case AL_ERR_RESOLUTION_CHANGE: 486 return "resolution change"; 487 case AL_ERR_NO_MEMORY: 488 return "out of memory"; 489 case AL_ERR_STREAM_OVERFLOW: 490 return "stream buffer overflow"; 491 case AL_ERR_TOO_MANY_SLICES: 492 return "too many slices"; 493 case AL_ERR_BUF_NOT_READY: 494 return "buffer not ready"; 495 case AL_ERR_NO_CHANNEL_AVAILABLE: 496 return "no channel available"; 497 case AL_ERR_RESOURCE_UNAVAILABLE: 498 return "resource unavailable"; 499 case AL_ERR_NOT_ENOUGH_CORES: 500 return "not enough cores"; 501 case AL_ERR_REQUEST_MALFORMED: 502 return "request malformed"; 503 case AL_ERR_CMD_NOT_ALLOWED: 504 return "command not allowed"; 505 case AL_ERR_INVALID_CMD_VALUE: 506 return "invalid command value"; 507 case AL_ERROR: 508 default: 509 return "unknown error"; 510 } 511} 512 513static unsigned int estimate_stream_size(unsigned int width, 514 unsigned int height) 515{ 516 unsigned int offset = ENCODER_STREAM_OFFSET; 517 unsigned int num_blocks = DIV_ROUND_UP(width, SIZE_MACROBLOCK) * 518 DIV_ROUND_UP(height, SIZE_MACROBLOCK); 519 unsigned int pcm_size = SZ_256; 520 unsigned int partition_table = SZ_256; 521 522 return round_up(offset + num_blocks * pcm_size + partition_table, 32); 523} 524 525static enum v4l2_mpeg_video_h264_level 526select_minimum_h264_level(unsigned int width, unsigned int height) 527{ 528 unsigned int pic_width_in_mb = DIV_ROUND_UP(width, SIZE_MACROBLOCK); 529 unsigned int frame_height_in_mb = DIV_ROUND_UP(height, SIZE_MACROBLOCK); 530 unsigned int frame_size_in_mb = pic_width_in_mb * frame_height_in_mb; 531 enum v4l2_mpeg_video_h264_level level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0; 532 533 /* 534 * The level limits are specified in Rec. ITU-T H.264 Annex A.3.1 and 535 * also specify limits regarding bit rate and CBP size. Only approximate 536 * the levels using the frame size. 537 * 538 * Level 5.1 allows up to 4k video resolution. 539 */ 540 if (frame_size_in_mb <= 99) 541 level = V4L2_MPEG_VIDEO_H264_LEVEL_1_0; 542 else if (frame_size_in_mb <= 396) 543 level = V4L2_MPEG_VIDEO_H264_LEVEL_1_1; 544 else if (frame_size_in_mb <= 792) 545 level = V4L2_MPEG_VIDEO_H264_LEVEL_2_1; 546 else if (frame_size_in_mb <= 1620) 547 level = V4L2_MPEG_VIDEO_H264_LEVEL_2_2; 548 else if (frame_size_in_mb <= 3600) 549 level = V4L2_MPEG_VIDEO_H264_LEVEL_3_1; 550 else if (frame_size_in_mb <= 5120) 551 level = V4L2_MPEG_VIDEO_H264_LEVEL_3_2; 552 else if (frame_size_in_mb <= 8192) 553 level = V4L2_MPEG_VIDEO_H264_LEVEL_4_0; 554 else if (frame_size_in_mb <= 8704) 555 level = V4L2_MPEG_VIDEO_H264_LEVEL_4_2; 556 else if (frame_size_in_mb <= 22080) 557 level = V4L2_MPEG_VIDEO_H264_LEVEL_5_0; 558 else 559 level = V4L2_MPEG_VIDEO_H264_LEVEL_5_1; 560 561 return level; 562} 563 564static unsigned int h264_maximum_bitrate(enum v4l2_mpeg_video_h264_level level) 565{ 566 switch (level) { 567 case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: 568 return 64000; 569 case V4L2_MPEG_VIDEO_H264_LEVEL_1B: 570 return 128000; 571 case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: 572 return 192000; 573 case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: 574 return 384000; 575 case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: 576 return 768000; 577 case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: 578 return 2000000; 579 case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: 580 return 4000000; 581 case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: 582 return 4000000; 583 case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: 584 return 10000000; 585 case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: 586 return 14000000; 587 case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: 588 return 20000000; 589 case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: 590 return 20000000; 591 case V4L2_MPEG_VIDEO_H264_LEVEL_4_1: 592 return 50000000; 593 case V4L2_MPEG_VIDEO_H264_LEVEL_4_2: 594 return 50000000; 595 case V4L2_MPEG_VIDEO_H264_LEVEL_5_0: 596 return 135000000; 597 case V4L2_MPEG_VIDEO_H264_LEVEL_5_1: 598 default: 599 return 240000000; 600 } 601} 602 603static unsigned int h264_maximum_cpb_size(enum v4l2_mpeg_video_h264_level level) 604{ 605 switch (level) { 606 case V4L2_MPEG_VIDEO_H264_LEVEL_1_0: 607 return 175; 608 case V4L2_MPEG_VIDEO_H264_LEVEL_1B: 609 return 350; 610 case V4L2_MPEG_VIDEO_H264_LEVEL_1_1: 611 return 500; 612 case V4L2_MPEG_VIDEO_H264_LEVEL_1_2: 613 return 1000; 614 case V4L2_MPEG_VIDEO_H264_LEVEL_1_3: 615 return 2000; 616 case V4L2_MPEG_VIDEO_H264_LEVEL_2_0: 617 return 2000; 618 case V4L2_MPEG_VIDEO_H264_LEVEL_2_1: 619 return 4000; 620 case V4L2_MPEG_VIDEO_H264_LEVEL_2_2: 621 return 4000; 622 case V4L2_MPEG_VIDEO_H264_LEVEL_3_0: 623 return 10000; 624 case V4L2_MPEG_VIDEO_H264_LEVEL_3_1: 625 return 14000; 626 case V4L2_MPEG_VIDEO_H264_LEVEL_3_2: 627 return 20000; 628 case V4L2_MPEG_VIDEO_H264_LEVEL_4_0: 629 return 25000; 630 case V4L2_MPEG_VIDEO_H264_LEVEL_4_1: 631 return 62500; 632 case V4L2_MPEG_VIDEO_H264_LEVEL_4_2: 633 return 62500; 634 case V4L2_MPEG_VIDEO_H264_LEVEL_5_0: 635 return 135000; 636 case V4L2_MPEG_VIDEO_H264_LEVEL_5_1: 637 default: 638 return 240000; 639 } 640} 641 642static enum v4l2_mpeg_video_hevc_level 643select_minimum_hevc_level(unsigned int width, unsigned int height) 644{ 645 unsigned int luma_picture_size = width * height; 646 enum v4l2_mpeg_video_hevc_level level; 647 648 if (luma_picture_size <= 36864) 649 level = V4L2_MPEG_VIDEO_HEVC_LEVEL_1; 650 else if (luma_picture_size <= 122880) 651 level = V4L2_MPEG_VIDEO_HEVC_LEVEL_2; 652 else if (luma_picture_size <= 245760) 653 level = V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1; 654 else if (luma_picture_size <= 552960) 655 level = V4L2_MPEG_VIDEO_HEVC_LEVEL_3; 656 else if (luma_picture_size <= 983040) 657 level = V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1; 658 else if (luma_picture_size <= 2228224) 659 level = V4L2_MPEG_VIDEO_HEVC_LEVEL_4; 660 else if (luma_picture_size <= 8912896) 661 level = V4L2_MPEG_VIDEO_HEVC_LEVEL_5; 662 else 663 level = V4L2_MPEG_VIDEO_HEVC_LEVEL_6; 664 665 return level; 666} 667 668static unsigned int hevc_maximum_bitrate(enum v4l2_mpeg_video_hevc_level level) 669{ 670 /* 671 * See Rec. ITU-T H.265 v5 (02/2018), A.4.2 Profile-specific level 672 * limits for the video profiles. 673 */ 674 switch (level) { 675 case V4L2_MPEG_VIDEO_HEVC_LEVEL_1: 676 return 128; 677 case V4L2_MPEG_VIDEO_HEVC_LEVEL_2: 678 return 1500; 679 case V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1: 680 return 3000; 681 case V4L2_MPEG_VIDEO_HEVC_LEVEL_3: 682 return 6000; 683 case V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1: 684 return 10000; 685 case V4L2_MPEG_VIDEO_HEVC_LEVEL_4: 686 return 12000; 687 case V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1: 688 return 20000; 689 case V4L2_MPEG_VIDEO_HEVC_LEVEL_5: 690 return 25000; 691 default: 692 case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1: 693 return 40000; 694 } 695} 696 697static unsigned int hevc_maximum_cpb_size(enum v4l2_mpeg_video_hevc_level level) 698{ 699 switch (level) { 700 case V4L2_MPEG_VIDEO_HEVC_LEVEL_1: 701 return 350; 702 case V4L2_MPEG_VIDEO_HEVC_LEVEL_2: 703 return 1500; 704 case V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1: 705 return 3000; 706 case V4L2_MPEG_VIDEO_HEVC_LEVEL_3: 707 return 6000; 708 case V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1: 709 return 10000; 710 case V4L2_MPEG_VIDEO_HEVC_LEVEL_4: 711 return 12000; 712 case V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1: 713 return 20000; 714 case V4L2_MPEG_VIDEO_HEVC_LEVEL_5: 715 return 25000; 716 default: 717 case V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1: 718 return 40000; 719 } 720} 721 722static const struct fw_info * 723allegro_get_firmware_info(struct allegro_dev *dev, 724 const struct firmware *fw, 725 const struct firmware *fw_codec) 726{ 727 int i; 728 unsigned int id = fw->size; 729 unsigned int id_codec = fw_codec->size; 730 731 for (i = 0; i < ARRAY_SIZE(supported_firmware); i++) 732 if (supported_firmware[i].id == id && 733 supported_firmware[i].id_codec == id_codec) 734 return &supported_firmware[i]; 735 736 return NULL; 737} 738 739/* 740 * Buffers that are used internally by the MCU. 741 */ 742 743static int allegro_alloc_buffer(struct allegro_dev *dev, 744 struct allegro_buffer *buffer, size_t size) 745{ 746 buffer->vaddr = dma_alloc_coherent(&dev->plat_dev->dev, size, 747 &buffer->paddr, GFP_KERNEL); 748 if (!buffer->vaddr) 749 return -ENOMEM; 750 buffer->size = size; 751 752 return 0; 753} 754 755static void allegro_free_buffer(struct allegro_dev *dev, 756 struct allegro_buffer *buffer) 757{ 758 if (buffer->vaddr) { 759 dma_free_coherent(&dev->plat_dev->dev, buffer->size, 760 buffer->vaddr, buffer->paddr); 761 buffer->vaddr = NULL; 762 buffer->size = 0; 763 } 764} 765 766/* 767 * Mailbox interface to send messages to the MCU. 768 */ 769 770static void allegro_mcu_interrupt(struct allegro_dev *dev); 771static void allegro_handle_message(struct allegro_dev *dev, 772 union mcu_msg_response *msg); 773 774static struct allegro_mbox *allegro_mbox_init(struct allegro_dev *dev, 775 unsigned int base, size_t size) 776{ 777 struct allegro_mbox *mbox; 778 779 mbox = devm_kmalloc(&dev->plat_dev->dev, sizeof(*mbox), GFP_KERNEL); 780 if (!mbox) 781 return ERR_PTR(-ENOMEM); 782 783 mbox->dev = dev; 784 785 mbox->head = base; 786 mbox->tail = base + 0x4; 787 mbox->data = base + 0x8; 788 mbox->size = size; 789 mutex_init(&mbox->lock); 790 791 regmap_write(dev->sram, mbox->head, 0); 792 regmap_write(dev->sram, mbox->tail, 0); 793 794 return mbox; 795} 796 797static int allegro_mbox_write(struct allegro_mbox *mbox, 798 const u32 *src, size_t size) 799{ 800 struct regmap *sram = mbox->dev->sram; 801 unsigned int tail; 802 size_t size_no_wrap; 803 int err = 0; 804 int stride = regmap_get_reg_stride(sram); 805 806 if (!src) 807 return -EINVAL; 808 809 if (size > mbox->size) 810 return -EINVAL; 811 812 mutex_lock(&mbox->lock); 813 regmap_read(sram, mbox->tail, &tail); 814 if (tail > mbox->size) { 815 err = -EIO; 816 goto out; 817 } 818 size_no_wrap = min(size, mbox->size - (size_t)tail); 819 regmap_bulk_write(sram, mbox->data + tail, 820 src, size_no_wrap / stride); 821 regmap_bulk_write(sram, mbox->data, 822 src + (size_no_wrap / sizeof(*src)), 823 (size - size_no_wrap) / stride); 824 regmap_write(sram, mbox->tail, (tail + size) % mbox->size); 825 826out: 827 mutex_unlock(&mbox->lock); 828 829 return err; 830} 831 832static ssize_t allegro_mbox_read(struct allegro_mbox *mbox, 833 u32 *dst, size_t nbyte) 834{ 835 struct { 836 u16 length; 837 u16 type; 838 } __attribute__ ((__packed__)) *header; 839 struct regmap *sram = mbox->dev->sram; 840 unsigned int head; 841 ssize_t size; 842 size_t body_no_wrap; 843 int stride = regmap_get_reg_stride(sram); 844 845 regmap_read(sram, mbox->head, &head); 846 if (head > mbox->size) 847 return -EIO; 848 849 /* Assume that the header does not wrap. */ 850 regmap_bulk_read(sram, mbox->data + head, 851 dst, sizeof(*header) / stride); 852 header = (void *)dst; 853 size = header->length + sizeof(*header); 854 if (size > mbox->size || size & 0x3) 855 return -EIO; 856 if (size > nbyte) 857 return -EINVAL; 858 859 /* 860 * The message might wrap within the mailbox. If the message does not 861 * wrap, the first read will read the entire message, otherwise the 862 * first read will read message until the end of the mailbox and the 863 * second read will read the remaining bytes from the beginning of the 864 * mailbox. 865 * 866 * Skip the header, as was already read to get the size of the body. 867 */ 868 body_no_wrap = min((size_t)header->length, 869 (size_t)(mbox->size - (head + sizeof(*header)))); 870 regmap_bulk_read(sram, mbox->data + head + sizeof(*header), 871 dst + (sizeof(*header) / sizeof(*dst)), 872 body_no_wrap / stride); 873 regmap_bulk_read(sram, mbox->data, 874 dst + (sizeof(*header) + body_no_wrap) / sizeof(*dst), 875 (header->length - body_no_wrap) / stride); 876 877 regmap_write(sram, mbox->head, (head + size) % mbox->size); 878 879 return size; 880} 881 882/** 883 * allegro_mbox_send() - Send a message via the mailbox 884 * @mbox: the mailbox which is used to send the message 885 * @msg: the message to send 886 */ 887static int allegro_mbox_send(struct allegro_mbox *mbox, void *msg) 888{ 889 struct allegro_dev *dev = mbox->dev; 890 ssize_t size; 891 int err; 892 u32 *tmp; 893 894 tmp = kzalloc(mbox->size, GFP_KERNEL); 895 if (!tmp) { 896 err = -ENOMEM; 897 goto out; 898 } 899 900 size = allegro_encode_mail(tmp, msg); 901 902 err = allegro_mbox_write(mbox, tmp, size); 903 kfree(tmp); 904 if (err) 905 goto out; 906 907 allegro_mcu_interrupt(dev); 908 909out: 910 return err; 911} 912 913/** 914 * allegro_mbox_notify() - Notify the mailbox about a new message 915 * @mbox: The allegro_mbox to notify 916 */ 917static void allegro_mbox_notify(struct allegro_mbox *mbox) 918{ 919 struct allegro_dev *dev = mbox->dev; 920 union mcu_msg_response *msg; 921 ssize_t size; 922 u32 *tmp; 923 int err; 924 925 msg = kmalloc(sizeof(*msg), GFP_KERNEL); 926 if (!msg) 927 return; 928 929 msg->header.version = dev->fw_info->mailbox_version; 930 931 tmp = kmalloc(mbox->size, GFP_KERNEL); 932 if (!tmp) 933 goto out; 934 935 size = allegro_mbox_read(mbox, tmp, mbox->size); 936 if (size < 0) 937 goto out; 938 939 err = allegro_decode_mail(msg, tmp); 940 if (err) 941 goto out; 942 943 allegro_handle_message(dev, msg); 944 945out: 946 kfree(tmp); 947 kfree(msg); 948} 949 950static int allegro_encoder_buffer_init(struct allegro_dev *dev, 951 struct allegro_encoder_buffer *buffer) 952{ 953 int err; 954 struct regmap *settings = dev->settings; 955 unsigned int supports_10_bit; 956 unsigned int memory_depth; 957 unsigned int num_cores; 958 unsigned int color_depth; 959 unsigned long clk_rate; 960 961 /* We don't support the encoder buffer pre Firmware version 2019.2 */ 962 if (dev->fw_info->mailbox_version < MCU_MSG_VERSION_2019_2) 963 return -ENODEV; 964 965 if (!settings) 966 return -EINVAL; 967 968 err = regmap_read(settings, VCU_ENC_COLOR_DEPTH, &supports_10_bit); 969 if (err < 0) 970 return err; 971 err = regmap_read(settings, VCU_MEMORY_DEPTH, &memory_depth); 972 if (err < 0) 973 return err; 974 err = regmap_read(settings, VCU_NUM_CORE, &num_cores); 975 if (err < 0) 976 return err; 977 978 clk_rate = clk_get_rate(dev->clk_core); 979 if (clk_rate == 0) 980 return -EINVAL; 981 982 color_depth = supports_10_bit ? 10 : 8; 983 /* The firmware expects the encoder buffer size in bits. */ 984 buffer->size = color_depth * 32 * memory_depth; 985 buffer->color_depth = color_depth; 986 buffer->num_cores = num_cores; 987 buffer->clk_rate = clk_rate; 988 989 v4l2_dbg(1, debug, &dev->v4l2_dev, 990 "using %d bits encoder buffer with %d-bit color depth\n", 991 buffer->size, color_depth); 992 993 return 0; 994} 995 996static void allegro_mcu_send_init(struct allegro_dev *dev, 997 dma_addr_t suballoc_dma, size_t suballoc_size) 998{ 999 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 1024static 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 1035static 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 1052static 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 1061static 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 1098static 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 1111static 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 1136static 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 1147static u32 1148v4l2_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 1159static 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 1175static s16 get_qp_delta(int minuend, int subtrahend) 1176{ 1177 if (minuend == subtrahend) 1178 return -1; 1179 else 1180 return minuend - subtrahend; 1181} 1182 1183static 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 1195static 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 1313static 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(¶m, 0, sizeof(param)); 1322 fill_create_channel_param(channel, ¶m); 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, ¶m); 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 1343static 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 1360static 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 1386static 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 1416static 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 1430static 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 1481static 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 1488static 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 1495static 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 1520err: 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 1529static 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 1542static void destroy_reference_buffers(struct allegro_channel *channel) 1543{ 1544 return destroy_buffers_internal(channel, &channel->buffers_reference); 1545} 1546 1547static void destroy_intermediate_buffers(struct allegro_channel *channel) 1548{ 1549 return destroy_buffers_internal(channel, 1550 &channel->buffers_intermediate); 1551} 1552 1553static 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 1561static 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 1569static 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 1674static 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 1711static 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 1720static 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 1759static 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 1872static 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 1919static 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 1934static struct vb2_v4l2_buffer * 1935allegro_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 1954static 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 2138err: 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 2146static 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 2154static int 2155allegro_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(¶m, 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 2226out: 2227 channel->error = err; 2228 complete(&channel->completion); 2229 2230 /* Handled successfully, error is passed via channel->error */ 2231 return 0; 2232} 2233 2234static int 2235allegro_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 2257static int 2258allegro_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 2277static 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 2301static 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 2315static 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 2333static 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 2346static 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 2393static 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 2402static 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 2407static int allegro_mcu_disable_interrupts(struct allegro_dev *dev) 2408{ 2409 return regmap_write(dev->regmap, AL5_ITC_CPU_IRQ_MSK, 0); 2410} 2411 2412static 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 2428static 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 2453static 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 2477static void allegro_mcu_interrupt(struct allegro_dev *dev) 2478{ 2479 regmap_write(dev->regmap, AL5_MCU_INTERRUPT, BIT(0)); 2480} 2481 2482static 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 */ 2545static 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 2612err: 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 */ 2625static 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 2736static 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 2754static 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 2786static 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 2806static 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 2831static 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 2850static 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 2893static 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 2903static 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 2939static 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 2957static 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 2970static 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 2989static 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 3019static const struct v4l2_ctrl_ops allegro_ctrl_ops = { 3020 .try_ctrl = allegro_try_ctrl, 3021 .s_ctrl = allegro_s_ctrl, 3022}; 3023 3024static 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 3034static 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 3225error: 3226 v4l2_ctrl_handler_free(handler); 3227 kfree(channel); 3228 return ret; 3229} 3230 3231static 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 3249static 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 3258static 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 3281static 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 3302static 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 3323static 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 3347static 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 3369static 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 3394static 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 3419static 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 3427static 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 3435static 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 3458static 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 3484static 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 3500static 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 3517static 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 3540static 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 3551static 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 3585static 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 3594static 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 3611static 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 3643static const struct v4l2_m2m_ops allegro_m2m_ops = { 3644 .device_run = allegro_device_run, 3645}; 3646 3647static 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 3700err_free_suballocator: 3701 allegro_free_buffer(dev, &dev->suballocator); 3702err_reset_mcu: 3703 allegro_mcu_reset(dev); 3704err_disable_interrupts: 3705 allegro_mcu_disable_interrupts(dev); 3706 3707 return err; 3708} 3709 3710static 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 3729static 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 3798err_m2m_release: 3799 v4l2_m2m_release(dev->m2m_dev); 3800 dev->m2m_dev = NULL; 3801err_mcu_hw_deinit: 3802 allegro_mcu_hw_deinit(dev); 3803err_free_fw_codec: 3804 allegro_free_fw_codec(dev); 3805err_suspend: 3806 pm_runtime_put(&dev->plat_dev->dev); 3807 pm_runtime_disable(&dev->plat_dev->dev); 3808err_release_firmware_codec: 3809 release_firmware(fw_codec); 3810err_release_firmware: 3811 release_firmware(fw); 3812} 3813 3814static 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 3825static 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 3922static 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 3942static 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 3979disable_clk_core: 3980 clk_disable_unprepare(dev->clk_core); 3981 3982 return err; 3983} 3984 3985static 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 3995static const struct of_device_id allegro_dt_ids[] = { 3996 { .compatible = "allegro,al5e-1.1" }, 3997 { /* sentinel */ } 3998}; 3999 4000MODULE_DEVICE_TABLE(of, allegro_dt_ids); 4001 4002static const struct dev_pm_ops allegro_pm_ops = { 4003 .runtime_resume = allegro_runtime_resume, 4004 .runtime_suspend = allegro_runtime_suspend, 4005}; 4006 4007static 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 4017module_platform_driver(allegro_driver); 4018 4019MODULE_LICENSE("GPL"); 4020MODULE_AUTHOR("Michael Tretter <kernel@pengutronix.de>"); 4021MODULE_DESCRIPTION("Allegro DVT encoder driver");