Lines Matching +full:device +full:- +full:width

1 // SPDX-License-Identifier: GPL-2.0
12 #include <media/v4l2-event.h>
13 #include <media/v4l2-ioctl.h>
14 #include <media/videobuf2-dma-contig.h>
17 #include "hva-hw.h"
86 * of a stream is estimated to ((width x height x 3 / 2) / 2) in estimated_stream_size()
93 struct hva_frameinfo *frameinfo = &ctx->frameinfo; in set_default_params()
94 struct hva_streaminfo *streaminfo = &ctx->streaminfo; in set_default_params()
96 frameinfo->pixelformat = V4L2_PIX_FMT_NV12; in set_default_params()
97 frameinfo->width = HVA_DEFAULT_WIDTH; in set_default_params()
98 frameinfo->height = HVA_DEFAULT_HEIGHT; in set_default_params()
99 frameinfo->aligned_width = ALIGN(frameinfo->width, in set_default_params()
101 frameinfo->aligned_height = ALIGN(frameinfo->height, in set_default_params()
103 frameinfo->size = frame_size(frameinfo->aligned_width, in set_default_params()
104 frameinfo->aligned_height, in set_default_params()
105 frameinfo->pixelformat); in set_default_params()
107 streaminfo->streamformat = V4L2_PIX_FMT_H264; in set_default_params()
108 streaminfo->width = HVA_DEFAULT_WIDTH; in set_default_params()
109 streaminfo->height = HVA_DEFAULT_HEIGHT; in set_default_params()
111 ctx->colorspace = V4L2_COLORSPACE_REC709; in set_default_params()
112 ctx->xfer_func = V4L2_XFER_FUNC_DEFAULT; in set_default_params()
113 ctx->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; in set_default_params()
114 ctx->quantization = V4L2_QUANTIZATION_DEFAULT; in set_default_params()
116 ctx->max_stream_size = estimated_stream_size(streaminfo->width, in set_default_params()
117 streaminfo->height); in set_default_params()
128 for (i = 0; i < hva->nb_of_encoders; i++) { in hva_find_encoder()
129 enc = hva->encoders[i]; in hva_find_encoder()
130 if ((enc->pixelformat == pixelformat) && in hva_find_encoder()
131 (enc->streamformat == streamformat)) in hva_find_encoder()
158 for (i = 0; i < hva->nb_of_encoders; i++) { in register_formats()
159 register_format(hva->encoders[i]->pixelformat, in register_formats()
160 hva->pixelformats, in register_formats()
161 &hva->nb_of_pixelformats); in register_formats()
163 register_format(hva->encoders[i]->streamformat, in register_formats()
164 hva->streamformats, in register_formats()
165 &hva->nb_of_streamformats); in register_formats()
171 struct device *dev = hva_to_dev(hva); in register_encoders()
175 if (hva->nb_of_encoders >= HVA_MAX_ENCODERS) { in register_encoders()
178 HVA_PREFIX, hva_encoders[i]->name, in register_encoders()
183 hva->encoders[hva->nb_of_encoders++] = hva_encoders[i]; in register_encoders()
185 hva_encoders[i]->name); in register_encoders()
193 struct device *dev = ctx_to_dev(ctx); in hva_open_encoder()
202 ctx->name, (char *)&pixelformat, (char *)&streamformat); in hva_open_encoder()
203 return -EINVAL; in hva_open_encoder()
207 ctx->name, (char *)&pixelformat, (char *)&streamformat); in hva_open_encoder()
210 snprintf(ctx->name, sizeof(ctx->name), "[%3d:%4.4s]", in hva_open_encoder()
211 hva->instance_id, (char *)&streamformat); in hva_open_encoder()
214 ret = enc->open(ctx); in hva_open_encoder()
217 ctx->name, ret); in hva_open_encoder()
221 dev_dbg(dev, "%s %s encoder opened\n", ctx->name, enc->name); in hva_open_encoder()
230 struct device *dev = ctx_to_dev(ctx); in hva_dbg_summary()
231 struct hva_streaminfo *stream = &ctx->streaminfo; in hva_dbg_summary()
232 struct hva_frameinfo *frame = &ctx->frameinfo; in hva_dbg_summary()
234 if (!(ctx->flags & HVA_FLAG_STREAMINFO)) in hva_dbg_summary()
238 ctx->name, in hva_dbg_summary()
239 (char *)&frame->pixelformat, in hva_dbg_summary()
240 frame->aligned_width, frame->aligned_height, in hva_dbg_summary()
241 (char *)&stream->streamformat, in hva_dbg_summary()
242 stream->width, stream->height, in hva_dbg_summary()
243 stream->profile, stream->level, in hva_dbg_summary()
244 ctx->encoded_frames, in hva_dbg_summary()
245 ctx->sys_errors, in hva_dbg_summary()
246 ctx->encode_errors, in hva_dbg_summary()
247 ctx->frame_errors); in hva_dbg_summary()
257 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_querycap()
260 strscpy(cap->driver, HVA_NAME, sizeof(cap->driver)); in hva_querycap()
261 strscpy(cap->card, hva->vdev->name, sizeof(cap->card)); in hva_querycap()
262 snprintf(cap->bus_info, sizeof(cap->bus_info), "platform:%s", in hva_querycap()
263 hva->pdev->name); in hva_querycap()
271 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_enum_fmt_stream()
274 if (unlikely(f->index >= hva->nb_of_streamformats)) in hva_enum_fmt_stream()
275 return -EINVAL; in hva_enum_fmt_stream()
277 f->pixelformat = hva->streamformats[f->index]; in hva_enum_fmt_stream()
285 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_enum_fmt_frame()
288 if (unlikely(f->index >= hva->nb_of_pixelformats)) in hva_enum_fmt_frame()
289 return -EINVAL; in hva_enum_fmt_frame()
291 f->pixelformat = hva->pixelformats[f->index]; in hva_enum_fmt_frame()
298 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_g_fmt_stream()
299 struct hva_streaminfo *streaminfo = &ctx->streaminfo; in hva_g_fmt_stream()
301 f->fmt.pix.width = streaminfo->width; in hva_g_fmt_stream()
302 f->fmt.pix.height = streaminfo->height; in hva_g_fmt_stream()
303 f->fmt.pix.field = V4L2_FIELD_NONE; in hva_g_fmt_stream()
304 f->fmt.pix.colorspace = ctx->colorspace; in hva_g_fmt_stream()
305 f->fmt.pix.xfer_func = ctx->xfer_func; in hva_g_fmt_stream()
306 f->fmt.pix.ycbcr_enc = ctx->ycbcr_enc; in hva_g_fmt_stream()
307 f->fmt.pix.quantization = ctx->quantization; in hva_g_fmt_stream()
308 f->fmt.pix.pixelformat = streaminfo->streamformat; in hva_g_fmt_stream()
309 f->fmt.pix.bytesperline = 0; in hva_g_fmt_stream()
310 f->fmt.pix.sizeimage = ctx->max_stream_size; in hva_g_fmt_stream()
317 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_g_fmt_frame()
318 struct hva_frameinfo *frameinfo = &ctx->frameinfo; in hva_g_fmt_frame()
320 f->fmt.pix.width = frameinfo->width; in hva_g_fmt_frame()
321 f->fmt.pix.height = frameinfo->height; in hva_g_fmt_frame()
322 f->fmt.pix.field = V4L2_FIELD_NONE; in hva_g_fmt_frame()
323 f->fmt.pix.colorspace = ctx->colorspace; in hva_g_fmt_frame()
324 f->fmt.pix.xfer_func = ctx->xfer_func; in hva_g_fmt_frame()
325 f->fmt.pix.ycbcr_enc = ctx->ycbcr_enc; in hva_g_fmt_frame()
326 f->fmt.pix.quantization = ctx->quantization; in hva_g_fmt_frame()
327 f->fmt.pix.pixelformat = frameinfo->pixelformat; in hva_g_fmt_frame()
328 f->fmt.pix.bytesperline = frame_stride(frameinfo->aligned_width, in hva_g_fmt_frame()
329 frameinfo->pixelformat); in hva_g_fmt_frame()
330 f->fmt.pix.sizeimage = frameinfo->size; in hva_g_fmt_frame()
338 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_try_fmt_stream()
339 struct device *dev = ctx_to_dev(ctx); in hva_try_fmt_stream()
340 struct v4l2_pix_format *pix = &f->fmt.pix; in hva_try_fmt_stream()
341 u32 streamformat = pix->pixelformat; in hva_try_fmt_stream()
343 u32 width, height; in hva_try_fmt_stream() local
346 enc = hva_find_encoder(ctx, ctx->frameinfo.pixelformat, streamformat); in hva_try_fmt_stream()
350 ctx->name, (char *)&pix->pixelformat); in hva_try_fmt_stream()
351 return -EINVAL; in hva_try_fmt_stream()
354 width = pix->width; in hva_try_fmt_stream()
355 height = pix->height; in hva_try_fmt_stream()
356 if (ctx->flags & HVA_FLAG_FRAMEINFO) { in hva_try_fmt_stream()
361 pix->width = ctx->frameinfo.width; in hva_try_fmt_stream()
362 pix->height = ctx->frameinfo.height; in hva_try_fmt_stream()
363 if ((pix->width != width) || (pix->height != height)) in hva_try_fmt_stream()
365 "%s V4L2 TRY_FMT (CAPTURE): resolution updated %dx%d -> %dx%d to fit frame resolution\n", in hva_try_fmt_stream()
366 ctx->name, width, height, in hva_try_fmt_stream()
367 pix->width, pix->height); in hva_try_fmt_stream()
369 /* adjust width & height */ in hva_try_fmt_stream()
370 v4l_bound_align_image(&pix->width, in hva_try_fmt_stream()
371 HVA_MIN_WIDTH, enc->max_width, in hva_try_fmt_stream()
373 &pix->height, in hva_try_fmt_stream()
374 HVA_MIN_HEIGHT, enc->max_height, in hva_try_fmt_stream()
378 if ((pix->width != width) || (pix->height != height)) in hva_try_fmt_stream()
380 "%s V4L2 TRY_FMT (CAPTURE): resolution updated %dx%d -> %dx%d to fit min/max/alignment\n", in hva_try_fmt_stream()
381 ctx->name, width, height, in hva_try_fmt_stream()
382 pix->width, pix->height); in hva_try_fmt_stream()
385 stream_size = estimated_stream_size(pix->width, pix->height); in hva_try_fmt_stream()
386 if (pix->sizeimage < stream_size) in hva_try_fmt_stream()
387 pix->sizeimage = stream_size; in hva_try_fmt_stream()
389 pix->bytesperline = 0; in hva_try_fmt_stream()
390 pix->colorspace = ctx->colorspace; in hva_try_fmt_stream()
391 pix->xfer_func = ctx->xfer_func; in hva_try_fmt_stream()
392 pix->ycbcr_enc = ctx->ycbcr_enc; in hva_try_fmt_stream()
393 pix->quantization = ctx->quantization; in hva_try_fmt_stream()
394 pix->field = V4L2_FIELD_NONE; in hva_try_fmt_stream()
402 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_try_fmt_frame()
403 struct device *dev = ctx_to_dev(ctx); in hva_try_fmt_frame()
404 struct v4l2_pix_format *pix = &f->fmt.pix; in hva_try_fmt_frame()
405 u32 pixelformat = pix->pixelformat; in hva_try_fmt_frame()
407 u32 width, height; in hva_try_fmt_frame() local
409 enc = hva_find_encoder(ctx, pixelformat, ctx->streaminfo.streamformat); in hva_try_fmt_frame()
413 ctx->name, (char *)&pixelformat); in hva_try_fmt_frame()
414 return -EINVAL; in hva_try_fmt_frame()
417 /* adjust width & height */ in hva_try_fmt_frame()
418 width = pix->width; in hva_try_fmt_frame()
419 height = pix->height; in hva_try_fmt_frame()
420 v4l_bound_align_image(&pix->width, in hva_try_fmt_frame()
422 frame_alignment(pixelformat) - 1, in hva_try_fmt_frame()
423 &pix->height, in hva_try_fmt_frame()
425 frame_alignment(pixelformat) - 1, in hva_try_fmt_frame()
428 if ((pix->width != width) || (pix->height != height)) in hva_try_fmt_frame()
430 "%s V4L2 TRY_FMT (OUTPUT): resolution updated %dx%d -> %dx%d to fit min/max/alignment\n", in hva_try_fmt_frame()
431 ctx->name, width, height, pix->width, pix->height); in hva_try_fmt_frame()
433 width = ALIGN(pix->width, HVA_WIDTH_ALIGNMENT); in hva_try_fmt_frame()
434 height = ALIGN(pix->height, HVA_HEIGHT_ALIGNMENT); in hva_try_fmt_frame()
436 if (!pix->colorspace) { in hva_try_fmt_frame()
437 pix->colorspace = V4L2_COLORSPACE_REC709; in hva_try_fmt_frame()
438 pix->xfer_func = V4L2_XFER_FUNC_DEFAULT; in hva_try_fmt_frame()
439 pix->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT; in hva_try_fmt_frame()
440 pix->quantization = V4L2_QUANTIZATION_DEFAULT; in hva_try_fmt_frame()
443 pix->bytesperline = frame_stride(width, pixelformat); in hva_try_fmt_frame()
444 pix->sizeimage = frame_size(width, height, pixelformat); in hva_try_fmt_frame()
445 pix->field = V4L2_FIELD_NONE; in hva_try_fmt_frame()
452 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_s_fmt_stream()
453 struct device *dev = ctx_to_dev(ctx); in hva_s_fmt_stream()
460 ctx->name, (char *)&f->fmt.pix.pixelformat); in hva_s_fmt_stream()
464 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); in hva_s_fmt_stream()
467 ctx->name); in hva_s_fmt_stream()
468 return -EBUSY; in hva_s_fmt_stream()
471 ctx->max_stream_size = f->fmt.pix.sizeimage; in hva_s_fmt_stream()
472 ctx->streaminfo.width = f->fmt.pix.width; in hva_s_fmt_stream()
473 ctx->streaminfo.height = f->fmt.pix.height; in hva_s_fmt_stream()
474 ctx->streaminfo.streamformat = f->fmt.pix.pixelformat; in hva_s_fmt_stream()
475 ctx->flags |= HVA_FLAG_STREAMINFO; in hva_s_fmt_stream()
482 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_s_fmt_frame()
483 struct device *dev = ctx_to_dev(ctx); in hva_s_fmt_frame()
484 struct v4l2_pix_format *pix = &f->fmt.pix; in hva_s_fmt_frame()
491 ctx->name, (char *)&pix->pixelformat); in hva_s_fmt_frame()
495 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type); in hva_s_fmt_frame()
497 dev_dbg(dev, "%s V4L2 S_FMT (OUTPUT): queue busy\n", ctx->name); in hva_s_fmt_frame()
498 return -EBUSY; in hva_s_fmt_frame()
501 ctx->colorspace = pix->colorspace; in hva_s_fmt_frame()
502 ctx->xfer_func = pix->xfer_func; in hva_s_fmt_frame()
503 ctx->ycbcr_enc = pix->ycbcr_enc; in hva_s_fmt_frame()
504 ctx->quantization = pix->quantization; in hva_s_fmt_frame()
506 ctx->frameinfo.aligned_width = ALIGN(pix->width, HVA_WIDTH_ALIGNMENT); in hva_s_fmt_frame()
507 ctx->frameinfo.aligned_height = ALIGN(pix->height, in hva_s_fmt_frame()
509 ctx->frameinfo.size = pix->sizeimage; in hva_s_fmt_frame()
510 ctx->frameinfo.pixelformat = pix->pixelformat; in hva_s_fmt_frame()
511 ctx->frameinfo.width = pix->width; in hva_s_fmt_frame()
512 ctx->frameinfo.height = pix->height; in hva_s_fmt_frame()
513 ctx->flags |= HVA_FLAG_FRAMEINFO; in hva_s_fmt_frame()
520 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_g_parm()
521 struct v4l2_fract *time_per_frame = &ctx->ctrls.time_per_frame; in hva_g_parm()
523 if (sp->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) in hva_g_parm()
524 return -EINVAL; in hva_g_parm()
526 sp->parm.output.capability = V4L2_CAP_TIMEPERFRAME; in hva_g_parm()
527 sp->parm.output.timeperframe.numerator = time_per_frame->numerator; in hva_g_parm()
528 sp->parm.output.timeperframe.denominator = in hva_g_parm()
529 time_per_frame->denominator; in hva_g_parm()
536 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_s_parm()
537 struct v4l2_fract *time_per_frame = &ctx->ctrls.time_per_frame; in hva_s_parm()
539 if (sp->type != V4L2_BUF_TYPE_VIDEO_OUTPUT) in hva_s_parm()
540 return -EINVAL; in hva_s_parm()
542 if (!sp->parm.output.timeperframe.numerator || in hva_s_parm()
543 !sp->parm.output.timeperframe.denominator) in hva_s_parm()
546 sp->parm.output.capability = V4L2_CAP_TIMEPERFRAME; in hva_s_parm()
547 time_per_frame->numerator = sp->parm.output.timeperframe.numerator; in hva_s_parm()
548 time_per_frame->denominator = in hva_s_parm()
549 sp->parm.output.timeperframe.denominator; in hva_s_parm()
556 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_qbuf()
557 struct device *dev = ctx_to_dev(ctx); in hva_qbuf()
559 if (buf->type == V4L2_BUF_TYPE_VIDEO_CAPTURE) { in hva_qbuf()
571 vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, buf->type); in hva_qbuf()
572 vb2_buf = vb2_get_buffer(vq, buf->index); in hva_qbuf()
574 dev_dbg(dev, "%s buffer index %d not found\n", ctx->name, buf->index); in hva_qbuf()
575 return -EINVAL; in hva_qbuf()
578 stream->bytesused = buf->bytesused; in hva_qbuf()
581 return v4l2_m2m_qbuf(file, ctx->fh.m2m_ctx, buf); in hva_qbuf()
615 struct hva_ctx *ctx = container_of(ctrl->handler, struct hva_ctx, in hva_s_ctrl()
617 struct device *dev = ctx_to_dev(ctx); in hva_s_ctrl()
619 dev_dbg(dev, "%s S_CTRL: id = %d, val = %d\n", ctx->name, in hva_s_ctrl()
620 ctrl->id, ctrl->val); in hva_s_ctrl()
622 switch (ctrl->id) { in hva_s_ctrl()
624 ctx->ctrls.bitrate_mode = ctrl->val; in hva_s_ctrl()
627 ctx->ctrls.gop_size = ctrl->val; in hva_s_ctrl()
630 ctx->ctrls.bitrate = ctrl->val; in hva_s_ctrl()
633 ctx->ctrls.aspect = ctrl->val; in hva_s_ctrl()
636 ctx->ctrls.profile = ctrl->val; in hva_s_ctrl()
637 snprintf(ctx->streaminfo.profile, in hva_s_ctrl()
638 sizeof(ctx->streaminfo.profile), in hva_s_ctrl()
640 v4l2_ctrl_get_menu(ctrl->id)[ctrl->val]); in hva_s_ctrl()
643 ctx->ctrls.level = ctrl->val; in hva_s_ctrl()
644 snprintf(ctx->streaminfo.level, in hva_s_ctrl()
645 sizeof(ctx->streaminfo.level), in hva_s_ctrl()
647 v4l2_ctrl_get_menu(ctrl->id)[ctrl->val]); in hva_s_ctrl()
650 ctx->ctrls.entropy_mode = ctrl->val; in hva_s_ctrl()
653 ctx->ctrls.cpb_size = ctrl->val; in hva_s_ctrl()
656 ctx->ctrls.dct8x8 = ctrl->val; in hva_s_ctrl()
659 ctx->ctrls.qpmin = ctrl->val; in hva_s_ctrl()
662 ctx->ctrls.qpmax = ctrl->val; in hva_s_ctrl()
665 ctx->ctrls.vui_sar = ctrl->val; in hva_s_ctrl()
668 ctx->ctrls.vui_sar_idc = ctrl->val; in hva_s_ctrl()
671 ctx->ctrls.sei_fp = ctrl->val; in hva_s_ctrl()
674 ctx->ctrls.sei_fp_type = ctrl->val; in hva_s_ctrl()
678 ctx->name, ctrl->id); in hva_s_ctrl()
679 return -EINVAL; in hva_s_ctrl()
692 struct device *dev = ctx_to_dev(ctx); in hva_ctrls_setup()
697 v4l2_ctrl_handler_init(&ctx->ctrl_handler, 15); in hva_ctrls_setup()
699 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
705 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
709 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
714 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
724 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
730 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
736 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
742 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
746 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
750 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
754 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
758 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
763 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
769 v4l2_ctrl_new_std(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
774 v4l2_ctrl_new_std_menu(&ctx->ctrl_handler, &hva_ctrl_ops, in hva_ctrls_setup()
780 if (ctx->ctrl_handler.error) { in hva_ctrls_setup()
781 int err = ctx->ctrl_handler.error; in hva_ctrls_setup()
784 ctx->name, err); in hva_ctrls_setup()
785 v4l2_ctrl_handler_free(&ctx->ctrl_handler); in hva_ctrls_setup()
789 v4l2_ctrl_handler_setup(&ctx->ctrl_handler); in hva_ctrls_setup()
792 ctx->ctrls.time_per_frame.numerator = HVA_DEFAULT_FRAME_NUM; in hva_ctrls_setup()
793 ctx->ctrls.time_per_frame.denominator = HVA_DEFAULT_FRAME_DEN; in hva_ctrls_setup()
799 * mem-to-mem operations
806 const struct hva_enc *enc = ctx->enc; in hva_run_work()
812 mutex_lock(&ctx->lock); in hva_run_work()
818 src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); in hva_run_work()
819 dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx); in hva_run_work()
823 frame->vbuf.sequence = ctx->frame_num++; in hva_run_work()
825 ret = enc->encode(ctx, frame, stream); in hva_run_work()
827 vb2_set_plane_payload(&dst_buf->vb2_buf, 0, stream->bytesused); in hva_run_work()
833 dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp; in hva_run_work()
834 dst_buf->field = V4L2_FIELD_NONE; in hva_run_work()
835 dst_buf->sequence = ctx->stream_num - 1; in hva_run_work()
837 ctx->encoded_frames++; in hva_run_work()
847 mutex_unlock(&ctx->lock); in hva_run_work()
849 v4l2_m2m_job_finish(ctx->hva_dev->m2m_dev, ctx->fh.m2m_ctx); in hva_run_work()
857 queue_work(hva->work_queue, &ctx->run_work); in hva_device_run()
863 struct device *dev = ctx_to_dev(ctx); in hva_job_abort()
865 dev_dbg(dev, "%s aborting job\n", ctx->name); in hva_job_abort()
867 ctx->aborting = true; in hva_job_abort()
873 struct device *dev = ctx_to_dev(ctx); in hva_job_ready()
875 if (!v4l2_m2m_num_src_bufs_ready(ctx->fh.m2m_ctx)) { in hva_job_ready()
877 ctx->name); in hva_job_ready()
881 if (!v4l2_m2m_num_dst_bufs_ready(ctx->fh.m2m_ctx)) { in hva_job_ready()
883 ctx->name); in hva_job_ready()
887 if (ctx->aborting) { in hva_job_ready()
888 dev_dbg(dev, "%s job not ready: aborting\n", ctx->name); in hva_job_ready()
895 /* mem-to-mem ops */
908 unsigned int sizes[], struct device *alloc_devs[]) in hva_queue_setup()
911 struct device *dev = ctx_to_dev(ctx); in hva_queue_setup()
914 dev_dbg(dev, "%s %s queue setup: num_buffers %d\n", ctx->name, in hva_queue_setup()
915 to_type_str(vq->type), *num_buffers); in hva_queue_setup()
917 size = vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT ? in hva_queue_setup()
918 ctx->frameinfo.size : ctx->max_stream_size; in hva_queue_setup()
921 return sizes[0] < size ? -EINVAL : 0; in hva_queue_setup()
932 struct hva_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); in hva_buf_prepare()
933 struct device *dev = ctx_to_dev(ctx); in hva_buf_prepare()
936 if (vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) { in hva_buf_prepare()
939 if (vbuf->field == V4L2_FIELD_ANY) in hva_buf_prepare()
940 vbuf->field = V4L2_FIELD_NONE; in hva_buf_prepare()
941 if (vbuf->field != V4L2_FIELD_NONE) { in hva_buf_prepare()
944 ctx->name, vb->index, vbuf->field); in hva_buf_prepare()
945 return -EINVAL; in hva_buf_prepare()
948 if (!frame->prepared) { in hva_buf_prepare()
950 frame->vaddr = vb2_plane_vaddr(&vbuf->vb2_buf, 0); in hva_buf_prepare()
951 frame->paddr = vb2_dma_contig_plane_dma_addr( in hva_buf_prepare()
952 &vbuf->vb2_buf, 0); in hva_buf_prepare()
953 frame->info = ctx->frameinfo; in hva_buf_prepare()
954 frame->prepared = true; in hva_buf_prepare()
958 ctx->name, vb->index, in hva_buf_prepare()
959 frame->vaddr, &frame->paddr); in hva_buf_prepare()
964 if (!stream->prepared) { in hva_buf_prepare()
966 stream->vaddr = vb2_plane_vaddr(&vbuf->vb2_buf, 0); in hva_buf_prepare()
967 stream->paddr = vb2_dma_contig_plane_dma_addr( in hva_buf_prepare()
968 &vbuf->vb2_buf, 0); in hva_buf_prepare()
969 stream->size = vb2_plane_size(&vbuf->vb2_buf, 0); in hva_buf_prepare()
970 stream->prepared = true; in hva_buf_prepare()
974 ctx->name, vb->index, in hva_buf_prepare()
975 stream->vaddr, &stream->paddr); in hva_buf_prepare()
984 struct hva_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue); in hva_buf_queue()
987 if (ctx->fh.m2m_ctx) in hva_buf_queue()
988 v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf); in hva_buf_queue()
995 struct device *dev = ctx_to_dev(ctx); in hva_start_streaming()
1001 dev_dbg(dev, "%s %s start streaming\n", ctx->name, in hva_start_streaming()
1002 to_type_str(vq->type)); in hva_start_streaming()
1005 if (V4L2_TYPE_IS_OUTPUT(vq->type)) { in hva_start_streaming()
1006 if (!vb2_start_streaming_called(&ctx->fh.m2m_ctx->cap_q_ctx.q)) in hva_start_streaming()
1009 if (!vb2_start_streaming_called(&ctx->fh.m2m_ctx->out_q_ctx.q)) in hva_start_streaming()
1015 if (!hva->instances[i]) { in hva_start_streaming()
1016 hva->instances[i] = ctx; in hva_start_streaming()
1018 ctx->id = i; in hva_start_streaming()
1025 dev_err(dev, "%s maximum instances reached\n", ctx->name); in hva_start_streaming()
1026 ret = -ENOMEM; in hva_start_streaming()
1030 hva->nb_of_instances++; in hva_start_streaming()
1032 if (!ctx->enc) { in hva_start_streaming()
1034 ctx->streaminfo.streamformat, in hva_start_streaming()
1035 ctx->frameinfo.pixelformat, in hva_start_streaming()
1036 &ctx->enc); in hva_start_streaming()
1044 hva->instances[ctx->id] = NULL; in hva_start_streaming()
1045 hva->nb_of_instances--; in hva_start_streaming()
1047 if (vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) { in hva_start_streaming()
1049 while ((vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx))) in hva_start_streaming()
1053 while ((vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx))) in hva_start_streaming()
1057 ctx->sys_errors++; in hva_start_streaming()
1066 struct device *dev = ctx_to_dev(ctx); in hva_stop_streaming()
1067 const struct hva_enc *enc = ctx->enc; in hva_stop_streaming()
1070 dev_dbg(dev, "%s %s stop streaming\n", ctx->name, in hva_stop_streaming()
1071 to_type_str(vq->type)); in hva_stop_streaming()
1073 if (vq->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) { in hva_stop_streaming()
1075 ctx->frame_num = 0; in hva_stop_streaming()
1076 while ((vbuf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx))) in hva_stop_streaming()
1080 ctx->stream_num = 0; in hva_stop_streaming()
1081 while ((vbuf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx))) in hva_stop_streaming()
1085 if ((V4L2_TYPE_IS_OUTPUT(vq->type) && in hva_stop_streaming()
1086 vb2_is_streaming(&ctx->fh.m2m_ctx->cap_q_ctx.q)) || in hva_stop_streaming()
1087 (V4L2_TYPE_IS_CAPTURE(vq->type) && in hva_stop_streaming()
1088 vb2_is_streaming(&ctx->fh.m2m_ctx->out_q_ctx.q))) { in hva_stop_streaming()
1090 ctx->name, to_type_str(vq->type), in hva_stop_streaming()
1091 vb2_is_streaming(&ctx->fh.m2m_ctx->out_q_ctx.q), in hva_stop_streaming()
1092 vb2_is_streaming(&ctx->fh.m2m_ctx->cap_q_ctx.q)); in hva_stop_streaming()
1098 dev_dbg(dev, "%s %s encoder closed\n", ctx->name, enc->name); in hva_stop_streaming()
1099 enc->close(ctx); in hva_stop_streaming()
1100 ctx->enc = NULL; in hva_stop_streaming()
1103 hva->instances[ctx->id] = NULL; in hva_stop_streaming()
1104 hva->nb_of_instances--; in hva_stop_streaming()
1107 ctx->aborting = false; in hva_stop_streaming()
1127 vq->io_modes = VB2_MMAP | VB2_DMABUF; in queue_init()
1128 vq->drv_priv = ctx; in queue_init()
1129 vq->ops = &hva_qops; in queue_init()
1130 vq->mem_ops = &vb2_dma_contig_memops; in queue_init()
1131 vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; in queue_init()
1132 vq->lock = &ctx->hva_dev->lock; in queue_init()
1143 src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT; in hva_queue_init()
1144 src_vq->buf_struct_size = sizeof(struct hva_frame); in hva_queue_init()
1145 src_vq->min_queued_buffers = MIN_FRAMES; in hva_queue_init()
1146 src_vq->dev = ctx->hva_dev->dev; in hva_queue_init()
1152 dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE; in hva_queue_init()
1153 dst_vq->buf_struct_size = sizeof(struct hva_stream); in hva_queue_init()
1154 dst_vq->min_queued_buffers = MIN_STREAMS; in hva_queue_init()
1155 dst_vq->dev = ctx->hva_dev->dev; in hva_queue_init()
1163 struct device *dev = hva_to_dev(hva); in hva_open()
1169 ret = -ENOMEM; in hva_open()
1172 ctx->hva_dev = hva; in hva_open()
1174 INIT_WORK(&ctx->run_work, hva_run_work); in hva_open()
1175 v4l2_fh_init(&ctx->fh, video_devdata(file)); in hva_open()
1176 file->private_data = &ctx->fh; in hva_open()
1177 v4l2_fh_add(&ctx->fh); in hva_open()
1183 ctx->sys_errors++; in hva_open()
1186 ctx->fh.ctrl_handler = &ctx->ctrl_handler; in hva_open()
1188 mutex_init(&ctx->lock); in hva_open()
1190 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(hva->m2m_dev, ctx, in hva_open()
1192 if (IS_ERR(ctx->fh.m2m_ctx)) { in hva_open()
1193 ret = PTR_ERR(ctx->fh.m2m_ctx); in hva_open()
1196 ctx->sys_errors++; in hva_open()
1201 mutex_lock(&hva->lock); in hva_open()
1202 hva->instance_id++; in hva_open()
1203 snprintf(ctx->name, sizeof(ctx->name), "[%3d:----]", in hva_open()
1204 hva->instance_id); in hva_open()
1205 mutex_unlock(&hva->lock); in hva_open()
1214 dev_info(dev, "%s encoder instance created\n", ctx->name); in hva_open()
1219 v4l2_ctrl_handler_free(&ctx->ctrl_handler); in hva_open()
1221 v4l2_fh_del(&ctx->fh); in hva_open()
1222 v4l2_fh_exit(&ctx->fh); in hva_open()
1230 struct hva_ctx *ctx = fh_to_ctx(file->private_data); in hva_release()
1232 struct device *dev = ctx_to_dev(ctx); in hva_release()
1233 const struct hva_enc *enc = ctx->enc; in hva_release()
1236 dev_dbg(dev, "%s %s encoder closed\n", ctx->name, enc->name); in hva_release()
1237 enc->close(ctx); in hva_release()
1238 ctx->enc = NULL; in hva_release()
1241 hva->instances[ctx->id] = NULL; in hva_release()
1242 hva->nb_of_instances--; in hva_release()
1248 v4l2_m2m_ctx_release(ctx->fh.m2m_ctx); in hva_release()
1250 v4l2_ctrl_handler_free(&ctx->ctrl_handler); in hva_release()
1252 v4l2_fh_del(&ctx->fh); in hva_release()
1253 v4l2_fh_exit(&ctx->fh); in hva_release()
1259 dev_info(dev, "%s encoder instance released\n", ctx->name); in hva_release()
1277 * Platform device operations
1284 struct device *dev; in hva_register_device()
1287 return -ENODEV; in hva_register_device()
1290 hva->m2m_dev = v4l2_m2m_init(&hva_m2m_ops); in hva_register_device()
1291 if (IS_ERR(hva->m2m_dev)) { in hva_register_device()
1292 dev_err(dev, "%s failed to initialize v4l2-m2m device\n", in hva_register_device()
1294 ret = PTR_ERR(hva->m2m_dev); in hva_register_device()
1300 dev_err(dev, "%s failed to allocate video device\n", in hva_register_device()
1302 ret = -ENOMEM; in hva_register_device()
1306 vdev->fops = &hva_fops; in hva_register_device()
1307 vdev->ioctl_ops = &hva_ioctl_ops; in hva_register_device()
1308 vdev->release = video_device_release; in hva_register_device()
1309 vdev->lock = &hva->lock; in hva_register_device()
1310 vdev->vfl_dir = VFL_DIR_M2M; in hva_register_device()
1311 vdev->device_caps = V4L2_CAP_STREAMING | V4L2_CAP_VIDEO_M2M; in hva_register_device()
1312 vdev->v4l2_dev = &hva->v4l2_dev; in hva_register_device()
1313 snprintf(vdev->name, sizeof(vdev->name), "%s%lx", HVA_NAME, in hva_register_device()
1314 hva->ip_version); in hva_register_device()
1316 ret = video_register_device(vdev, VFL_TYPE_VIDEO, -1); in hva_register_device()
1318 dev_err(dev, "%s failed to register video device\n", in hva_register_device()
1323 hva->vdev = vdev; in hva_register_device()
1330 v4l2_m2m_release(hva->m2m_dev); in hva_register_device()
1340 if (hva->m2m_dev) in hva_unregister_device()
1341 v4l2_m2m_release(hva->m2m_dev); in hva_unregister_device()
1343 video_unregister_device(hva->vdev); in hva_unregister_device()
1349 struct device *dev = &pdev->dev; in hva_probe()
1354 ret = -ENOMEM; in hva_probe()
1362 hva->dev = dev; in hva_probe()
1363 hva->pdev = pdev; in hva_probe()
1366 mutex_init(&hva->lock); in hva_probe()
1380 ret = v4l2_device_register(dev, &hva->v4l2_dev); in hva_probe()
1382 dev_err(dev, "%s %s failed to register V4L2 device\n", in hva_probe()
1391 hva->work_queue = create_workqueue(HVA_NAME); in hva_probe()
1392 if (!hva->work_queue) { in hva_probe()
1395 ret = -ENOMEM; in hva_probe()
1399 /* register device */ in hva_probe()
1405 HVA_NAME, hva->vdev->num); in hva_probe()
1410 destroy_workqueue(hva->work_queue); in hva_probe()
1415 v4l2_device_unregister(&hva->v4l2_dev); in hva_probe()
1425 struct device *dev = hva_to_dev(hva); in hva_remove()
1429 destroy_workqueue(hva->work_queue); in hva_remove()
1437 v4l2_device_unregister(&hva->v4l2_dev); in hva_remove()
1439 dev_info(dev, "%s %s removed\n", HVA_PREFIX, pdev->name); in hva_remove()
1450 .compatible = "st,st-hva",