GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / media / platform / amphion / venc.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright 2020-2021 NXP
4  */
5
6 #include <linux/init.h>
7 #include <linux/interconnect.h>
8 #include <linux/ioctl.h>
9 #include <linux/list.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
12 #include <linux/delay.h>
13 #include <linux/videodev2.h>
14 #include <linux/ktime.h>
15 #include <linux/rational.h>
16 #include <linux/vmalloc.h>
17 #include <media/v4l2-device.h>
18 #include <media/v4l2-event.h>
19 #include <media/v4l2-mem2mem.h>
20 #include <media/v4l2-ioctl.h>
21 #include <media/videobuf2-v4l2.h>
22 #include <media/videobuf2-dma-contig.h>
23 #include <media/videobuf2-vmalloc.h>
24 #include "vpu.h"
25 #include "vpu_defs.h"
26 #include "vpu_core.h"
27 #include "vpu_helpers.h"
28 #include "vpu_v4l2.h"
29 #include "vpu_cmds.h"
30 #include "vpu_rpc.h"
31
32 #define VENC_OUTPUT_ENABLE      BIT(0)
33 #define VENC_CAPTURE_ENABLE     BIT(1)
34 #define VENC_ENABLE_MASK        (VENC_OUTPUT_ENABLE | VENC_CAPTURE_ENABLE)
35 #define VENC_MAX_BUF_CNT        8
36 #define VENC_MIN_BUFFER_OUT     6
37 #define VENC_MIN_BUFFER_CAP     6
38
39 struct venc_t {
40         struct vpu_encode_params params;
41         u32 request_key_frame;
42         u32 input_ready;
43         u32 cpb_size;
44         bool bitrate_change;
45
46         struct vpu_buffer enc[VENC_MAX_BUF_CNT];
47         struct vpu_buffer ref[VENC_MAX_BUF_CNT];
48         struct vpu_buffer act[VENC_MAX_BUF_CNT];
49         struct list_head frames;
50         u32 frame_count;
51         u32 encode_count;
52         u32 ready_count;
53         u32 enable;
54         u32 stopped;
55
56         u32 skipped_count;
57         u32 skipped_bytes;
58
59         wait_queue_head_t wq;
60 };
61
62 struct venc_frame_t {
63         struct list_head list;
64         struct vpu_enc_pic_info info;
65         u32 bytesused;
66         s64 timestamp;
67 };
68
69 static const struct vpu_format venc_formats[] = {
70         {
71                 .pixfmt = V4L2_PIX_FMT_NV12M,
72                 .num_planes = 2,
73                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
74         },
75         {
76                 .pixfmt = V4L2_PIX_FMT_H264,
77                 .num_planes = 1,
78                 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
79         },
80         {0, 0, 0, 0},
81 };
82
83 static int venc_querycap(struct file *file, void *fh, struct v4l2_capability *cap)
84 {
85         strscpy(cap->driver, "amphion-vpu", sizeof(cap->driver));
86         strscpy(cap->card, "amphion vpu encoder", sizeof(cap->card));
87         strscpy(cap->bus_info, "platform: amphion-vpu", sizeof(cap->bus_info));
88
89         return 0;
90 }
91
92 static int venc_enum_fmt(struct file *file, void *fh, struct v4l2_fmtdesc *f)
93 {
94         struct vpu_inst *inst = to_inst(file);
95         const struct vpu_format *fmt;
96
97         memset(f->reserved, 0, sizeof(f->reserved));
98         fmt = vpu_helper_enum_format(inst, f->type, f->index);
99         if (!fmt)
100                 return -EINVAL;
101
102         f->pixelformat = fmt->pixfmt;
103         f->flags = fmt->flags;
104
105         return 0;
106 }
107
108 static int venc_enum_framesizes(struct file *file, void *fh, struct v4l2_frmsizeenum *fsize)
109 {
110         struct vpu_inst *inst = to_inst(file);
111         const struct vpu_core_resources *res;
112
113         if (!fsize || fsize->index)
114                 return -EINVAL;
115
116         if (!vpu_helper_find_format(inst, 0, fsize->pixel_format))
117                 return -EINVAL;
118
119         res = vpu_get_resource(inst);
120         if (!res)
121                 return -EINVAL;
122         fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
123         fsize->stepwise.max_width = res->max_width;
124         fsize->stepwise.max_height = res->max_height;
125         fsize->stepwise.min_width = res->min_width;
126         fsize->stepwise.min_height = res->min_height;
127         fsize->stepwise.step_width = res->step_width;
128         fsize->stepwise.step_height = res->step_height;
129
130         return 0;
131 }
132
133 static int venc_enum_frameintervals(struct file *file, void *fh, struct v4l2_frmivalenum *fival)
134 {
135         struct vpu_inst *inst = to_inst(file);
136         const struct vpu_core_resources *res;
137
138         if (!fival || fival->index)
139                 return -EINVAL;
140
141         if (!vpu_helper_find_format(inst, 0, fival->pixel_format))
142                 return -EINVAL;
143
144         if (!fival->width || !fival->height)
145                 return -EINVAL;
146
147         res = vpu_get_resource(inst);
148         if (!res)
149                 return -EINVAL;
150         if (fival->width < res->min_width || fival->width > res->max_width ||
151             fival->height < res->min_height || fival->height > res->max_height)
152                 return -EINVAL;
153
154         fival->type = V4L2_FRMIVAL_TYPE_CONTINUOUS;
155         fival->stepwise.min.numerator = 1;
156         fival->stepwise.min.denominator = USHRT_MAX;
157         fival->stepwise.max.numerator = USHRT_MAX;
158         fival->stepwise.max.denominator = 1;
159         fival->stepwise.step.numerator = 1;
160         fival->stepwise.step.denominator = 1;
161
162         return 0;
163 }
164
165 static int venc_g_fmt(struct file *file, void *fh, struct v4l2_format *f)
166 {
167         struct vpu_inst *inst = to_inst(file);
168         struct venc_t *venc = inst->priv;
169         struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;
170         struct vpu_format *cur_fmt;
171         int i;
172
173         cur_fmt = vpu_get_format(inst, f->type);
174
175         pixmp->pixelformat = cur_fmt->pixfmt;
176         pixmp->num_planes = cur_fmt->num_planes;
177         pixmp->width = cur_fmt->width;
178         pixmp->height = cur_fmt->height;
179         pixmp->field = cur_fmt->field;
180         pixmp->flags = cur_fmt->flags;
181         for (i = 0; i < pixmp->num_planes; i++) {
182                 pixmp->plane_fmt[i].bytesperline = cur_fmt->bytesperline[i];
183                 pixmp->plane_fmt[i].sizeimage = cur_fmt->sizeimage[i];
184         }
185
186         f->fmt.pix_mp.colorspace = venc->params.color.primaries;
187         f->fmt.pix_mp.xfer_func = venc->params.color.transfer;
188         f->fmt.pix_mp.ycbcr_enc = venc->params.color.matrix;
189         f->fmt.pix_mp.quantization = venc->params.color.full_range;
190
191         return 0;
192 }
193
194 static int venc_try_fmt(struct file *file, void *fh, struct v4l2_format *f)
195 {
196         struct vpu_inst *inst = to_inst(file);
197
198         vpu_try_fmt_common(inst, f);
199
200         return 0;
201 }
202
203 static int venc_s_fmt(struct file *file, void *fh, struct v4l2_format *f)
204 {
205         struct vpu_inst *inst = to_inst(file);
206         const struct vpu_format *fmt;
207         struct vpu_format *cur_fmt;
208         struct vb2_queue *q;
209         struct venc_t *venc = inst->priv;
210         struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
211         int i;
212
213         q = v4l2_m2m_get_vq(inst->fh.m2m_ctx, f->type);
214         if (!q)
215                 return -EINVAL;
216         if (vb2_is_busy(q))
217                 return -EBUSY;
218
219         fmt = vpu_try_fmt_common(inst, f);
220         if (!fmt)
221                 return -EINVAL;
222
223         cur_fmt = vpu_get_format(inst, f->type);
224
225         cur_fmt->pixfmt = fmt->pixfmt;
226         cur_fmt->num_planes = fmt->num_planes;
227         cur_fmt->flags = fmt->flags;
228         cur_fmt->width = pix_mp->width;
229         cur_fmt->height = pix_mp->height;
230         for (i = 0; i < fmt->num_planes; i++) {
231                 cur_fmt->sizeimage[i] = pix_mp->plane_fmt[i].sizeimage;
232                 cur_fmt->bytesperline[i] = pix_mp->plane_fmt[i].bytesperline;
233         }
234
235         if (pix_mp->field != V4L2_FIELD_ANY)
236                 cur_fmt->field = pix_mp->field;
237
238         if (V4L2_TYPE_IS_OUTPUT(f->type)) {
239                 venc->params.input_format = cur_fmt->pixfmt;
240                 venc->params.src_stride = cur_fmt->bytesperline[0];
241                 venc->params.src_width = cur_fmt->width;
242                 venc->params.src_height = cur_fmt->height;
243                 venc->params.crop.left = 0;
244                 venc->params.crop.top = 0;
245                 venc->params.crop.width = cur_fmt->width;
246                 venc->params.crop.height = cur_fmt->height;
247         } else {
248                 venc->params.codec_format = cur_fmt->pixfmt;
249                 venc->params.out_width = cur_fmt->width;
250                 venc->params.out_height = cur_fmt->height;
251         }
252
253         if (V4L2_TYPE_IS_OUTPUT(f->type)) {
254                 if (!vpu_color_check_primaries(pix_mp->colorspace)) {
255                         venc->params.color.primaries = pix_mp->colorspace;
256                         vpu_color_get_default(venc->params.color.primaries,
257                                               &venc->params.color.transfer,
258                                               &venc->params.color.matrix,
259                                               &venc->params.color.full_range);
260                 }
261                 if (!vpu_color_check_transfers(pix_mp->xfer_func))
262                         venc->params.color.transfer = pix_mp->xfer_func;
263                 if (!vpu_color_check_matrix(pix_mp->ycbcr_enc))
264                         venc->params.color.matrix = pix_mp->ycbcr_enc;
265                 if (!vpu_color_check_full_range(pix_mp->quantization))
266                         venc->params.color.full_range = pix_mp->quantization;
267         }
268
269         pix_mp->colorspace = venc->params.color.primaries;
270         pix_mp->xfer_func = venc->params.color.transfer;
271         pix_mp->ycbcr_enc = venc->params.color.matrix;
272         pix_mp->quantization = venc->params.color.full_range;
273
274         return 0;
275 }
276
277 static int venc_g_parm(struct file *file, void *fh, struct v4l2_streamparm *parm)
278 {
279         struct vpu_inst *inst = to_inst(file);
280         struct venc_t *venc = inst->priv;
281         struct v4l2_fract *timeperframe = &parm->parm.capture.timeperframe;
282
283         if (!parm)
284                 return -EINVAL;
285
286         if (!V4L2_TYPE_IS_OUTPUT(parm->type))
287                 return -EINVAL;
288
289         if (!vpu_helper_check_type(inst, parm->type))
290                 return -EINVAL;
291
292         parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
293         parm->parm.capture.readbuffers = 0;
294         timeperframe->numerator = venc->params.frame_rate.numerator;
295         timeperframe->denominator = venc->params.frame_rate.denominator;
296
297         return 0;
298 }
299
300 static int venc_s_parm(struct file *file, void *fh, struct v4l2_streamparm *parm)
301 {
302         struct vpu_inst *inst = to_inst(file);
303         struct venc_t *venc = inst->priv;
304         struct v4l2_fract *timeperframe = &parm->parm.capture.timeperframe;
305         unsigned long n, d;
306
307         if (!parm)
308                 return -EINVAL;
309
310         if (!V4L2_TYPE_IS_OUTPUT(parm->type))
311                 return -EINVAL;
312
313         if (!vpu_helper_check_type(inst, parm->type))
314                 return -EINVAL;
315
316         if (!timeperframe->numerator)
317                 timeperframe->numerator = venc->params.frame_rate.numerator;
318         if (!timeperframe->denominator)
319                 timeperframe->denominator = venc->params.frame_rate.denominator;
320
321         venc->params.frame_rate.numerator = timeperframe->numerator;
322         venc->params.frame_rate.denominator = timeperframe->denominator;
323
324         rational_best_approximation(venc->params.frame_rate.numerator,
325                                     venc->params.frame_rate.denominator,
326                                     venc->params.frame_rate.numerator,
327                                     venc->params.frame_rate.denominator,
328                                     &n, &d);
329         venc->params.frame_rate.numerator = n;
330         venc->params.frame_rate.denominator = d;
331
332         parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
333         memset(parm->parm.capture.reserved, 0, sizeof(parm->parm.capture.reserved));
334
335         return 0;
336 }
337
338 static int venc_g_selection(struct file *file, void *fh, struct v4l2_selection *s)
339 {
340         struct vpu_inst *inst = to_inst(file);
341         struct venc_t *venc = inst->priv;
342
343         if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
344                 return -EINVAL;
345
346         switch (s->target) {
347         case V4L2_SEL_TGT_CROP_DEFAULT:
348         case V4L2_SEL_TGT_CROP_BOUNDS:
349                 s->r.left = 0;
350                 s->r.top = 0;
351                 s->r.width = inst->out_format.width;
352                 s->r.height = inst->out_format.height;
353                 break;
354         case V4L2_SEL_TGT_CROP:
355                 s->r = venc->params.crop;
356                 break;
357         default:
358                 return -EINVAL;
359         }
360
361         return 0;
362 }
363
364 static int venc_valid_crop(struct venc_t *venc, const struct vpu_core_resources *res)
365 {
366         struct v4l2_rect *rect = NULL;
367         u32 min_width;
368         u32 min_height;
369         u32 src_width;
370         u32 src_height;
371
372         rect = &venc->params.crop;
373         min_width = res->min_width;
374         min_height = res->min_height;
375         src_width = venc->params.src_width;
376         src_height = venc->params.src_height;
377
378         if (rect->width == 0 || rect->height == 0)
379                 return -EINVAL;
380         if (rect->left > src_width - min_width || rect->top > src_height - min_height)
381                 return -EINVAL;
382
383         rect->width = min(rect->width, src_width - rect->left);
384         rect->width = max_t(u32, rect->width, min_width);
385
386         rect->height = min(rect->height, src_height - rect->top);
387         rect->height = max_t(u32, rect->height, min_height);
388
389         return 0;
390 }
391
392 static int venc_s_selection(struct file *file, void *fh, struct v4l2_selection *s)
393 {
394         struct vpu_inst *inst = to_inst(file);
395         const struct vpu_core_resources *res;
396         struct venc_t *venc = inst->priv;
397
398         res = vpu_get_resource(inst);
399         if (!res)
400                 return -EINVAL;
401
402         if (s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT && s->type != V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
403                 return -EINVAL;
404         if (s->target != V4L2_SEL_TGT_CROP)
405                 return -EINVAL;
406
407         venc->params.crop.left = ALIGN(s->r.left, res->step_width);
408         venc->params.crop.top = ALIGN(s->r.top, res->step_height);
409         venc->params.crop.width = ALIGN(s->r.width, res->step_width);
410         venc->params.crop.height = ALIGN(s->r.height, res->step_height);
411         if (venc_valid_crop(venc, res)) {
412                 venc->params.crop.left = 0;
413                 venc->params.crop.top = 0;
414                 venc->params.crop.width = venc->params.src_width;
415                 venc->params.crop.height = venc->params.src_height;
416         }
417
418         inst->crop = venc->params.crop;
419
420         return 0;
421 }
422
423 static int venc_drain(struct vpu_inst *inst)
424 {
425         struct venc_t *venc = inst->priv;
426         int ret;
427
428         if (!inst->fh.m2m_ctx)
429                 return 0;
430
431         if (inst->state != VPU_CODEC_STATE_DRAIN)
432                 return 0;
433
434         if (!vpu_is_source_empty(inst))
435                 return 0;
436
437         if (!venc->input_ready)
438                 return 0;
439
440         venc->input_ready = false;
441         vpu_trace(inst->dev, "[%d]\n", inst->id);
442         ret = vpu_session_stop(inst);
443         if (ret)
444                 return ret;
445         inst->state = VPU_CODEC_STATE_STOP;
446         wake_up_all(&venc->wq);
447
448         return 0;
449 }
450
451 static int venc_request_eos(struct vpu_inst *inst)
452 {
453         inst->state = VPU_CODEC_STATE_DRAIN;
454         venc_drain(inst);
455
456         return 0;
457 }
458
459 static int venc_encoder_cmd(struct file *file, void *fh, struct v4l2_encoder_cmd *cmd)
460 {
461         struct vpu_inst *inst = to_inst(file);
462         int ret;
463
464         ret = v4l2_m2m_ioctl_try_encoder_cmd(file, fh, cmd);
465         if (ret)
466                 return ret;
467
468         vpu_inst_lock(inst);
469         if (cmd->cmd == V4L2_ENC_CMD_STOP) {
470                 if (inst->state == VPU_CODEC_STATE_DEINIT)
471                         vpu_set_last_buffer_dequeued(inst);
472                 else
473                         venc_request_eos(inst);
474         }
475         vpu_inst_unlock(inst);
476
477         return 0;
478 }
479
480 static int venc_subscribe_event(struct v4l2_fh *fh, const struct v4l2_event_subscription *sub)
481 {
482         switch (sub->type) {
483         case V4L2_EVENT_EOS:
484                 return v4l2_event_subscribe(fh, sub, 0, NULL);
485         case V4L2_EVENT_CTRL:
486                 return v4l2_ctrl_subscribe_event(fh, sub);
487         default:
488                 return -EINVAL;
489         }
490 }
491
492 static const struct v4l2_ioctl_ops venc_ioctl_ops = {
493         .vidioc_querycap               = venc_querycap,
494         .vidioc_enum_fmt_vid_cap       = venc_enum_fmt,
495         .vidioc_enum_fmt_vid_out       = venc_enum_fmt,
496         .vidioc_enum_framesizes        = venc_enum_framesizes,
497         .vidioc_enum_frameintervals    = venc_enum_frameintervals,
498         .vidioc_g_fmt_vid_cap_mplane   = venc_g_fmt,
499         .vidioc_g_fmt_vid_out_mplane   = venc_g_fmt,
500         .vidioc_try_fmt_vid_cap_mplane = venc_try_fmt,
501         .vidioc_try_fmt_vid_out_mplane = venc_try_fmt,
502         .vidioc_s_fmt_vid_cap_mplane   = venc_s_fmt,
503         .vidioc_s_fmt_vid_out_mplane   = venc_s_fmt,
504         .vidioc_g_parm                 = venc_g_parm,
505         .vidioc_s_parm                 = venc_s_parm,
506         .vidioc_g_selection            = venc_g_selection,
507         .vidioc_s_selection            = venc_s_selection,
508         .vidioc_try_encoder_cmd        = v4l2_m2m_ioctl_try_encoder_cmd,
509         .vidioc_encoder_cmd            = venc_encoder_cmd,
510         .vidioc_subscribe_event        = venc_subscribe_event,
511         .vidioc_unsubscribe_event      = v4l2_event_unsubscribe,
512         .vidioc_reqbufs                = v4l2_m2m_ioctl_reqbufs,
513         .vidioc_querybuf               = v4l2_m2m_ioctl_querybuf,
514         .vidioc_create_bufs            = v4l2_m2m_ioctl_create_bufs,
515         .vidioc_prepare_buf            = v4l2_m2m_ioctl_prepare_buf,
516         .vidioc_qbuf                   = v4l2_m2m_ioctl_qbuf,
517         .vidioc_expbuf                 = v4l2_m2m_ioctl_expbuf,
518         .vidioc_dqbuf                  = v4l2_m2m_ioctl_dqbuf,
519         .vidioc_streamon               = v4l2_m2m_ioctl_streamon,
520         .vidioc_streamoff              = v4l2_m2m_ioctl_streamoff,
521 };
522
523 static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl)
524 {
525         struct vpu_inst *inst = ctrl_to_inst(ctrl);
526         struct venc_t *venc = inst->priv;
527         int ret = 0;
528
529         vpu_inst_lock(inst);
530         switch (ctrl->id) {
531         case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
532                 venc->params.profile = ctrl->val;
533                 break;
534         case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
535                 venc->params.level = ctrl->val;
536                 break;
537         case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
538                 venc->params.rc_enable = ctrl->val;
539                 break;
540         case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
541                 venc->params.rc_mode = ctrl->val;
542                 break;
543         case V4L2_CID_MPEG_VIDEO_BITRATE:
544                 if (ctrl->val != venc->params.bitrate)
545                         venc->bitrate_change = true;
546                 venc->params.bitrate = ctrl->val;
547                 break;
548         case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
549                 venc->params.bitrate_max = ctrl->val;
550                 break;
551         case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
552                 venc->params.gop_length = ctrl->val;
553                 break;
554         case V4L2_CID_MPEG_VIDEO_B_FRAMES:
555                 venc->params.bframes = ctrl->val;
556                 break;
557         case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP:
558                 venc->params.i_frame_qp = ctrl->val;
559                 break;
560         case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP:
561                 venc->params.p_frame_qp = ctrl->val;
562                 break;
563         case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP:
564                 venc->params.b_frame_qp = ctrl->val;
565                 break;
566         case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:
567                 venc->request_key_frame = 1;
568                 break;
569         case V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE:
570                 venc->cpb_size = ctrl->val * 1024;
571                 break;
572         case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE:
573                 venc->params.sar.enable = ctrl->val;
574                 break;
575         case V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC:
576                 venc->params.sar.idc = ctrl->val;
577                 break;
578         case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH:
579                 venc->params.sar.width = ctrl->val;
580                 break;
581         case V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT:
582                 venc->params.sar.height = ctrl->val;
583                 break;
584         case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
585                 break;
586         default:
587                 ret = -EINVAL;
588                 break;
589         }
590         vpu_inst_unlock(inst);
591
592         return ret;
593 }
594
595 static const struct v4l2_ctrl_ops venc_ctrl_ops = {
596         .s_ctrl = venc_op_s_ctrl,
597         .g_volatile_ctrl = vpu_helper_g_volatile_ctrl,
598 };
599
600 static int venc_ctrl_init(struct vpu_inst *inst)
601 {
602         struct v4l2_ctrl *ctrl;
603         int ret;
604
605         ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 20);
606         if (ret)
607                 return ret;
608
609         v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,
610                                V4L2_CID_MPEG_VIDEO_H264_PROFILE,
611                                V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
612                                ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
613                                  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
614                                  (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
615                                V4L2_MPEG_VIDEO_H264_PROFILE_HIGH);
616
617         v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,
618                                V4L2_CID_MPEG_VIDEO_H264_LEVEL,
619                                V4L2_MPEG_VIDEO_H264_LEVEL_5_1,
620                                0x0,
621                                V4L2_MPEG_VIDEO_H264_LEVEL_4_0);
622
623         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
624                           V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE, 0, 1, 1, 1);
625
626         v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,
627                                V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
628                                V4L2_MPEG_VIDEO_BITRATE_MODE_CBR,
629                                ~((1 << V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) |
630                                  (1 << V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)),
631                                V4L2_MPEG_VIDEO_BITRATE_MODE_CBR);
632
633         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
634                           V4L2_CID_MPEG_VIDEO_BITRATE,
635                           BITRATE_MIN,
636                           BITRATE_MAX,
637                           BITRATE_STEP,
638                           BITRATE_DEFAULT);
639
640         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
641                           V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
642                           BITRATE_MIN, BITRATE_MAX,
643                           BITRATE_STEP,
644                           BITRATE_DEFAULT_PEAK);
645
646         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
647                           V4L2_CID_MPEG_VIDEO_GOP_SIZE, 0, (1 << 16) - 1, 1, 30);
648
649         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
650                           V4L2_CID_MPEG_VIDEO_B_FRAMES, 0, 4, 1, 0);
651
652         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
653                           V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP, 1, 51, 1, 26);
654         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
655                           V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP, 1, 51, 1, 28);
656         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
657                           V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP, 1, 51, 1, 30);
658         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
659                           V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME, 0, 0, 0, 0);
660         ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
661                                  V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, 1, 32, 1, 2);
662         if (ctrl)
663                 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
664         ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
665                                  V4L2_CID_MIN_BUFFERS_FOR_OUTPUT, 1, 32, 1, 2);
666         if (ctrl)
667                 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
668
669         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
670                           V4L2_CID_MPEG_VIDEO_H264_CPB_SIZE, 64, 10240, 1, 1024);
671
672         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
673                           V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_ENABLE, 0, 1, 1, 1);
674         v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,
675                                V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC,
676                                V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_EXTENDED,
677                                0x0,
678                                V4L2_MPEG_VIDEO_H264_VUI_SAR_IDC_1x1);
679         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
680                           V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_WIDTH,
681                           0, USHRT_MAX, 1, 1);
682         v4l2_ctrl_new_std(&inst->ctrl_handler, &venc_ctrl_ops,
683                           V4L2_CID_MPEG_VIDEO_H264_VUI_EXT_SAR_HEIGHT,
684                           0, USHRT_MAX, 1, 1);
685         v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &venc_ctrl_ops,
686                                V4L2_CID_MPEG_VIDEO_HEADER_MODE,
687                                V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME,
688                                ~(1 << V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME),
689                                V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME);
690
691         if (inst->ctrl_handler.error) {
692                 ret = inst->ctrl_handler.error;
693                 v4l2_ctrl_handler_free(&inst->ctrl_handler);
694                 return ret;
695         }
696
697         ret = v4l2_ctrl_handler_setup(&inst->ctrl_handler);
698         if (ret) {
699                 dev_err(inst->dev, "[%d] setup ctrls fail, ret = %d\n", inst->id, ret);
700                 v4l2_ctrl_handler_free(&inst->ctrl_handler);
701                 return ret;
702         }
703
704         return 0;
705 }
706
707 static bool venc_check_ready(struct vpu_inst *inst, unsigned int type)
708 {
709         struct venc_t *venc = inst->priv;
710
711         if (V4L2_TYPE_IS_OUTPUT(type)) {
712                 if (vpu_helper_get_free_space(inst) < venc->cpb_size)
713                         return false;
714                 return venc->input_ready;
715         }
716
717         if (list_empty(&venc->frames))
718                 return false;
719         return true;
720 }
721
722 static u32 venc_get_enable_mask(u32 type)
723 {
724         if (V4L2_TYPE_IS_OUTPUT(type))
725                 return VENC_OUTPUT_ENABLE;
726         else
727                 return VENC_CAPTURE_ENABLE;
728 }
729
730 static void venc_set_enable(struct venc_t *venc, u32 type, int enable)
731 {
732         u32 mask = venc_get_enable_mask(type);
733
734         if (enable)
735                 venc->enable |= mask;
736         else
737                 venc->enable &= ~mask;
738 }
739
740 static u32 venc_get_enable(struct venc_t *venc, u32 type)
741 {
742         return venc->enable & venc_get_enable_mask(type);
743 }
744
745 static void venc_input_done(struct vpu_inst *inst)
746 {
747         struct venc_t *venc = inst->priv;
748
749         vpu_inst_lock(inst);
750         venc->input_ready = true;
751         vpu_process_output_buffer(inst);
752         if (inst->state == VPU_CODEC_STATE_DRAIN)
753                 venc_drain(inst);
754         vpu_inst_unlock(inst);
755 }
756
757 /*
758  * It's hardware limitation, that there may be several bytes
759  * redundant data at the beginning of frame.
760  * For android platform, the redundant data may cause cts test fail
761  * So driver will strip them
762  */
763 static int venc_precheck_encoded_frame(struct vpu_inst *inst, struct venc_frame_t *frame)
764 {
765         struct venc_t *venc;
766         int skipped;
767
768         if (!frame || !frame->bytesused)
769                 return -EINVAL;
770
771         venc = inst->priv;
772         skipped = vpu_helper_find_startcode(&inst->stream_buffer,
773                                             inst->cap_format.pixfmt,
774                                             frame->info.wptr - inst->stream_buffer.phys,
775                                             frame->bytesused);
776         if (skipped > 0) {
777                 frame->bytesused -= skipped;
778                 frame->info.wptr = vpu_helper_step_walk(&inst->stream_buffer,
779                                                         frame->info.wptr, skipped);
780                 venc->skipped_bytes += skipped;
781                 venc->skipped_count++;
782         }
783
784         return 0;
785 }
786
787 static int venc_get_one_encoded_frame(struct vpu_inst *inst,
788                                       struct venc_frame_t *frame,
789                                       struct vb2_v4l2_buffer *vbuf)
790 {
791         struct venc_t *venc = inst->priv;
792         struct vb2_v4l2_buffer *src_buf;
793
794         if (!vbuf)
795                 return -EAGAIN;
796
797         src_buf = vpu_find_buf_by_sequence(inst, inst->out_format.type, frame->info.frame_id);
798         if (src_buf) {
799                 v4l2_m2m_buf_copy_metadata(src_buf, vbuf, true);
800                 vpu_set_buffer_state(src_buf, VPU_BUF_STATE_IDLE);
801                 v4l2_m2m_src_buf_remove_by_buf(inst->fh.m2m_ctx, src_buf);
802                 v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
803         } else {
804                 vbuf->vb2_buf.timestamp = frame->info.timestamp;
805         }
806         if (!venc_get_enable(inst->priv, vbuf->vb2_buf.type)) {
807                 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
808                 return 0;
809         }
810         if (frame->bytesused > vbuf->vb2_buf.planes[0].length) {
811                 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_ERROR);
812                 return -ENOMEM;
813         }
814
815         venc_precheck_encoded_frame(inst, frame);
816
817         if (frame->bytesused) {
818                 u32 rptr = frame->info.wptr;
819                 void *dst = vb2_plane_vaddr(&vbuf->vb2_buf, 0);
820
821                 vpu_helper_copy_from_stream_buffer(&inst->stream_buffer,
822                                                    &rptr, frame->bytesused, dst);
823                 vpu_iface_update_stream_buffer(inst, rptr, 0);
824         }
825         vb2_set_plane_payload(&vbuf->vb2_buf, 0, frame->bytesused);
826         vbuf->sequence = frame->info.frame_id;
827         vbuf->field = inst->cap_format.field;
828         vbuf->flags |= frame->info.pic_type;
829         vpu_set_buffer_state(vbuf, VPU_BUF_STATE_IDLE);
830         dev_dbg(inst->dev, "[%d][OUTPUT TS]%32lld\n", inst->id, vbuf->vb2_buf.timestamp);
831         v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_DONE);
832         venc->ready_count++;
833
834         if (vbuf->flags & V4L2_BUF_FLAG_KEYFRAME)
835                 dev_dbg(inst->dev, "[%d][%d]key frame\n", inst->id, frame->info.frame_id);
836
837         return 0;
838 }
839
840 static int venc_get_encoded_frames(struct vpu_inst *inst)
841 {
842         struct venc_t *venc;
843         struct venc_frame_t *frame;
844         struct venc_frame_t *tmp;
845
846         if (!inst->fh.m2m_ctx)
847                 return 0;
848         venc = inst->priv;
849         list_for_each_entry_safe(frame, tmp, &venc->frames, list) {
850                 if (venc_get_one_encoded_frame(inst, frame,
851                                                v4l2_m2m_dst_buf_remove(inst->fh.m2m_ctx)))
852                         break;
853                 list_del_init(&frame->list);
854                 vfree(frame);
855         }
856
857         return 0;
858 }
859
860 static int venc_frame_encoded(struct vpu_inst *inst, void *arg)
861 {
862         struct vpu_enc_pic_info *info = arg;
863         struct venc_frame_t *frame;
864         struct venc_t *venc;
865         int ret = 0;
866
867         if (!info)
868                 return -EINVAL;
869         venc = inst->priv;
870         frame = vzalloc(sizeof(*frame));
871         if (!frame)
872                 return -ENOMEM;
873
874         memcpy(&frame->info, info, sizeof(frame->info));
875         frame->bytesused = info->frame_size;
876
877         vpu_inst_lock(inst);
878         list_add_tail(&frame->list, &venc->frames);
879         venc->encode_count++;
880         venc_get_encoded_frames(inst);
881         vpu_inst_unlock(inst);
882
883         return ret;
884 }
885
886 static void venc_set_last_buffer_dequeued(struct vpu_inst *inst)
887 {
888         struct venc_t *venc = inst->priv;
889
890         if (venc->stopped && list_empty(&venc->frames))
891                 vpu_set_last_buffer_dequeued(inst);
892 }
893
894 static void venc_stop_done(struct vpu_inst *inst)
895 {
896         struct venc_t *venc = inst->priv;
897
898         vpu_inst_lock(inst);
899         venc->stopped = true;
900         venc_set_last_buffer_dequeued(inst);
901         vpu_inst_unlock(inst);
902
903         wake_up_all(&venc->wq);
904 }
905
906 static void venc_event_notify(struct vpu_inst *inst, u32 event, void *data)
907 {
908 }
909
910 static void venc_release(struct vpu_inst *inst)
911 {
912 }
913
914 static void venc_cleanup(struct vpu_inst *inst)
915 {
916         struct venc_t *venc;
917
918         if (!inst)
919                 return;
920
921         venc = inst->priv;
922         if (venc)
923                 vfree(venc);
924         inst->priv = NULL;
925         vfree(inst);
926 }
927
928 static int venc_start_session(struct vpu_inst *inst, u32 type)
929 {
930         struct venc_t *venc = inst->priv;
931         int stream_buffer_size;
932         int ret;
933
934         venc_set_enable(venc, type, 1);
935         if ((venc->enable & VENC_ENABLE_MASK) != VENC_ENABLE_MASK)
936                 return 0;
937
938         vpu_iface_init_instance(inst);
939         stream_buffer_size = vpu_iface_get_stream_buffer_size(inst->core);
940         if (stream_buffer_size > 0) {
941                 inst->stream_buffer.length = max_t(u32, stream_buffer_size, venc->cpb_size * 3);
942                 ret = vpu_alloc_dma(inst->core, &inst->stream_buffer);
943                 if (ret)
944                         goto error;
945
946                 inst->use_stream_buffer = true;
947                 vpu_iface_config_stream_buffer(inst, &inst->stream_buffer);
948         }
949
950         ret = vpu_iface_set_encode_params(inst, &venc->params, 0);
951         if (ret)
952                 goto error;
953         ret = vpu_session_configure_codec(inst);
954         if (ret)
955                 goto error;
956
957         inst->state = VPU_CODEC_STATE_CONFIGURED;
958         /*vpu_iface_config_memory_resource*/
959
960         /*config enc expert mode parameter*/
961         ret = vpu_iface_set_encode_params(inst, &venc->params, 1);
962         if (ret)
963                 goto error;
964
965         ret = vpu_session_start(inst);
966         if (ret)
967                 goto error;
968         inst->state = VPU_CODEC_STATE_STARTED;
969
970         venc->bitrate_change = false;
971         venc->input_ready = true;
972         venc->frame_count = 0;
973         venc->encode_count = 0;
974         venc->ready_count = 0;
975         venc->stopped = false;
976         vpu_process_output_buffer(inst);
977         if (venc->frame_count == 0)
978                 dev_err(inst->dev, "[%d] there is no input when starting\n", inst->id);
979
980         return 0;
981 error:
982         venc_set_enable(venc, type, 0);
983         inst->state = VPU_CODEC_STATE_DEINIT;
984
985         vpu_free_dma(&inst->stream_buffer);
986         return ret;
987 }
988
989 static void venc_cleanup_mem_resource(struct vpu_inst *inst)
990 {
991         struct venc_t *venc;
992         u32 i;
993
994         venc = inst->priv;
995
996         for (i = 0; i < ARRAY_SIZE(venc->enc); i++)
997                 vpu_free_dma(&venc->enc[i]);
998         for (i = 0; i < ARRAY_SIZE(venc->ref); i++)
999                 vpu_free_dma(&venc->ref[i]);
1000 }
1001
1002 static void venc_request_mem_resource(struct vpu_inst *inst,
1003                                       u32 enc_frame_size,
1004                                       u32 enc_frame_num,
1005                                       u32 ref_frame_size,
1006                                       u32 ref_frame_num,
1007                                       u32 act_frame_size,
1008                                       u32 act_frame_num)
1009 {
1010         struct venc_t *venc;
1011         u32 i;
1012         int ret;
1013
1014         venc = inst->priv;
1015         if (enc_frame_num > ARRAY_SIZE(venc->enc)) {
1016                 dev_err(inst->dev, "[%d] enc num(%d) is out of range\n", inst->id, enc_frame_num);
1017                 return;
1018         }
1019         if (ref_frame_num > ARRAY_SIZE(venc->ref)) {
1020                 dev_err(inst->dev, "[%d] ref num(%d) is out of range\n", inst->id, ref_frame_num);
1021                 return;
1022         }
1023         if (act_frame_num > ARRAY_SIZE(venc->act)) {
1024                 dev_err(inst->dev, "[%d] act num(%d) is out of range\n", inst->id, act_frame_num);
1025                 return;
1026         }
1027
1028         for (i = 0; i < enc_frame_num; i++) {
1029                 venc->enc[i].length = enc_frame_size;
1030                 ret = vpu_alloc_dma(inst->core, &venc->enc[i]);
1031                 if (ret) {
1032                         venc_cleanup_mem_resource(inst);
1033                         return;
1034                 }
1035         }
1036         for (i = 0; i < ref_frame_num; i++) {
1037                 venc->ref[i].length = ref_frame_size;
1038                 ret = vpu_alloc_dma(inst->core, &venc->ref[i]);
1039                 if (ret) {
1040                         venc_cleanup_mem_resource(inst);
1041                         return;
1042                 }
1043         }
1044         if (act_frame_num != 1 || act_frame_size > inst->act.length) {
1045                 venc_cleanup_mem_resource(inst);
1046                 return;
1047         }
1048         venc->act[0].length = act_frame_size;
1049         venc->act[0].phys = inst->act.phys;
1050         venc->act[0].virt = inst->act.virt;
1051
1052         for (i = 0; i < enc_frame_num; i++)
1053                 vpu_iface_config_memory_resource(inst, MEM_RES_ENC, i, &venc->enc[i]);
1054         for (i = 0; i < ref_frame_num; i++)
1055                 vpu_iface_config_memory_resource(inst, MEM_RES_REF, i, &venc->ref[i]);
1056         for (i = 0; i < act_frame_num; i++)
1057                 vpu_iface_config_memory_resource(inst, MEM_RES_ACT, i, &venc->act[i]);
1058 }
1059
1060 static void venc_cleanup_frames(struct venc_t *venc)
1061 {
1062         struct venc_frame_t *frame;
1063         struct venc_frame_t *tmp;
1064
1065         list_for_each_entry_safe(frame, tmp, &venc->frames, list) {
1066                 list_del_init(&frame->list);
1067                 vfree(frame);
1068         }
1069 }
1070
1071 static int venc_stop_session(struct vpu_inst *inst, u32 type)
1072 {
1073         struct venc_t *venc = inst->priv;
1074
1075         venc_set_enable(venc, type, 0);
1076         if (venc->enable & VENC_ENABLE_MASK)
1077                 return 0;
1078
1079         if (inst->state == VPU_CODEC_STATE_DEINIT)
1080                 return 0;
1081
1082         if (inst->state != VPU_CODEC_STATE_STOP)
1083                 venc_request_eos(inst);
1084
1085         call_void_vop(inst, wait_prepare);
1086         if (!wait_event_timeout(venc->wq, venc->stopped, VPU_TIMEOUT)) {
1087                 set_bit(inst->id, &inst->core->hang_mask);
1088                 vpu_session_debug(inst);
1089         }
1090         call_void_vop(inst, wait_finish);
1091
1092         inst->state = VPU_CODEC_STATE_DEINIT;
1093         venc_cleanup_frames(inst->priv);
1094         vpu_free_dma(&inst->stream_buffer);
1095         venc_cleanup_mem_resource(inst);
1096
1097         return 0;
1098 }
1099
1100 static int venc_process_output(struct vpu_inst *inst, struct vb2_buffer *vb)
1101 {
1102         struct venc_t *venc = inst->priv;
1103         struct vb2_v4l2_buffer *vbuf;
1104         u32 flags;
1105
1106         if (inst->state == VPU_CODEC_STATE_DEINIT)
1107                 return -EINVAL;
1108
1109         vbuf = to_vb2_v4l2_buffer(vb);
1110         if (inst->state == VPU_CODEC_STATE_STARTED)
1111                 inst->state = VPU_CODEC_STATE_ACTIVE;
1112
1113         flags = vbuf->flags;
1114         if (venc->request_key_frame) {
1115                 vbuf->flags |= V4L2_BUF_FLAG_KEYFRAME;
1116                 venc->request_key_frame = 0;
1117         }
1118         if (venc->bitrate_change) {
1119                 vpu_session_update_parameters(inst, &venc->params);
1120                 venc->bitrate_change = false;
1121         }
1122         dev_dbg(inst->dev, "[%d][INPUT  TS]%32lld\n", inst->id, vb->timestamp);
1123         vpu_iface_input_frame(inst, vb);
1124         vbuf->flags = flags;
1125         venc->input_ready = false;
1126         venc->frame_count++;
1127         vpu_set_buffer_state(vbuf, VPU_BUF_STATE_INUSE);
1128
1129         return 0;
1130 }
1131
1132 static int venc_process_capture(struct vpu_inst *inst, struct vb2_buffer *vb)
1133 {
1134         struct venc_t *venc;
1135         struct venc_frame_t *frame = NULL;
1136         struct vb2_v4l2_buffer *vbuf;
1137         int ret;
1138
1139         venc = inst->priv;
1140         if (list_empty(&venc->frames))
1141                 return -EINVAL;
1142
1143         frame = list_first_entry(&venc->frames, struct venc_frame_t, list);
1144         vbuf = to_vb2_v4l2_buffer(vb);
1145         v4l2_m2m_dst_buf_remove_by_buf(inst->fh.m2m_ctx, vbuf);
1146         ret = venc_get_one_encoded_frame(inst, frame, vbuf);
1147         if (ret)
1148                 return ret;
1149
1150         list_del_init(&frame->list);
1151         vfree(frame);
1152         return 0;
1153 }
1154
1155 static void venc_on_queue_empty(struct vpu_inst *inst, u32 type)
1156 {
1157         struct venc_t *venc = inst->priv;
1158
1159         if (V4L2_TYPE_IS_OUTPUT(type))
1160                 return;
1161
1162         if (venc->stopped)
1163                 venc_set_last_buffer_dequeued(inst);
1164 }
1165
1166 static int venc_get_debug_info(struct vpu_inst *inst, char *str, u32 size, u32 i)
1167 {
1168         struct venc_t *venc = inst->priv;
1169         int num = -1;
1170
1171         switch (i) {
1172         case 0:
1173                 num = scnprintf(str, size, "profile = %d\n", venc->params.profile);
1174                 break;
1175         case 1:
1176                 num = scnprintf(str, size, "level = %d\n", venc->params.level);
1177                 break;
1178         case 2:
1179                 num = scnprintf(str, size, "fps = %d/%d\n",
1180                                 venc->params.frame_rate.numerator,
1181                                 venc->params.frame_rate.denominator);
1182                 break;
1183         case 3:
1184                 num = scnprintf(str, size, "%d x %d -> %d x %d\n",
1185                                 venc->params.src_width,
1186                                 venc->params.src_height,
1187                                 venc->params.out_width,
1188                                 venc->params.out_height);
1189                 break;
1190         case 4:
1191                 num = scnprintf(str, size, "(%d, %d)  %d x %d\n",
1192                                 venc->params.crop.left,
1193                                 venc->params.crop.top,
1194                                 venc->params.crop.width,
1195                                 venc->params.crop.height);
1196                 break;
1197         case 5:
1198                 num = scnprintf(str, size,
1199                                 "enable = 0x%x, input = %d, encode = %d, ready = %d, stopped = %d\n",
1200                                 venc->enable,
1201                                 venc->frame_count, venc->encode_count,
1202                                 venc->ready_count,
1203                                 venc->stopped);
1204                 break;
1205         case 6:
1206                 num = scnprintf(str, size, "gop = %d\n", venc->params.gop_length);
1207                 break;
1208         case 7:
1209                 num = scnprintf(str, size, "bframes = %d\n", venc->params.bframes);
1210                 break;
1211         case 8:
1212                 num = scnprintf(str, size, "rc: %s, mode = %d, bitrate = %d(%d), qp = %d\n",
1213                                 venc->params.rc_enable ? "enable" : "disable",
1214                                 venc->params.rc_mode,
1215                                 venc->params.bitrate,
1216                                 venc->params.bitrate_max,
1217                                 venc->params.i_frame_qp);
1218                 break;
1219         case 9:
1220                 num = scnprintf(str, size, "sar: enable = %d, idc = %d, %d x %d\n",
1221                                 venc->params.sar.enable,
1222                                 venc->params.sar.idc,
1223                                 venc->params.sar.width,
1224                                 venc->params.sar.height);
1225
1226                 break;
1227         case 10:
1228                 num = scnprintf(str, size,
1229                                 "colorspace: primaries = %d, transfer = %d, matrix = %d, full_range = %d\n",
1230                                 venc->params.color.primaries,
1231                                 venc->params.color.transfer,
1232                                 venc->params.color.matrix,
1233                                 venc->params.color.full_range);
1234                 break;
1235         case 11:
1236                 num = scnprintf(str, size, "skipped: count = %d, bytes = %d\n",
1237                                 venc->skipped_count, venc->skipped_bytes);
1238                 break;
1239         default:
1240                 break;
1241         }
1242
1243         return num;
1244 }
1245
1246 static struct vpu_inst_ops venc_inst_ops = {
1247         .ctrl_init = venc_ctrl_init,
1248         .check_ready = venc_check_ready,
1249         .input_done = venc_input_done,
1250         .get_one_frame = venc_frame_encoded,
1251         .stop_done = venc_stop_done,
1252         .event_notify = venc_event_notify,
1253         .release = venc_release,
1254         .cleanup = venc_cleanup,
1255         .start = venc_start_session,
1256         .mem_request = venc_request_mem_resource,
1257         .stop = venc_stop_session,
1258         .process_output = venc_process_output,
1259         .process_capture = venc_process_capture,
1260         .on_queue_empty = venc_on_queue_empty,
1261         .get_debug_info = venc_get_debug_info,
1262         .wait_prepare = vpu_inst_unlock,
1263         .wait_finish = vpu_inst_lock,
1264 };
1265
1266 static void venc_init(struct file *file)
1267 {
1268         struct vpu_inst *inst = to_inst(file);
1269         struct venc_t *venc;
1270         struct v4l2_format f;
1271         struct v4l2_streamparm parm;
1272
1273         venc = inst->priv;
1274         venc->params.qp_min = 1;
1275         venc->params.qp_max = 51;
1276         venc->params.qp_min_i = 1;
1277         venc->params.qp_max_i = 51;
1278         venc->params.bitrate_min = BITRATE_MIN;
1279
1280         memset(&f, 0, sizeof(f));
1281         f.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1282         f.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12M;
1283         f.fmt.pix_mp.width = 1280;
1284         f.fmt.pix_mp.height = 720;
1285         f.fmt.pix_mp.field = V4L2_FIELD_NONE;
1286         f.fmt.pix_mp.colorspace = V4L2_COLORSPACE_REC709;
1287         venc_s_fmt(file, &inst->fh, &f);
1288
1289         memset(&f, 0, sizeof(f));
1290         f.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1291         f.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
1292         f.fmt.pix_mp.width = 1280;
1293         f.fmt.pix_mp.height = 720;
1294         f.fmt.pix_mp.field = V4L2_FIELD_NONE;
1295         venc_s_fmt(file, &inst->fh, &f);
1296
1297         memset(&parm, 0, sizeof(parm));
1298         parm.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1299         parm.parm.capture.timeperframe.numerator = 1;
1300         parm.parm.capture.timeperframe.denominator = 30;
1301         venc_s_parm(file, &inst->fh, &parm);
1302 }
1303
1304 static int venc_open(struct file *file)
1305 {
1306         struct vpu_inst *inst;
1307         struct venc_t *venc;
1308         int ret;
1309
1310         inst = vzalloc(sizeof(*inst));
1311         if (!inst)
1312                 return -ENOMEM;
1313
1314         venc = vzalloc(sizeof(*venc));
1315         if (!venc) {
1316                 vfree(inst);
1317                 return -ENOMEM;
1318         }
1319
1320         inst->ops = &venc_inst_ops;
1321         inst->formats = venc_formats;
1322         inst->type = VPU_CORE_TYPE_ENC;
1323         inst->priv = venc;
1324         INIT_LIST_HEAD(&venc->frames);
1325         init_waitqueue_head(&venc->wq);
1326
1327         ret = vpu_v4l2_open(file, inst);
1328         if (ret)
1329                 return ret;
1330
1331         inst->min_buffer_out = VENC_MIN_BUFFER_OUT;
1332         inst->min_buffer_cap = VENC_MIN_BUFFER_CAP;
1333         venc_init(file);
1334
1335         return 0;
1336 }
1337
1338 static const struct v4l2_file_operations venc_fops = {
1339         .owner = THIS_MODULE,
1340         .open = venc_open,
1341         .release = vpu_v4l2_close,
1342         .unlocked_ioctl = video_ioctl2,
1343         .poll = v4l2_m2m_fop_poll,
1344         .mmap = v4l2_m2m_fop_mmap,
1345 };
1346
1347 const struct v4l2_ioctl_ops *venc_get_ioctl_ops(void)
1348 {
1349         return &venc_ioctl_ops;
1350 }
1351
1352 const struct v4l2_file_operations *venc_get_fops(void)
1353 {
1354         return &venc_fops;
1355 }