GNU Linux-libre 6.8.7-gnu
[releases.git] / drivers / media / platform / amphion / vdec.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/vmalloc.h>
13 #include <linux/videodev2.h>
14 #include <media/v4l2-device.h>
15 #include <media/v4l2-event.h>
16 #include <media/v4l2-mem2mem.h>
17 #include <media/v4l2-ioctl.h>
18 #include <media/videobuf2-v4l2.h>
19 #include <media/videobuf2-dma-contig.h>
20 #include <media/videobuf2-vmalloc.h>
21 #include "vpu.h"
22 #include "vpu_defs.h"
23 #include "vpu_core.h"
24 #include "vpu_helpers.h"
25 #include "vpu_v4l2.h"
26 #include "vpu_cmds.h"
27 #include "vpu_rpc.h"
28
29 #define VDEC_MIN_BUFFER_CAP             8
30 #define VDEC_MIN_BUFFER_OUT             8
31
32 struct vdec_fs_info {
33         char name[8];
34         u32 type;
35         u32 max_count;
36         u32 req_count;
37         u32 count;
38         u32 index;
39         u32 size;
40         struct vpu_buffer buffer[32];
41         u32 tag;
42 };
43
44 struct vdec_t {
45         u32 seq_hdr_found;
46         struct vpu_buffer udata;
47         struct vpu_decode_params params;
48         struct vpu_dec_codec_info codec_info;
49         enum vpu_codec_state state;
50
51         struct vpu_vb2_buffer *slots[VB2_MAX_FRAME];
52         u32 req_frame_count;
53         struct vdec_fs_info mbi;
54         struct vdec_fs_info dcp;
55         u32 seq_tag;
56
57         bool reset_codec;
58         bool fixed_fmt;
59         u32 decoded_frame_count;
60         u32 display_frame_count;
61         u32 sequence;
62         u32 eos_received;
63         bool is_source_changed;
64         u32 source_change;
65         u32 drain;
66         bool aborting;
67 };
68
69 static const struct vpu_format vdec_formats[] = {
70         {
71                 .pixfmt = V4L2_PIX_FMT_NV12M_8L128,
72                 .mem_planes = 2,
73                 .comp_planes = 2,
74                 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
75                 .sibling = V4L2_PIX_FMT_NV12_8L128,
76         },
77         {
78                 .pixfmt = V4L2_PIX_FMT_NV12_8L128,
79                 .mem_planes = 1,
80                 .comp_planes = 2,
81                 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
82                 .sibling = V4L2_PIX_FMT_NV12M_8L128,
83         },
84         {
85                 .pixfmt = V4L2_PIX_FMT_NV12M_10BE_8L128,
86                 .mem_planes = 2,
87                 .comp_planes = 2,
88                 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
89                 .sibling = V4L2_PIX_FMT_NV12_10BE_8L128,
90         },
91         {
92                 .pixfmt = V4L2_PIX_FMT_NV12_10BE_8L128,
93                 .mem_planes = 1,
94                 .comp_planes = 2,
95                 .type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
96                 .sibling = V4L2_PIX_FMT_NV12M_10BE_8L128
97         },
98         {
99                 .pixfmt = V4L2_PIX_FMT_H264,
100                 .mem_planes = 1,
101                 .comp_planes = 1,
102                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
103                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
104         },
105         {
106                 .pixfmt = V4L2_PIX_FMT_H264_MVC,
107                 .mem_planes = 1,
108                 .comp_planes = 1,
109                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
110                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
111         },
112         {
113                 .pixfmt = V4L2_PIX_FMT_HEVC,
114                 .mem_planes = 1,
115                 .comp_planes = 1,
116                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
117                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
118         },
119         {
120                 .pixfmt = V4L2_PIX_FMT_VC1_ANNEX_G,
121                 .mem_planes = 1,
122                 .comp_planes = 1,
123                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
124                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
125         },
126         {
127                 .pixfmt = V4L2_PIX_FMT_VC1_ANNEX_L,
128                 .mem_planes = 1,
129                 .comp_planes = 1,
130                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
131                 .flags = V4L2_FMT_FLAG_COMPRESSED
132         },
133         {
134                 .pixfmt = V4L2_PIX_FMT_MPEG2,
135                 .mem_planes = 1,
136                 .comp_planes = 1,
137                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
138                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
139         },
140         {
141                 .pixfmt = V4L2_PIX_FMT_MPEG4,
142                 .mem_planes = 1,
143                 .comp_planes = 1,
144                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
145                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
146         },
147         {
148                 .pixfmt = V4L2_PIX_FMT_XVID,
149                 .mem_planes = 1,
150                 .comp_planes = 1,
151                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
152                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
153         },
154         {
155                 .pixfmt = V4L2_PIX_FMT_VP8,
156                 .mem_planes = 1,
157                 .comp_planes = 1,
158                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
159                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
160         },
161         {
162                 .pixfmt = V4L2_PIX_FMT_H263,
163                 .mem_planes = 1,
164                 .comp_planes = 1,
165                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
166                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
167         },
168         {
169                 .pixfmt = V4L2_PIX_FMT_SPK,
170                 .mem_planes = 1,
171                 .comp_planes = 1,
172                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
173                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
174         },
175         {
176                 .pixfmt = V4L2_PIX_FMT_RV30,
177                 .mem_planes = 1,
178                 .comp_planes = 1,
179                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
180                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
181         },
182         {
183                 .pixfmt = V4L2_PIX_FMT_RV40,
184                 .mem_planes = 1,
185                 .comp_planes = 1,
186                 .type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE,
187                 .flags = V4L2_FMT_FLAG_DYN_RESOLUTION | V4L2_FMT_FLAG_COMPRESSED
188         },
189         {0, 0, 0, 0},
190 };
191
192 static int vdec_op_s_ctrl(struct v4l2_ctrl *ctrl)
193 {
194         struct vpu_inst *inst = ctrl_to_inst(ctrl);
195         struct vdec_t *vdec = inst->priv;
196         int ret = 0;
197
198         vpu_inst_lock(inst);
199         switch (ctrl->id) {
200         case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE:
201                 vdec->params.display_delay_enable = ctrl->val;
202                 break;
203         case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY:
204                 vdec->params.display_delay = ctrl->val;
205                 break;
206         default:
207                 ret = -EINVAL;
208                 break;
209         }
210         vpu_inst_unlock(inst);
211
212         return ret;
213 }
214
215 static const struct v4l2_ctrl_ops vdec_ctrl_ops = {
216         .s_ctrl = vdec_op_s_ctrl,
217         .g_volatile_ctrl = vpu_helper_g_volatile_ctrl,
218 };
219
220 static int vdec_ctrl_init(struct vpu_inst *inst)
221 {
222         struct v4l2_ctrl *ctrl;
223         int ret;
224
225         ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 20);
226         if (ret)
227                 return ret;
228
229         v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,
230                           V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY,
231                           0, 0, 1, 0);
232
233         v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,
234                           V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE,
235                           0, 1, 1, 0);
236
237         ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,
238                                  V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, 1, 32, 1, 2);
239         if (ctrl)
240                 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
241
242         ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,
243                                  V4L2_CID_MIN_BUFFERS_FOR_OUTPUT, 1, 32, 1, 2);
244         if (ctrl)
245                 ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
246
247         if (inst->ctrl_handler.error) {
248                 ret = inst->ctrl_handler.error;
249                 v4l2_ctrl_handler_free(&inst->ctrl_handler);
250                 return ret;
251         }
252
253         ret = v4l2_ctrl_handler_setup(&inst->ctrl_handler);
254         if (ret) {
255                 dev_err(inst->dev, "[%d] setup ctrls fail, ret = %d\n", inst->id, ret);
256                 v4l2_ctrl_handler_free(&inst->ctrl_handler);
257                 return ret;
258         }
259
260         return 0;
261 }
262
263 static void vdec_handle_resolution_change(struct vpu_inst *inst)
264 {
265         struct vdec_t *vdec = inst->priv;
266         struct vb2_queue *q;
267
268         if (!inst->fh.m2m_ctx)
269                 return;
270
271         if (inst->state != VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE)
272                 return;
273         if (!vdec->source_change)
274                 return;
275
276         q = v4l2_m2m_get_dst_vq(inst->fh.m2m_ctx);
277         if (!list_empty(&q->done_list))
278                 return;
279
280         vdec->source_change--;
281         vpu_notify_source_change(inst);
282         vpu_set_last_buffer_dequeued(inst, false);
283 }
284
285 static int vdec_update_state(struct vpu_inst *inst, enum vpu_codec_state state, u32 force)
286 {
287         struct vdec_t *vdec = inst->priv;
288         enum vpu_codec_state pre_state = inst->state;
289
290         if (state == VPU_CODEC_STATE_SEEK) {
291                 if (inst->state == VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE)
292                         vdec->state = inst->state;
293                 else
294                         vdec->state = VPU_CODEC_STATE_ACTIVE;
295         }
296         if (inst->state != VPU_CODEC_STATE_SEEK || force)
297                 inst->state = state;
298         else if (state == VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE)
299                 vdec->state = VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE;
300
301         if (inst->state != pre_state)
302                 vpu_trace(inst->dev, "[%d] %s -> %s\n", inst->id,
303                           vpu_codec_state_name(pre_state), vpu_codec_state_name(inst->state));
304
305         if (inst->state == VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE)
306                 vdec_handle_resolution_change(inst);
307
308         return 0;
309 }
310
311 static void vdec_set_last_buffer_dequeued(struct vpu_inst *inst)
312 {
313         struct vdec_t *vdec = inst->priv;
314
315         if (inst->state == VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE)
316                 return;
317
318         if (vdec->eos_received) {
319                 if (!vpu_set_last_buffer_dequeued(inst, true)) {
320                         vdec->eos_received--;
321                         vdec_update_state(inst, VPU_CODEC_STATE_DRAIN, 0);
322                 }
323         }
324 }
325
326 static int vdec_querycap(struct file *file, void *fh, struct v4l2_capability *cap)
327 {
328         strscpy(cap->driver, "amphion-vpu", sizeof(cap->driver));
329         strscpy(cap->card, "amphion vpu decoder", sizeof(cap->card));
330         strscpy(cap->bus_info, "platform: amphion-vpu", sizeof(cap->bus_info));
331
332         return 0;
333 }
334
335 static int vdec_enum_fmt(struct file *file, void *fh, struct v4l2_fmtdesc *f)
336 {
337         struct vpu_inst *inst = to_inst(file);
338         struct vdec_t *vdec = inst->priv;
339         const struct vpu_format *fmt;
340         int ret = -EINVAL;
341
342         vpu_inst_lock(inst);
343         if (V4L2_TYPE_IS_CAPTURE(f->type) && vdec->fixed_fmt) {
344                 fmt = vpu_get_format(inst, f->type);
345                 if (f->index == 1)
346                         fmt = vpu_helper_find_sibling(inst, f->type, fmt->pixfmt);
347                 if (f->index > 1)
348                         fmt = NULL;
349         } else {
350                 fmt = vpu_helper_enum_format(inst, f->type, f->index);
351         }
352         if (!fmt)
353                 goto exit;
354
355         memset(f->reserved, 0, sizeof(f->reserved));
356         f->pixelformat = fmt->pixfmt;
357         f->flags = fmt->flags;
358         ret = 0;
359 exit:
360         vpu_inst_unlock(inst);
361         return ret;
362 }
363
364 static int vdec_g_fmt(struct file *file, void *fh, struct v4l2_format *f)
365 {
366         struct vpu_inst *inst = to_inst(file);
367         struct vdec_t *vdec = inst->priv;
368         struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;
369         struct vpu_format *cur_fmt;
370         int i;
371
372         vpu_inst_lock(inst);
373         cur_fmt = vpu_get_format(inst, f->type);
374
375         pixmp->pixelformat = cur_fmt->pixfmt;
376         pixmp->num_planes = cur_fmt->mem_planes;
377         pixmp->width = cur_fmt->width;
378         pixmp->height = cur_fmt->height;
379         pixmp->field = cur_fmt->field;
380         pixmp->flags = cur_fmt->flags;
381         for (i = 0; i < pixmp->num_planes; i++) {
382                 pixmp->plane_fmt[i].bytesperline = cur_fmt->bytesperline[i];
383                 pixmp->plane_fmt[i].sizeimage = vpu_get_fmt_plane_size(cur_fmt, i);
384         }
385
386         f->fmt.pix_mp.colorspace = vdec->codec_info.color_primaries;
387         f->fmt.pix_mp.xfer_func = vdec->codec_info.transfer_chars;
388         f->fmt.pix_mp.ycbcr_enc = vdec->codec_info.matrix_coeffs;
389         f->fmt.pix_mp.quantization = vdec->codec_info.full_range;
390         vpu_inst_unlock(inst);
391
392         return 0;
393 }
394
395 static int vdec_try_fmt(struct file *file, void *fh, struct v4l2_format *f)
396 {
397         struct vpu_inst *inst = to_inst(file);
398         struct vdec_t *vdec = inst->priv;
399         struct vpu_format fmt;
400
401         vpu_inst_lock(inst);
402         if (V4L2_TYPE_IS_CAPTURE(f->type) && vdec->fixed_fmt) {
403                 struct vpu_format *cap_fmt = vpu_get_format(inst, f->type);
404
405                 if (!vpu_helper_match_format(inst, cap_fmt->type, cap_fmt->pixfmt,
406                                              f->fmt.pix_mp.pixelformat))
407                         f->fmt.pix_mp.pixelformat = cap_fmt->pixfmt;
408         }
409
410         vpu_try_fmt_common(inst, f, &fmt);
411
412         if (vdec->fixed_fmt) {
413                 f->fmt.pix_mp.colorspace = vdec->codec_info.color_primaries;
414                 f->fmt.pix_mp.xfer_func = vdec->codec_info.transfer_chars;
415                 f->fmt.pix_mp.ycbcr_enc = vdec->codec_info.matrix_coeffs;
416                 f->fmt.pix_mp.quantization = vdec->codec_info.full_range;
417         } else {
418                 f->fmt.pix_mp.colorspace = V4L2_COLORSPACE_DEFAULT;
419                 f->fmt.pix_mp.xfer_func = V4L2_XFER_FUNC_DEFAULT;
420                 f->fmt.pix_mp.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
421                 f->fmt.pix_mp.quantization = V4L2_QUANTIZATION_DEFAULT;
422         }
423         vpu_inst_unlock(inst);
424
425         return 0;
426 }
427
428 static int vdec_s_fmt_common(struct vpu_inst *inst, struct v4l2_format *f)
429 {
430         struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;
431         struct vpu_format fmt;
432         struct vpu_format *cur_fmt;
433         struct vb2_queue *q;
434         struct vdec_t *vdec = inst->priv;
435         int i;
436
437         if (!inst->fh.m2m_ctx)
438                 return -EINVAL;
439
440         q = v4l2_m2m_get_vq(inst->fh.m2m_ctx, f->type);
441         if (!q)
442                 return -EINVAL;
443         if (vb2_is_busy(q))
444                 return -EBUSY;
445
446         if (vpu_try_fmt_common(inst, f, &fmt))
447                 return -EINVAL;
448
449         cur_fmt = vpu_get_format(inst, f->type);
450         if (V4L2_TYPE_IS_OUTPUT(f->type) && inst->state != VPU_CODEC_STATE_DEINIT) {
451                 if (cur_fmt->pixfmt != fmt.pixfmt) {
452                         vdec->reset_codec = true;
453                         vdec->fixed_fmt = false;
454                 }
455         }
456         if (V4L2_TYPE_IS_OUTPUT(f->type) || !vdec->fixed_fmt) {
457                 memcpy(cur_fmt, &fmt, sizeof(*cur_fmt));
458         } else {
459                 if (vpu_helper_match_format(inst, f->type, cur_fmt->pixfmt, pixmp->pixelformat)) {
460                         cur_fmt->pixfmt = fmt.pixfmt;
461                         cur_fmt->mem_planes = fmt.mem_planes;
462                 }
463                 pixmp->pixelformat = cur_fmt->pixfmt;
464                 pixmp->num_planes = cur_fmt->mem_planes;
465                 pixmp->width = cur_fmt->width;
466                 pixmp->height = cur_fmt->height;
467                 for (i = 0; i < pixmp->num_planes; i++) {
468                         pixmp->plane_fmt[i].bytesperline = cur_fmt->bytesperline[i];
469                         pixmp->plane_fmt[i].sizeimage = vpu_get_fmt_plane_size(cur_fmt, i);
470                 }
471                 pixmp->field = cur_fmt->field;
472         }
473
474         if (!vdec->fixed_fmt) {
475                 if (V4L2_TYPE_IS_OUTPUT(f->type)) {
476                         vdec->params.codec_format = cur_fmt->pixfmt;
477                         vdec->codec_info.color_primaries = f->fmt.pix_mp.colorspace;
478                         vdec->codec_info.transfer_chars = f->fmt.pix_mp.xfer_func;
479                         vdec->codec_info.matrix_coeffs = f->fmt.pix_mp.ycbcr_enc;
480                         vdec->codec_info.full_range = f->fmt.pix_mp.quantization;
481                 } else {
482                         vdec->params.output_format = cur_fmt->pixfmt;
483                         inst->crop.left = 0;
484                         inst->crop.top = 0;
485                         inst->crop.width = cur_fmt->width;
486                         inst->crop.height = cur_fmt->height;
487                 }
488         }
489
490         vpu_trace(inst->dev, "[%d] %c%c%c%c %dx%d\n", inst->id,
491                   f->fmt.pix_mp.pixelformat,
492                   f->fmt.pix_mp.pixelformat >> 8,
493                   f->fmt.pix_mp.pixelformat >> 16,
494                   f->fmt.pix_mp.pixelformat >> 24,
495                   f->fmt.pix_mp.width,
496                   f->fmt.pix_mp.height);
497
498         return 0;
499 }
500
501 static int vdec_s_fmt(struct file *file, void *fh, struct v4l2_format *f)
502 {
503         struct vpu_inst *inst = to_inst(file);
504         struct v4l2_pix_format_mplane *pixmp = &f->fmt.pix_mp;
505         struct vdec_t *vdec = inst->priv;
506         int ret = 0;
507
508         vpu_inst_lock(inst);
509         ret = vdec_s_fmt_common(inst, f);
510         if (ret)
511                 goto exit;
512
513         if (V4L2_TYPE_IS_OUTPUT(f->type) && !vdec->fixed_fmt) {
514                 struct v4l2_format fc;
515
516                 memset(&fc, 0, sizeof(fc));
517                 fc.type = inst->cap_format.type;
518                 fc.fmt.pix_mp.pixelformat = inst->cap_format.pixfmt;
519                 fc.fmt.pix_mp.width = pixmp->width;
520                 fc.fmt.pix_mp.height = pixmp->height;
521                 vdec_s_fmt_common(inst, &fc);
522         }
523
524         f->fmt.pix_mp.colorspace = vdec->codec_info.color_primaries;
525         f->fmt.pix_mp.xfer_func = vdec->codec_info.transfer_chars;
526         f->fmt.pix_mp.ycbcr_enc = vdec->codec_info.matrix_coeffs;
527         f->fmt.pix_mp.quantization = vdec->codec_info.full_range;
528
529 exit:
530         vpu_inst_unlock(inst);
531         return ret;
532 }
533
534 static int vdec_g_selection(struct file *file, void *fh, struct v4l2_selection *s)
535 {
536         struct vpu_inst *inst = to_inst(file);
537
538         if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE && s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)
539                 return -EINVAL;
540
541         switch (s->target) {
542         case V4L2_SEL_TGT_COMPOSE:
543         case V4L2_SEL_TGT_COMPOSE_DEFAULT:
544         case V4L2_SEL_TGT_COMPOSE_PADDED:
545                 s->r = inst->crop;
546                 break;
547         case V4L2_SEL_TGT_COMPOSE_BOUNDS:
548                 s->r.left = 0;
549                 s->r.top = 0;
550                 s->r.width = inst->cap_format.width;
551                 s->r.height = inst->cap_format.height;
552                 break;
553         default:
554                 return -EINVAL;
555         }
556
557         return 0;
558 }
559
560 static int vdec_drain(struct vpu_inst *inst)
561 {
562         struct vdec_t *vdec = inst->priv;
563
564         if (!inst->fh.m2m_ctx)
565                 return 0;
566
567         if (!vdec->drain)
568                 return 0;
569
570         if (!vpu_is_source_empty(inst))
571                 return 0;
572
573         if (!vdec->params.frame_count) {
574                 vpu_set_last_buffer_dequeued(inst, true);
575                 return 0;
576         }
577
578         vpu_iface_add_scode(inst, SCODE_PADDING_EOS);
579         vdec->params.end_flag = 1;
580         vpu_iface_set_decode_params(inst, &vdec->params, 1);
581         vdec->drain = 0;
582         vpu_trace(inst->dev, "[%d] frame_count = %d\n", inst->id, vdec->params.frame_count);
583
584         return 0;
585 }
586
587 static int vdec_cmd_start(struct vpu_inst *inst)
588 {
589         struct vdec_t *vdec = inst->priv;
590
591         switch (inst->state) {
592         case VPU_CODEC_STATE_STARTED:
593         case VPU_CODEC_STATE_DRAIN:
594         case VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE:
595                 vdec_update_state(inst, VPU_CODEC_STATE_ACTIVE, 0);
596                 break;
597         default:
598                 break;
599         }
600         vpu_process_capture_buffer(inst);
601         if (vdec->eos_received)
602                 vdec_set_last_buffer_dequeued(inst);
603         return 0;
604 }
605
606 static int vdec_cmd_stop(struct vpu_inst *inst)
607 {
608         struct vdec_t *vdec = inst->priv;
609
610         vpu_trace(inst->dev, "[%d]\n", inst->id);
611
612         if (inst->state == VPU_CODEC_STATE_DEINIT) {
613                 vpu_set_last_buffer_dequeued(inst, true);
614         } else {
615                 vdec->drain = 1;
616                 vdec_drain(inst);
617         }
618
619         return 0;
620 }
621
622 static int vdec_decoder_cmd(struct file *file, void *fh, struct v4l2_decoder_cmd *cmd)
623 {
624         struct vpu_inst *inst = to_inst(file);
625         int ret;
626
627         ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, cmd);
628         if (ret)
629                 return ret;
630
631         vpu_inst_lock(inst);
632         switch (cmd->cmd) {
633         case V4L2_DEC_CMD_START:
634                 vdec_cmd_start(inst);
635                 break;
636         case V4L2_DEC_CMD_STOP:
637                 vdec_cmd_stop(inst);
638                 break;
639         default:
640                 break;
641         }
642         vpu_inst_unlock(inst);
643
644         return 0;
645 }
646
647 static int vdec_subscribe_event(struct v4l2_fh *fh, const struct v4l2_event_subscription *sub)
648 {
649         switch (sub->type) {
650         case V4L2_EVENT_EOS:
651                 return v4l2_event_subscribe(fh, sub, 0, NULL);
652         case V4L2_EVENT_SOURCE_CHANGE:
653                 return v4l2_src_change_event_subscribe(fh, sub);
654         case V4L2_EVENT_CTRL:
655                 return v4l2_ctrl_subscribe_event(fh, sub);
656         default:
657                 return -EINVAL;
658         }
659
660         return 0;
661 }
662
663 static const struct v4l2_ioctl_ops vdec_ioctl_ops = {
664         .vidioc_querycap               = vdec_querycap,
665         .vidioc_enum_fmt_vid_cap       = vdec_enum_fmt,
666         .vidioc_enum_fmt_vid_out       = vdec_enum_fmt,
667         .vidioc_g_fmt_vid_cap_mplane   = vdec_g_fmt,
668         .vidioc_g_fmt_vid_out_mplane   = vdec_g_fmt,
669         .vidioc_try_fmt_vid_cap_mplane = vdec_try_fmt,
670         .vidioc_try_fmt_vid_out_mplane = vdec_try_fmt,
671         .vidioc_s_fmt_vid_cap_mplane   = vdec_s_fmt,
672         .vidioc_s_fmt_vid_out_mplane   = vdec_s_fmt,
673         .vidioc_g_selection            = vdec_g_selection,
674         .vidioc_try_decoder_cmd        = v4l2_m2m_ioctl_try_decoder_cmd,
675         .vidioc_decoder_cmd            = vdec_decoder_cmd,
676         .vidioc_subscribe_event        = vdec_subscribe_event,
677         .vidioc_unsubscribe_event      = v4l2_event_unsubscribe,
678         .vidioc_reqbufs                = v4l2_m2m_ioctl_reqbufs,
679         .vidioc_create_bufs            = v4l2_m2m_ioctl_create_bufs,
680         .vidioc_prepare_buf            = v4l2_m2m_ioctl_prepare_buf,
681         .vidioc_querybuf               = v4l2_m2m_ioctl_querybuf,
682         .vidioc_qbuf                   = v4l2_m2m_ioctl_qbuf,
683         .vidioc_expbuf                 = v4l2_m2m_ioctl_expbuf,
684         .vidioc_dqbuf                  = v4l2_m2m_ioctl_dqbuf,
685         .vidioc_streamon               = v4l2_m2m_ioctl_streamon,
686         .vidioc_streamoff              = v4l2_m2m_ioctl_streamoff,
687 };
688
689 static bool vdec_check_ready(struct vpu_inst *inst, unsigned int type)
690 {
691         struct vdec_t *vdec = inst->priv;
692
693         if (V4L2_TYPE_IS_OUTPUT(type))
694                 return true;
695
696         if (vdec->req_frame_count)
697                 return true;
698
699         return false;
700 }
701
702 static struct vb2_v4l2_buffer *vdec_get_src_buffer(struct vpu_inst *inst, u32 count)
703 {
704         if (count > 1)
705                 vpu_skip_frame(inst, count - 1);
706
707         return vpu_next_src_buf(inst);
708 }
709
710 static int vdec_frame_decoded(struct vpu_inst *inst, void *arg)
711 {
712         struct vdec_t *vdec = inst->priv;
713         struct vpu_dec_pic_info *info = arg;
714         struct vpu_vb2_buffer *vpu_buf;
715         struct vb2_v4l2_buffer *vbuf;
716         struct vb2_v4l2_buffer *src_buf;
717         int ret = 0;
718
719         if (!info || info->id >= ARRAY_SIZE(vdec->slots))
720                 return -EINVAL;
721
722         vpu_inst_lock(inst);
723         vpu_buf = vdec->slots[info->id];
724         if (!vpu_buf) {
725                 dev_err(inst->dev, "[%d] decoded invalid frame[%d]\n", inst->id, info->id);
726                 ret = -EINVAL;
727                 goto exit;
728         }
729         vbuf = &vpu_buf->m2m_buf.vb;
730         src_buf = vdec_get_src_buffer(inst, info->consumed_count);
731         if (src_buf) {
732                 v4l2_m2m_buf_copy_metadata(src_buf, vbuf, true);
733                 if (info->consumed_count) {
734                         v4l2_m2m_src_buf_remove(inst->fh.m2m_ctx);
735                         vpu_set_buffer_state(src_buf, VPU_BUF_STATE_IDLE);
736                         v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
737                 } else {
738                         vpu_set_buffer_state(src_buf, VPU_BUF_STATE_DECODED);
739                 }
740         }
741         if (vpu_get_buffer_state(vbuf) == VPU_BUF_STATE_DECODED)
742                 dev_info(inst->dev, "[%d] buf[%d] has been decoded\n", inst->id, info->id);
743         vpu_set_buffer_state(vbuf, VPU_BUF_STATE_DECODED);
744         vdec->decoded_frame_count++;
745         if (vdec->params.display_delay_enable) {
746                 struct vpu_format *cur_fmt;
747
748                 cur_fmt = vpu_get_format(inst, inst->cap_format.type);
749                 vpu_set_buffer_state(vbuf, VPU_BUF_STATE_READY);
750                 for (int i = 0; i < vbuf->vb2_buf.num_planes; i++)
751                         vb2_set_plane_payload(&vbuf->vb2_buf,
752                                               i, vpu_get_fmt_plane_size(cur_fmt, i));
753                 vbuf->field = cur_fmt->field;
754                 vbuf->sequence = vdec->sequence++;
755                 dev_dbg(inst->dev, "[%d][OUTPUT TS]%32lld\n", inst->id, vbuf->vb2_buf.timestamp);
756
757                 v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_DONE);
758                 vdec->display_frame_count++;
759         }
760 exit:
761         vpu_inst_unlock(inst);
762
763         return ret;
764 }
765
766 static struct vpu_vb2_buffer *vdec_find_buffer(struct vpu_inst *inst, u32 luma)
767 {
768         struct vdec_t *vdec = inst->priv;
769         int i;
770
771         for (i = 0; i < ARRAY_SIZE(vdec->slots); i++) {
772                 if (!vdec->slots[i])
773                         continue;
774                 if (luma == vdec->slots[i]->luma)
775                         return vdec->slots[i];
776         }
777
778         return NULL;
779 }
780
781 static void vdec_buf_done(struct vpu_inst *inst, struct vpu_frame_info *frame)
782 {
783         struct vdec_t *vdec = inst->priv;
784         struct vpu_format *cur_fmt;
785         struct vpu_vb2_buffer *vpu_buf;
786         struct vb2_v4l2_buffer *vbuf;
787         int i;
788
789         if (!frame)
790                 return;
791
792         vpu_inst_lock(inst);
793         if (!vdec->params.display_delay_enable)
794                 vdec->sequence++;
795         vpu_buf = vdec_find_buffer(inst, frame->luma);
796         vpu_inst_unlock(inst);
797         if (!vpu_buf) {
798                 dev_err(inst->dev, "[%d] can't find buffer, id = %d, addr = 0x%x\n",
799                         inst->id, frame->id, frame->luma);
800                 return;
801         }
802         if (frame->skipped) {
803                 dev_dbg(inst->dev, "[%d] frame skip\n", inst->id);
804                 return;
805         }
806
807         cur_fmt = vpu_get_format(inst, inst->cap_format.type);
808         vbuf = &vpu_buf->m2m_buf.vb;
809         if (vbuf->vb2_buf.index != frame->id)
810                 dev_err(inst->dev, "[%d] buffer id(%d, %d) dismatch\n",
811                         inst->id, vbuf->vb2_buf.index, frame->id);
812
813         if (vpu_get_buffer_state(vbuf) == VPU_BUF_STATE_READY && vdec->params.display_delay_enable)
814                 return;
815
816         if (vpu_get_buffer_state(vbuf) != VPU_BUF_STATE_DECODED)
817                 dev_err(inst->dev, "[%d] buffer(%d) ready without decoded\n", inst->id, frame->id);
818
819         vpu_set_buffer_state(vbuf, VPU_BUF_STATE_READY);
820         for (i = 0; i < vbuf->vb2_buf.num_planes; i++)
821                 vb2_set_plane_payload(&vbuf->vb2_buf, i, vpu_get_fmt_plane_size(cur_fmt, i));
822         vbuf->field = cur_fmt->field;
823         vbuf->sequence = vdec->sequence;
824         dev_dbg(inst->dev, "[%d][OUTPUT TS]%32lld\n", inst->id, vbuf->vb2_buf.timestamp);
825
826         v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_DONE);
827         vpu_inst_lock(inst);
828         vdec->display_frame_count++;
829         vpu_inst_unlock(inst);
830         dev_dbg(inst->dev, "[%d] decoded : %d, display : %d, sequence : %d\n",
831                 inst->id, vdec->decoded_frame_count, vdec->display_frame_count, vdec->sequence);
832 }
833
834 static void vdec_stop_done(struct vpu_inst *inst)
835 {
836         struct vdec_t *vdec = inst->priv;
837
838         vpu_inst_lock(inst);
839         vdec_update_state(inst, VPU_CODEC_STATE_DEINIT, 0);
840         vdec->seq_hdr_found = 0;
841         vdec->req_frame_count = 0;
842         vdec->reset_codec = false;
843         vdec->fixed_fmt = false;
844         vdec->params.end_flag = 0;
845         vdec->drain = 0;
846         vdec->params.frame_count = 0;
847         vdec->decoded_frame_count = 0;
848         vdec->display_frame_count = 0;
849         vdec->sequence = 0;
850         vdec->eos_received = 0;
851         vdec->is_source_changed = false;
852         vdec->source_change = 0;
853         inst->total_input_count = 0;
854         vpu_inst_unlock(inst);
855 }
856
857 static bool vdec_check_source_change(struct vpu_inst *inst)
858 {
859         struct vdec_t *vdec = inst->priv;
860         const struct vpu_format *sibling;
861
862         if (!inst->fh.m2m_ctx)
863                 return false;
864
865         if (vdec->reset_codec)
866                 return false;
867
868         sibling = vpu_helper_find_sibling(inst, inst->cap_format.type, inst->cap_format.pixfmt);
869         if (sibling && vdec->codec_info.pixfmt == sibling->pixfmt)
870                 vdec->codec_info.pixfmt = inst->cap_format.pixfmt;
871
872         if (!vb2_is_streaming(v4l2_m2m_get_dst_vq(inst->fh.m2m_ctx)))
873                 return true;
874         if (inst->cap_format.pixfmt != vdec->codec_info.pixfmt)
875                 return true;
876         if (inst->cap_format.width != vdec->codec_info.decoded_width)
877                 return true;
878         if (inst->cap_format.height != vdec->codec_info.decoded_height)
879                 return true;
880         if (vpu_get_num_buffers(inst, inst->cap_format.type) < inst->min_buffer_cap)
881                 return true;
882         if (inst->crop.left != vdec->codec_info.offset_x)
883                 return true;
884         if (inst->crop.top != vdec->codec_info.offset_y)
885                 return true;
886         if (inst->crop.width != vdec->codec_info.width)
887                 return true;
888         if (inst->crop.height != vdec->codec_info.height)
889                 return true;
890
891         return false;
892 }
893
894 static void vdec_init_fmt(struct vpu_inst *inst)
895 {
896         struct vdec_t *vdec = inst->priv;
897         struct v4l2_format f;
898
899         memset(&f, 0, sizeof(f));
900         f.type = inst->cap_format.type;
901         f.fmt.pix_mp.pixelformat = vdec->codec_info.pixfmt;
902         f.fmt.pix_mp.width = vdec->codec_info.decoded_width;
903         f.fmt.pix_mp.height = vdec->codec_info.decoded_height;
904         if (vdec->codec_info.progressive)
905                 f.fmt.pix_mp.field = V4L2_FIELD_NONE;
906         else
907                 f.fmt.pix_mp.field = V4L2_FIELD_SEQ_TB;
908         vpu_try_fmt_common(inst, &f, &inst->cap_format);
909
910         inst->out_format.width = vdec->codec_info.width;
911         inst->out_format.height = vdec->codec_info.height;
912 }
913
914 static void vdec_init_crop(struct vpu_inst *inst)
915 {
916         struct vdec_t *vdec = inst->priv;
917
918         inst->crop.left = vdec->codec_info.offset_x;
919         inst->crop.top = vdec->codec_info.offset_y;
920         inst->crop.width = vdec->codec_info.width;
921         inst->crop.height = vdec->codec_info.height;
922 }
923
924 static void vdec_init_mbi(struct vpu_inst *inst)
925 {
926         struct vdec_t *vdec = inst->priv;
927
928         vdec->mbi.size = vdec->codec_info.mbi_size;
929         vdec->mbi.max_count = ARRAY_SIZE(vdec->mbi.buffer);
930         scnprintf(vdec->mbi.name, sizeof(vdec->mbi.name), "mbi");
931         vdec->mbi.type = MEM_RES_MBI;
932         vdec->mbi.tag = vdec->seq_tag;
933 }
934
935 static void vdec_init_dcp(struct vpu_inst *inst)
936 {
937         struct vdec_t *vdec = inst->priv;
938
939         vdec->dcp.size = vdec->codec_info.dcp_size;
940         vdec->dcp.max_count = ARRAY_SIZE(vdec->dcp.buffer);
941         scnprintf(vdec->dcp.name, sizeof(vdec->dcp.name), "dcp");
942         vdec->dcp.type = MEM_RES_DCP;
943         vdec->dcp.tag = vdec->seq_tag;
944 }
945
946 static void vdec_request_one_fs(struct vdec_fs_info *fs)
947 {
948         fs->req_count++;
949         if (fs->req_count > fs->max_count)
950                 fs->req_count = fs->max_count;
951 }
952
953 static int vdec_alloc_fs_buffer(struct vpu_inst *inst, struct vdec_fs_info *fs)
954 {
955         struct vpu_buffer *buffer;
956
957         if (!fs->size)
958                 return -EINVAL;
959
960         if (fs->count >= fs->req_count)
961                 return -EINVAL;
962
963         buffer = &fs->buffer[fs->count];
964         if (buffer->virt && buffer->length >= fs->size)
965                 return 0;
966
967         vpu_free_dma(buffer);
968         buffer->length = fs->size;
969         return vpu_alloc_dma(inst->core, buffer);
970 }
971
972 static void vdec_alloc_fs(struct vpu_inst *inst, struct vdec_fs_info *fs)
973 {
974         int ret;
975
976         while (fs->count < fs->req_count) {
977                 ret = vdec_alloc_fs_buffer(inst, fs);
978                 if (ret)
979                         break;
980                 fs->count++;
981         }
982 }
983
984 static void vdec_clear_fs(struct vdec_fs_info *fs)
985 {
986         u32 i;
987
988         if (!fs)
989                 return;
990
991         for (i = 0; i < ARRAY_SIZE(fs->buffer); i++)
992                 vpu_free_dma(&fs->buffer[i]);
993         memset(fs, 0, sizeof(*fs));
994 }
995
996 static int vdec_response_fs(struct vpu_inst *inst, struct vdec_fs_info *fs)
997 {
998         struct vpu_fs_info info;
999         int ret;
1000
1001         if (fs->index >= fs->count)
1002                 return 0;
1003
1004         memset(&info, 0, sizeof(info));
1005         info.id = fs->index;
1006         info.type = fs->type;
1007         info.tag = fs->tag;
1008         info.luma_addr = fs->buffer[fs->index].phys;
1009         info.luma_size = fs->buffer[fs->index].length;
1010         ret = vpu_session_alloc_fs(inst, &info);
1011         if (ret)
1012                 return ret;
1013
1014         fs->index++;
1015         return 0;
1016 }
1017
1018 static int vdec_response_frame_abnormal(struct vpu_inst *inst)
1019 {
1020         struct vdec_t *vdec = inst->priv;
1021         struct vpu_fs_info info;
1022         int ret;
1023
1024         if (!vdec->req_frame_count)
1025                 return 0;
1026
1027         memset(&info, 0, sizeof(info));
1028         info.type = MEM_RES_FRAME;
1029         info.tag = vdec->seq_tag + 0xf0;
1030         ret = vpu_session_alloc_fs(inst, &info);
1031         if (ret)
1032                 return ret;
1033         vdec->req_frame_count--;
1034
1035         return 0;
1036 }
1037
1038 static int vdec_response_frame(struct vpu_inst *inst, struct vb2_v4l2_buffer *vbuf)
1039 {
1040         struct vdec_t *vdec = inst->priv;
1041         struct vpu_vb2_buffer *vpu_buf;
1042         struct vpu_fs_info info;
1043         int ret;
1044
1045         if (inst->state != VPU_CODEC_STATE_ACTIVE)
1046                 return -EINVAL;
1047
1048         if (vdec->aborting)
1049                 return -EINVAL;
1050
1051         if (!vdec->req_frame_count)
1052                 return -EINVAL;
1053
1054         if (!vbuf)
1055                 return -EINVAL;
1056
1057         if (vdec->slots[vbuf->vb2_buf.index]) {
1058                 dev_err(inst->dev, "[%d] repeat alloc fs %d\n",
1059                         inst->id, vbuf->vb2_buf.index);
1060                 return -EINVAL;
1061         }
1062
1063         dev_dbg(inst->dev, "[%d] state = %s, alloc fs %d, tag = 0x%x\n",
1064                 inst->id, vpu_codec_state_name(inst->state), vbuf->vb2_buf.index, vdec->seq_tag);
1065         vpu_buf = to_vpu_vb2_buffer(vbuf);
1066
1067         memset(&info, 0, sizeof(info));
1068         info.id = vbuf->vb2_buf.index;
1069         info.type = MEM_RES_FRAME;
1070         info.tag = vdec->seq_tag;
1071         info.luma_addr = vpu_get_vb_phy_addr(&vbuf->vb2_buf, 0);
1072         info.luma_size = inst->cap_format.sizeimage[0];
1073         if (vbuf->vb2_buf.num_planes > 1)
1074                 info.chroma_addr = vpu_get_vb_phy_addr(&vbuf->vb2_buf, 1);
1075         else
1076                 info.chroma_addr = info.luma_addr + info.luma_size;
1077         info.chromau_size = inst->cap_format.sizeimage[1];
1078         info.bytesperline = inst->cap_format.bytesperline[0];
1079         ret = vpu_session_alloc_fs(inst, &info);
1080         if (ret)
1081                 return ret;
1082
1083         vpu_buf->tag = info.tag;
1084         vpu_buf->luma = info.luma_addr;
1085         vpu_buf->chroma_u = info.chroma_addr;
1086         vpu_buf->chroma_v = 0;
1087         vpu_set_buffer_state(vbuf, VPU_BUF_STATE_INUSE);
1088         vdec->slots[info.id] = vpu_buf;
1089         vdec->req_frame_count--;
1090
1091         return 0;
1092 }
1093
1094 static void vdec_response_fs_request(struct vpu_inst *inst, bool force)
1095 {
1096         struct vdec_t *vdec = inst->priv;
1097         int i;
1098         int ret;
1099
1100         if (force) {
1101                 for (i = vdec->req_frame_count; i > 0; i--)
1102                         vdec_response_frame_abnormal(inst);
1103                 return;
1104         }
1105
1106         for (i = vdec->req_frame_count; i > 0; i--) {
1107                 ret = vpu_process_capture_buffer(inst);
1108                 if (ret)
1109                         break;
1110                 if (vdec->eos_received)
1111                         break;
1112         }
1113
1114         for (i = vdec->mbi.index; i < vdec->mbi.count; i++) {
1115                 if (vdec_response_fs(inst, &vdec->mbi))
1116                         break;
1117                 if (vdec->eos_received)
1118                         break;
1119         }
1120         for (i = vdec->dcp.index; i < vdec->dcp.count; i++) {
1121                 if (vdec_response_fs(inst, &vdec->dcp))
1122                         break;
1123                 if (vdec->eos_received)
1124                         break;
1125         }
1126 }
1127
1128 static void vdec_response_fs_release(struct vpu_inst *inst, u32 id, u32 tag)
1129 {
1130         struct vpu_fs_info info;
1131
1132         memset(&info, 0, sizeof(info));
1133         info.id = id;
1134         info.tag = tag;
1135         vpu_session_release_fs(inst, &info);
1136 }
1137
1138 static void vdec_recycle_buffer(struct vpu_inst *inst, struct vb2_v4l2_buffer *vbuf)
1139 {
1140         if (!inst->fh.m2m_ctx)
1141                 return;
1142         if (vbuf->vb2_buf.state != VB2_BUF_STATE_ACTIVE)
1143                 return;
1144         if (vpu_find_buf_by_idx(inst, vbuf->vb2_buf.type, vbuf->vb2_buf.index))
1145                 return;
1146         v4l2_m2m_buf_queue(inst->fh.m2m_ctx, vbuf);
1147 }
1148
1149 static void vdec_clear_slots(struct vpu_inst *inst)
1150 {
1151         struct vdec_t *vdec = inst->priv;
1152         struct vpu_vb2_buffer *vpu_buf;
1153         struct vb2_v4l2_buffer *vbuf;
1154         int i;
1155
1156         for (i = 0; i < ARRAY_SIZE(vdec->slots); i++) {
1157                 if (!vdec->slots[i])
1158                         continue;
1159
1160                 vpu_buf = vdec->slots[i];
1161                 vbuf = &vpu_buf->m2m_buf.vb;
1162
1163                 vpu_trace(inst->dev, "clear slot %d\n", i);
1164                 vdec_response_fs_release(inst, i, vpu_buf->tag);
1165                 vdec_recycle_buffer(inst, vbuf);
1166                 vdec->slots[i]->state = VPU_BUF_STATE_IDLE;
1167                 vdec->slots[i] = NULL;
1168         }
1169 }
1170
1171 static void vdec_event_seq_hdr(struct vpu_inst *inst, struct vpu_dec_codec_info *hdr)
1172 {
1173         struct vdec_t *vdec = inst->priv;
1174
1175         vpu_inst_lock(inst);
1176         memcpy(&vdec->codec_info, hdr, sizeof(vdec->codec_info));
1177
1178         vpu_trace(inst->dev, "[%d] %d x %d, crop : (%d, %d) %d x %d, %d, %d\n",
1179                   inst->id,
1180                   vdec->codec_info.decoded_width,
1181                   vdec->codec_info.decoded_height,
1182                   vdec->codec_info.offset_x,
1183                   vdec->codec_info.offset_y,
1184                   vdec->codec_info.width,
1185                   vdec->codec_info.height,
1186                   hdr->num_ref_frms,
1187                   hdr->num_dpb_frms);
1188         inst->min_buffer_cap = hdr->num_ref_frms + hdr->num_dpb_frms;
1189         vdec->is_source_changed = vdec_check_source_change(inst);
1190         vdec_init_fmt(inst);
1191         vdec_init_crop(inst);
1192         vdec_init_mbi(inst);
1193         vdec_init_dcp(inst);
1194         if (!vdec->seq_hdr_found) {
1195                 vdec->seq_tag = vdec->codec_info.tag;
1196                 if (vdec->is_source_changed) {
1197                         vdec_update_state(inst, VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE, 0);
1198                         vdec->source_change++;
1199                         vdec_handle_resolution_change(inst);
1200                         vdec->is_source_changed = false;
1201                 }
1202         }
1203         if (vdec->seq_tag != vdec->codec_info.tag) {
1204                 vdec_response_fs_request(inst, true);
1205                 vpu_trace(inst->dev, "[%d] seq tag change: %d -> %d\n",
1206                           inst->id, vdec->seq_tag, vdec->codec_info.tag);
1207         }
1208         vdec->seq_hdr_found++;
1209         vdec->fixed_fmt = true;
1210         vpu_inst_unlock(inst);
1211 }
1212
1213 static void vdec_event_resolution_change(struct vpu_inst *inst)
1214 {
1215         struct vdec_t *vdec = inst->priv;
1216
1217         vpu_trace(inst->dev, "[%d]\n", inst->id);
1218         vpu_inst_lock(inst);
1219         vdec->seq_tag = vdec->codec_info.tag;
1220         vdec_clear_fs(&vdec->mbi);
1221         vdec_clear_fs(&vdec->dcp);
1222         vdec_clear_slots(inst);
1223         vdec_init_mbi(inst);
1224         vdec_init_dcp(inst);
1225         if (vdec->is_source_changed) {
1226                 vdec_update_state(inst, VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE, 0);
1227                 vdec->source_change++;
1228                 vdec_handle_resolution_change(inst);
1229                 vdec->is_source_changed = false;
1230         }
1231         vpu_inst_unlock(inst);
1232 }
1233
1234 static void vdec_event_req_fs(struct vpu_inst *inst, struct vpu_fs_info *fs)
1235 {
1236         struct vdec_t *vdec = inst->priv;
1237
1238         if (!fs)
1239                 return;
1240
1241         vpu_inst_lock(inst);
1242
1243         switch (fs->type) {
1244         case MEM_RES_FRAME:
1245                 vdec->req_frame_count++;
1246                 break;
1247         case MEM_RES_MBI:
1248                 vdec_request_one_fs(&vdec->mbi);
1249                 break;
1250         case MEM_RES_DCP:
1251                 vdec_request_one_fs(&vdec->dcp);
1252                 break;
1253         default:
1254                 break;
1255         }
1256
1257         vdec_alloc_fs(inst, &vdec->mbi);
1258         vdec_alloc_fs(inst, &vdec->dcp);
1259
1260         vdec_response_fs_request(inst, false);
1261
1262         vpu_inst_unlock(inst);
1263 }
1264
1265 static void vdec_evnet_rel_fs(struct vpu_inst *inst, struct vpu_fs_info *fs)
1266 {
1267         struct vdec_t *vdec = inst->priv;
1268         struct vpu_vb2_buffer *vpu_buf;
1269         struct vb2_v4l2_buffer *vbuf;
1270
1271         if (!fs || fs->id >= ARRAY_SIZE(vdec->slots))
1272                 return;
1273         if (fs->type != MEM_RES_FRAME)
1274                 return;
1275
1276         if (fs->id >= vpu_get_num_buffers(inst, inst->cap_format.type)) {
1277                 dev_err(inst->dev, "[%d] invalid fs(%d) to release\n", inst->id, fs->id);
1278                 return;
1279         }
1280
1281         vpu_inst_lock(inst);
1282         vpu_buf = vdec->slots[fs->id];
1283         vdec->slots[fs->id] = NULL;
1284
1285         if (!vpu_buf) {
1286                 dev_dbg(inst->dev, "[%d] fs[%d] has bee released\n", inst->id, fs->id);
1287                 goto exit;
1288         }
1289
1290         vbuf = &vpu_buf->m2m_buf.vb;
1291         if (vpu_get_buffer_state(vbuf) == VPU_BUF_STATE_DECODED) {
1292                 dev_dbg(inst->dev, "[%d] frame skip\n", inst->id);
1293                 vdec->sequence++;
1294         }
1295
1296         vdec_response_fs_release(inst, fs->id, vpu_buf->tag);
1297         if (vpu_get_buffer_state(vbuf) != VPU_BUF_STATE_READY)
1298                 vdec_recycle_buffer(inst, vbuf);
1299
1300         vpu_set_buffer_state(vbuf, VPU_BUF_STATE_IDLE);
1301         vpu_process_capture_buffer(inst);
1302
1303 exit:
1304         vpu_inst_unlock(inst);
1305 }
1306
1307 static void vdec_event_eos(struct vpu_inst *inst)
1308 {
1309         struct vdec_t *vdec = inst->priv;
1310
1311         vpu_trace(inst->dev, "[%d] input : %d, decoded : %d, display : %d, sequence : %d\n",
1312                   inst->id,
1313                   vdec->params.frame_count,
1314                   vdec->decoded_frame_count,
1315                   vdec->display_frame_count,
1316                   vdec->sequence);
1317         vpu_inst_lock(inst);
1318         vdec->eos_received++;
1319         vdec->fixed_fmt = false;
1320         inst->min_buffer_cap = VDEC_MIN_BUFFER_CAP;
1321         vdec_set_last_buffer_dequeued(inst);
1322         vpu_inst_unlock(inst);
1323 }
1324
1325 static void vdec_event_notify(struct vpu_inst *inst, u32 event, void *data)
1326 {
1327         switch (event) {
1328         case VPU_MSG_ID_SEQ_HDR_FOUND:
1329                 vdec_event_seq_hdr(inst, data);
1330                 break;
1331         case VPU_MSG_ID_RES_CHANGE:
1332                 vdec_event_resolution_change(inst);
1333                 break;
1334         case VPU_MSG_ID_FRAME_REQ:
1335                 vdec_event_req_fs(inst, data);
1336                 break;
1337         case VPU_MSG_ID_FRAME_RELEASE:
1338                 vdec_evnet_rel_fs(inst, data);
1339                 break;
1340         case VPU_MSG_ID_PIC_EOS:
1341                 vdec_event_eos(inst);
1342                 break;
1343         default:
1344                 break;
1345         }
1346 }
1347
1348 static int vdec_process_output(struct vpu_inst *inst, struct vb2_buffer *vb)
1349 {
1350         struct vdec_t *vdec = inst->priv;
1351         struct vb2_v4l2_buffer *vbuf;
1352         struct vpu_rpc_buffer_desc desc;
1353         u32 free_space;
1354         int ret;
1355
1356         vbuf = to_vb2_v4l2_buffer(vb);
1357         dev_dbg(inst->dev, "[%d] dec output [%d] %d : %ld\n",
1358                 inst->id, vbuf->sequence, vb->index, vb2_get_plane_payload(vb, 0));
1359
1360         if (inst->state == VPU_CODEC_STATE_DEINIT)
1361                 return -EINVAL;
1362         if (vdec->reset_codec)
1363                 return -EINVAL;
1364
1365         if (inst->state == VPU_CODEC_STATE_STARTED)
1366                 vdec_update_state(inst, VPU_CODEC_STATE_ACTIVE, 0);
1367
1368         ret = vpu_iface_get_stream_buffer_desc(inst, &desc);
1369         if (ret)
1370                 return ret;
1371
1372         free_space = vpu_helper_get_free_space(inst);
1373         if (free_space < vb2_get_plane_payload(vb, 0) + 0x40000)
1374                 return -ENOMEM;
1375
1376         vpu_set_buffer_state(vbuf, VPU_BUF_STATE_INUSE);
1377         ret = vpu_iface_input_frame(inst, vb);
1378         if (ret < 0)
1379                 return -ENOMEM;
1380
1381         dev_dbg(inst->dev, "[%d][INPUT  TS]%32lld\n", inst->id, vb->timestamp);
1382         vdec->params.frame_count++;
1383
1384         if (vdec->drain)
1385                 vdec_drain(inst);
1386
1387         return 0;
1388 }
1389
1390 static int vdec_process_capture(struct vpu_inst *inst, struct vb2_buffer *vb)
1391 {
1392         struct vdec_t *vdec = inst->priv;
1393         struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
1394         int ret;
1395
1396         if (inst->state == VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE)
1397                 return -EINVAL;
1398         if (vdec->reset_codec)
1399                 return -EINVAL;
1400
1401         ret = vdec_response_frame(inst, vbuf);
1402         if (ret)
1403                 return ret;
1404         v4l2_m2m_dst_buf_remove_by_buf(inst->fh.m2m_ctx, vbuf);
1405         return 0;
1406 }
1407
1408 static void vdec_on_queue_empty(struct vpu_inst *inst, u32 type)
1409 {
1410         struct vdec_t *vdec = inst->priv;
1411
1412         if (V4L2_TYPE_IS_OUTPUT(type))
1413                 return;
1414
1415         vdec_handle_resolution_change(inst);
1416         if (vdec->eos_received)
1417                 vdec_set_last_buffer_dequeued(inst);
1418 }
1419
1420 static void vdec_abort(struct vpu_inst *inst)
1421 {
1422         struct vdec_t *vdec = inst->priv;
1423         struct vpu_rpc_buffer_desc desc;
1424         int ret;
1425
1426         vpu_trace(inst->dev, "[%d] state = %s\n", inst->id, vpu_codec_state_name(inst->state));
1427
1428         vdec->aborting = true;
1429         vpu_iface_add_scode(inst, SCODE_PADDING_ABORT);
1430         vdec->params.end_flag = 1;
1431         vpu_iface_set_decode_params(inst, &vdec->params, 1);
1432
1433         vpu_session_abort(inst);
1434
1435         ret = vpu_iface_get_stream_buffer_desc(inst, &desc);
1436         if (!ret)
1437                 vpu_iface_update_stream_buffer(inst, desc.rptr, 1);
1438
1439         vpu_session_rst_buf(inst);
1440         vpu_trace(inst->dev, "[%d] input : %d, decoded : %d, display : %d, sequence : %d\n",
1441                   inst->id,
1442                   vdec->params.frame_count,
1443                   vdec->decoded_frame_count,
1444                   vdec->display_frame_count,
1445                   vdec->sequence);
1446         if (!vdec->seq_hdr_found)
1447                 vdec->reset_codec = true;
1448         vdec->params.end_flag = 0;
1449         vdec->drain = 0;
1450         vdec->params.frame_count = 0;
1451         vdec->decoded_frame_count = 0;
1452         vdec->display_frame_count = 0;
1453         vdec->sequence = 0;
1454         vdec->aborting = false;
1455         inst->extra_size = 0;
1456 }
1457
1458 static void vdec_stop(struct vpu_inst *inst, bool free)
1459 {
1460         struct vdec_t *vdec = inst->priv;
1461
1462         vdec_clear_slots(inst);
1463         if (inst->state != VPU_CODEC_STATE_DEINIT)
1464                 vpu_session_stop(inst);
1465         vdec_clear_fs(&vdec->mbi);
1466         vdec_clear_fs(&vdec->dcp);
1467         if (free) {
1468                 vpu_free_dma(&vdec->udata);
1469                 vpu_free_dma(&inst->stream_buffer);
1470         }
1471         vdec_update_state(inst, VPU_CODEC_STATE_DEINIT, 1);
1472         vdec->reset_codec = false;
1473 }
1474
1475 static void vdec_release(struct vpu_inst *inst)
1476 {
1477         if (inst->id != VPU_INST_NULL_ID)
1478                 vpu_trace(inst->dev, "[%d]\n", inst->id);
1479         vdec_stop(inst, true);
1480 }
1481
1482 static void vdec_cleanup(struct vpu_inst *inst)
1483 {
1484         struct vdec_t *vdec;
1485
1486         if (!inst)
1487                 return;
1488
1489         vdec = inst->priv;
1490         vfree(vdec);
1491         inst->priv = NULL;
1492         vfree(inst);
1493 }
1494
1495 static void vdec_init_params(struct vdec_t *vdec)
1496 {
1497         vdec->params.frame_count = 0;
1498         vdec->params.end_flag = 0;
1499 }
1500
1501 static int vdec_start(struct vpu_inst *inst)
1502 {
1503         struct vdec_t *vdec = inst->priv;
1504         int stream_buffer_size;
1505         int ret;
1506
1507         if (inst->state != VPU_CODEC_STATE_DEINIT)
1508                 return 0;
1509
1510         vpu_trace(inst->dev, "[%d]\n", inst->id);
1511         if (!vdec->udata.virt) {
1512                 vdec->udata.length = 0x1000;
1513                 ret = vpu_alloc_dma(inst->core, &vdec->udata);
1514                 if (ret) {
1515                         dev_err(inst->dev, "[%d] alloc udata fail\n", inst->id);
1516                         goto error;
1517                 }
1518         }
1519
1520         if (!inst->stream_buffer.virt) {
1521                 stream_buffer_size = vpu_iface_get_stream_buffer_size(inst->core);
1522                 if (stream_buffer_size > 0) {
1523                         inst->stream_buffer.length = stream_buffer_size;
1524                         ret = vpu_alloc_dma(inst->core, &inst->stream_buffer);
1525                         if (ret) {
1526                                 dev_err(inst->dev, "[%d] alloc stream buffer fail\n", inst->id);
1527                                 goto error;
1528                         }
1529                         inst->use_stream_buffer = true;
1530                 }
1531         }
1532
1533         if (inst->use_stream_buffer)
1534                 vpu_iface_config_stream_buffer(inst, &inst->stream_buffer);
1535         vpu_iface_init_instance(inst);
1536         vdec->params.udata.base = vdec->udata.phys;
1537         vdec->params.udata.size = vdec->udata.length;
1538         ret = vpu_iface_set_decode_params(inst, &vdec->params, 0);
1539         if (ret) {
1540                 dev_err(inst->dev, "[%d] set decode params fail\n", inst->id);
1541                 goto error;
1542         }
1543
1544         vdec_init_params(vdec);
1545         ret = vpu_session_start(inst);
1546         if (ret) {
1547                 dev_err(inst->dev, "[%d] start fail\n", inst->id);
1548                 goto error;
1549         }
1550
1551         vdec_update_state(inst, VPU_CODEC_STATE_STARTED, 0);
1552
1553         return 0;
1554 error:
1555         vpu_free_dma(&vdec->udata);
1556         vpu_free_dma(&inst->stream_buffer);
1557         return ret;
1558 }
1559
1560 static int vdec_start_session(struct vpu_inst *inst, u32 type)
1561 {
1562         struct vdec_t *vdec = inst->priv;
1563         int ret = 0;
1564
1565         if (V4L2_TYPE_IS_OUTPUT(type)) {
1566                 if (vdec->reset_codec)
1567                         vdec_stop(inst, false);
1568                 if (inst->state == VPU_CODEC_STATE_DEINIT) {
1569                         ret = vdec_start(inst);
1570                         if (ret)
1571                                 return ret;
1572                 }
1573         }
1574
1575         if (V4L2_TYPE_IS_OUTPUT(type)) {
1576                 vdec_update_state(inst, vdec->state, 1);
1577                 vdec->eos_received = 0;
1578                 vpu_process_output_buffer(inst);
1579         } else {
1580                 vdec_cmd_start(inst);
1581         }
1582         if (inst->state == VPU_CODEC_STATE_ACTIVE)
1583                 vdec_response_fs_request(inst, false);
1584
1585         return ret;
1586 }
1587
1588 static int vdec_stop_session(struct vpu_inst *inst, u32 type)
1589 {
1590         struct vdec_t *vdec = inst->priv;
1591
1592         if (inst->state == VPU_CODEC_STATE_DEINIT)
1593                 return 0;
1594
1595         if (V4L2_TYPE_IS_OUTPUT(type)) {
1596                 vdec_update_state(inst, VPU_CODEC_STATE_SEEK, 0);
1597                 vdec->drain = 0;
1598         } else {
1599                 if (inst->state != VPU_CODEC_STATE_DYAMIC_RESOLUTION_CHANGE) {
1600                         vdec_abort(inst);
1601                         vdec->eos_received = 0;
1602                 }
1603                 vdec_clear_slots(inst);
1604         }
1605
1606         return 0;
1607 }
1608
1609 static int vdec_get_debug_info(struct vpu_inst *inst, char *str, u32 size, u32 i)
1610 {
1611         struct vdec_t *vdec = inst->priv;
1612         int num = -1;
1613
1614         switch (i) {
1615         case 0:
1616                 num = scnprintf(str, size,
1617                                 "req_frame_count = %d\ninterlaced = %d\n",
1618                                 vdec->req_frame_count,
1619                                 vdec->codec_info.progressive ? 0 : 1);
1620                 break;
1621         case 1:
1622                 num = scnprintf(str, size,
1623                                 "mbi: size = 0x%x request = %d, alloc = %d, response = %d\n",
1624                                 vdec->mbi.size,
1625                                 vdec->mbi.req_count,
1626                                 vdec->mbi.count,
1627                                 vdec->mbi.index);
1628                 break;
1629         case 2:
1630                 num = scnprintf(str, size,
1631                                 "dcp: size = 0x%x request = %d, alloc = %d, response = %d\n",
1632                                 vdec->dcp.size,
1633                                 vdec->dcp.req_count,
1634                                 vdec->dcp.count,
1635                                 vdec->dcp.index);
1636                 break;
1637         case 3:
1638                 num = scnprintf(str, size, "input_frame_count = %d\n", vdec->params.frame_count);
1639                 break;
1640         case 4:
1641                 num = scnprintf(str, size, "decoded_frame_count = %d\n", vdec->decoded_frame_count);
1642                 break;
1643         case 5:
1644                 num = scnprintf(str, size, "display_frame_count = %d\n", vdec->display_frame_count);
1645                 break;
1646         case 6:
1647                 num = scnprintf(str, size, "sequence = %d\n", vdec->sequence);
1648                 break;
1649         case 7:
1650                 num = scnprintf(str, size, "drain = %d, eos = %d, source_change = %d\n",
1651                                 vdec->drain, vdec->eos_received, vdec->source_change);
1652                 break;
1653         case 8:
1654                 num = scnprintf(str, size, "fps = %d/%d\n",
1655                                 vdec->codec_info.frame_rate.numerator,
1656                                 vdec->codec_info.frame_rate.denominator);
1657                 break;
1658         case 9:
1659                 num = scnprintf(str, size, "colorspace: %d, %d, %d, %d (%d)\n",
1660                                 vdec->codec_info.color_primaries,
1661                                 vdec->codec_info.transfer_chars,
1662                                 vdec->codec_info.matrix_coeffs,
1663                                 vdec->codec_info.full_range,
1664                                 vdec->codec_info.vui_present);
1665                 break;
1666         default:
1667                 break;
1668         }
1669
1670         return num;
1671 }
1672
1673 static struct vpu_inst_ops vdec_inst_ops = {
1674         .ctrl_init = vdec_ctrl_init,
1675         .check_ready = vdec_check_ready,
1676         .buf_done = vdec_buf_done,
1677         .get_one_frame = vdec_frame_decoded,
1678         .stop_done = vdec_stop_done,
1679         .event_notify = vdec_event_notify,
1680         .release = vdec_release,
1681         .cleanup = vdec_cleanup,
1682         .start = vdec_start_session,
1683         .stop = vdec_stop_session,
1684         .process_output = vdec_process_output,
1685         .process_capture = vdec_process_capture,
1686         .on_queue_empty = vdec_on_queue_empty,
1687         .get_debug_info = vdec_get_debug_info,
1688         .wait_prepare = vpu_inst_unlock,
1689         .wait_finish = vpu_inst_lock,
1690 };
1691
1692 static void vdec_init(struct file *file)
1693 {
1694         struct vpu_inst *inst = to_inst(file);
1695         struct v4l2_format f;
1696
1697         memset(&f, 0, sizeof(f));
1698         f.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
1699         f.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_H264;
1700         f.fmt.pix_mp.width = 1280;
1701         f.fmt.pix_mp.height = 720;
1702         f.fmt.pix_mp.field = V4L2_FIELD_NONE;
1703         vdec_s_fmt(file, &inst->fh, &f);
1704
1705         memset(&f, 0, sizeof(f));
1706         f.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
1707         f.fmt.pix_mp.pixelformat = V4L2_PIX_FMT_NV12M_8L128;
1708         f.fmt.pix_mp.width = 1280;
1709         f.fmt.pix_mp.height = 720;
1710         f.fmt.pix_mp.field = V4L2_FIELD_NONE;
1711         vdec_s_fmt(file, &inst->fh, &f);
1712 }
1713
1714 static int vdec_open(struct file *file)
1715 {
1716         struct vpu_inst *inst;
1717         struct vdec_t *vdec;
1718         int ret;
1719
1720         inst = vzalloc(sizeof(*inst));
1721         if (!inst)
1722                 return -ENOMEM;
1723
1724         vdec = vzalloc(sizeof(*vdec));
1725         if (!vdec) {
1726                 vfree(inst);
1727                 return -ENOMEM;
1728         }
1729
1730         inst->ops = &vdec_inst_ops;
1731         inst->formats = vdec_formats;
1732         inst->type = VPU_CORE_TYPE_DEC;
1733         inst->priv = vdec;
1734
1735         ret = vpu_v4l2_open(file, inst);
1736         if (ret)
1737                 return ret;
1738
1739         vdec->fixed_fmt = false;
1740         vdec->state = VPU_CODEC_STATE_ACTIVE;
1741         inst->min_buffer_cap = VDEC_MIN_BUFFER_CAP;
1742         inst->min_buffer_out = VDEC_MIN_BUFFER_OUT;
1743         vdec_init(file);
1744
1745         return 0;
1746 }
1747
1748 static const struct v4l2_file_operations vdec_fops = {
1749         .owner = THIS_MODULE,
1750         .open = vdec_open,
1751         .release = vpu_v4l2_close,
1752         .unlocked_ioctl = video_ioctl2,
1753         .poll = v4l2_m2m_fop_poll,
1754         .mmap = v4l2_m2m_fop_mmap,
1755 };
1756
1757 const struct v4l2_ioctl_ops *vdec_get_ioctl_ops(void)
1758 {
1759         return &vdec_ioctl_ops;
1760 }
1761
1762 const struct v4l2_file_operations *vdec_get_fops(void)
1763 {
1764         return &vdec_fops;
1765 }