// SPDX-License-Identifier: GPL-2.0
/*
* Copyright 2020-2021 NXP
*/
#include <linux/init.h>
#include <linux/interconnect.h>
#include <linux/ioctl.h>
#include <linux/list.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/videodev2.h>
#include <linux/ktime.h>
#include <linux/rational.h>
#include <linux/vmalloc.h>
#include <media/v4l2-device.h>
#include <media/v4l2-event.h>
#include <media/v4l2-mem2mem.h>
#include <media/v4l2-ioctl.h>
#include <media/videobuf2-v4l2.h>
#include <media/videobuf2-dma-contig.h>
#include <media/videobuf2-vmalloc.h>
#include "vpu.h"
#include "vpu_defs.h"
#include "vpu_core.h"
#include "vpu_helpers.h"
#include "vpu_v4l2.h"
#include "vpu_cmds.h"
#include "vpu_rpc.h"
#define VENC_OUTPUT_ENABLE BIT(0)
#define VENC_CAPTURE_ENABLE BIT(1)
#define VENC_ENABLE_MASK (VENC_OUTPUT_ENABLE | VENC_CAPTURE_ENABLE)
#define VENC_MAX_BUF_CNT 8
#define VENC_MIN_BUFFER_OUT 6
#define VENC_MIN_BUFFER_CAP 6
struct venc_t {
struct vpu_encode_params params;
u32 request_key_frame;
u32 input_ready;
u32 cpb_size;
bool bitrate_change;
struct vpu_buffer enc[VENC_MAX_BUF_CNT];
struct vpu_buffer ref[VENC_MAX_BUF_CNT];
struct vpu_buffer act[VENC_MAX_BUF_CNT];
struct list_head frames;
u32 frame_count;
u32 encode_count;
u32 ready_count;
u32 enable;
u32 stopped;
u32 skipped_count;
u32 skipped_bytes;
wait_queue_head_t wq;
};
struct venc_frame_t {
struct list_head list;
struct vpu_enc_pic_info info;
u32 bytesused;
s64 timestamp;
};
static const struct vpu_format venc_formats[] = {
{
.pixfmt = V4L2_PIX_FMT_NV12M,
.mem_planes = 2,
.comp_planes = 2,
.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
.sibling = V4L2_PIX_FMT_NV12,
},
{
.pixfmt = V4L2_PIX_FMT_NV12,
.mem_planes = 1,
.comp_planes = 2,
.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
.sibling = V4L2_PIX_FMT_NV12M,
},
{
.pixfmt = V4L2_PIX_FMT_H264,
.mem_planes = 1,
.comp_planes = 1,
.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
.flags = V4L2_FMT_FLAG_COMPRESSED
},
{0, 0, 0, 0},
};
static int venc_querycap(struct file *file, void *fh, struct v4l2_capability *cap)
{
strscpy(cap->driver, "amphion-vpu", sizeof(cap->driver));
strscpy(cap->card, "amphion vpu encoder", sizeof(cap->card));
strscpy(cap->bus_info, "platform: amphion-vpu", sizeof