Lines Matching refs:inst
91 find_format(struct venus_inst *inst, u32 pixfmt, u32 type) in find_format() argument
106 !venus_helper_check_codec(inst, fmt[i].pixfmt)) in find_format()
113 find_format_by_index(struct venus_inst *inst, unsigned int index, u32 type) in find_format_by_index() argument
134 !venus_helper_check_codec(inst, fmt[i].pixfmt)) in find_format_by_index()
254 struct venus_inst *inst = to_inst(file); in venc_enum_fmt() local
257 fmt = find_format_by_index(inst, f->index, f->type); in venc_enum_fmt()
270 venc_try_fmt_common(struct venus_inst *inst, struct v4l2_format *f) in venc_try_fmt_common() argument
280 fmt = find_format(inst, pixmp->pixelformat, f->type); in venc_try_fmt_common()
288 fmt = find_format(inst, pixmp->pixelformat, f->type); in venc_try_fmt_common()
293 pixmp->width = clamp(pixmp->width, inst->cap_width.min, in venc_try_fmt_common()
294 inst->cap_width.max); in venc_try_fmt_common()
295 pixmp->height = clamp(pixmp->height, inst->cap_height.min, in venc_try_fmt_common()
296 inst->cap_height.max); in venc_try_fmt_common()
328 struct venus_inst *inst = to_inst(file); in venc_try_fmt() local
330 venc_try_fmt_common(inst, f); in venc_try_fmt()
337 struct venus_inst *inst = to_inst(file); in venc_s_fmt() local
346 fmt = venc_try_fmt_common(inst, f); in venc_s_fmt()
352 pixfmt_cap = inst->fmt_cap->pixfmt; in venc_s_fmt()
355 pixfmt_out = inst->fmt_out->pixfmt; in venc_s_fmt()
364 venc_try_fmt_common(inst, &format); in venc_s_fmt()
367 inst->out_width = format.fmt.pix_mp.width; in venc_s_fmt()
368 inst->out_height = format.fmt.pix_mp.height; in venc_s_fmt()
369 inst->colorspace = pixmp->colorspace; in venc_s_fmt()
370 inst->ycbcr_enc = pixmp->ycbcr_enc; in venc_s_fmt()
371 inst->quantization = pixmp->quantization; in venc_s_fmt()
372 inst->xfer_func = pixmp->xfer_func; in venc_s_fmt()
381 venc_try_fmt_common(inst, &format); in venc_s_fmt()
383 inst->width = format.fmt.pix_mp.width; in venc_s_fmt()
384 inst->height = format.fmt.pix_mp.height; in venc_s_fmt()
387 inst->fmt_out = fmt; in venc_s_fmt()
389 inst->fmt_cap = fmt; in venc_s_fmt()
397 struct venus_inst *inst = to_inst(file); in venc_g_fmt() local
401 fmt = inst->fmt_cap; in venc_g_fmt()
403 fmt = inst->fmt_out; in venc_g_fmt()
410 pixmp->width = inst->width; in venc_g_fmt()
411 pixmp->height = inst->height; in venc_g_fmt()
412 pixmp->colorspace = inst->colorspace; in venc_g_fmt()
413 pixmp->ycbcr_enc = inst->ycbcr_enc; in venc_g_fmt()
414 pixmp->quantization = inst->quantization; in venc_g_fmt()
415 pixmp->xfer_func = inst->xfer_func; in venc_g_fmt()
417 pixmp->width = inst->out_width; in venc_g_fmt()
418 pixmp->height = inst->out_height; in venc_g_fmt()
421 venc_try_fmt_common(inst, f); in venc_g_fmt()
429 struct venus_inst *inst = to_inst(file); in venc_g_selection() local
437 s->r.width = inst->width; in venc_g_selection()
438 s->r.height = inst->height; in venc_g_selection()
441 s->r.width = inst->out_width; in venc_g_selection()
442 s->r.height = inst->out_height; in venc_g_selection()
457 struct venus_inst *inst = to_inst(file); in venc_s_selection() local
464 if (s->r.width != inst->out_width || in venc_s_selection()
465 s->r.height != inst->out_height || in venc_s_selection()
478 struct venus_inst *inst = to_inst(file); in venc_s_parm() local
490 timeperframe->denominator = inst->timeperframe.denominator; in venc_s_parm()
492 timeperframe->numerator = inst->timeperframe.numerator; in venc_s_parm()
505 inst->timeperframe = *timeperframe; in venc_s_parm()
506 inst->fps = fps; in venc_s_parm()
513 struct venus_inst *inst = to_inst(file); in venc_g_parm() local
520 a->parm.output.timeperframe = inst->timeperframe; in venc_g_parm()
528 struct venus_inst *inst = to_inst(file); in venc_enum_framesizes() local
533 fmt = find_format(inst, fsize->pixel_format, in venc_enum_framesizes()
536 fmt = find_format(inst, fsize->pixel_format, in venc_enum_framesizes()
545 fsize->stepwise.min_width = inst->cap_width.min; in venc_enum_framesizes()
546 fsize->stepwise.max_width = inst->cap_width.max; in venc_enum_framesizes()
547 fsize->stepwise.step_width = inst->cap_width.step_size; in venc_enum_framesizes()
548 fsize->stepwise.min_height = inst->cap_height.min; in venc_enum_framesizes()
549 fsize->stepwise.max_height = inst->cap_height.max; in venc_enum_framesizes()
550 fsize->stepwise.step_height = inst->cap_height.step_size; in venc_enum_framesizes()
558 struct venus_inst *inst = to_inst(file); in venc_enum_frameintervals() local
563 fmt = find_format(inst, fival->pixel_format, in venc_enum_frameintervals()
566 fmt = find_format(inst, fival->pixel_format, in venc_enum_frameintervals()
578 if (fival->width > inst->cap_width.max || in venc_enum_frameintervals()
579 fival->width < inst->cap_width.min || in venc_enum_frameintervals()
580 fival->height > inst->cap_height.max || in venc_enum_frameintervals()
581 fival->height < inst->cap_height.min) in venc_enum_frameintervals()
585 fival->stepwise.min.denominator = inst->cap_framerate.max; in venc_enum_frameintervals()
587 fival->stepwise.max.denominator = inst->cap_framerate.min; in venc_enum_frameintervals()
589 fival->stepwise.step.denominator = inst->cap_framerate.max; in venc_enum_frameintervals()
623 static int venc_set_properties(struct venus_inst *inst) in venc_set_properties() argument
625 struct venc_controls *ctr = &inst->controls.enc; in venc_set_properties()
636 frate.framerate = inst->fps * (1 << 16); in venc_set_properties()
638 ret = hfi_session_set_property(inst, ptype, &frate); in venc_set_properties()
642 if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H264) { in venc_set_properties()
650 ret = hfi_session_set_property(inst, ptype, &info); in venc_set_properties()
657 ret = hfi_session_set_property(inst, ptype, &idrp); in venc_set_properties()
665 ret = hfi_session_set_property(inst, ptype, &max_num_b_frames); in venc_set_properties()
678 ret = hfi_session_set_property(inst, ptype, &intra_period); in venc_set_properties()
688 ret = hfi_session_set_property(inst, ptype, &rate_control); in venc_set_properties()
701 ret = hfi_session_set_property(inst, ptype, &brate); in venc_set_properties()
714 ret = hfi_session_set_property(inst, ptype, &brate); in venc_set_properties()
718 if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H264) { in venc_set_properties()
723 } else if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_VP8) { in venc_set_properties()
727 } else if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_MPEG4) { in venc_set_properties()
732 } else if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_H263) { in venc_set_properties()
741 ret = hfi_session_set_property(inst, ptype, &pl); in venc_set_properties()
748 static int venc_init_session(struct venus_inst *inst) in venc_init_session() argument
752 ret = hfi_session_init(inst, inst->fmt_cap->pixfmt); in venc_init_session()
756 ret = venus_helper_set_input_resolution(inst, inst->width, in venc_init_session()
757 inst->height); in venc_init_session()
761 ret = venus_helper_set_output_resolution(inst, inst->width, in venc_init_session()
762 inst->height); in venc_init_session()
766 ret = venus_helper_set_color_format(inst, inst->fmt_out->pixfmt); in venc_init_session()
772 hfi_session_deinit(inst); in venc_init_session()
776 static int venc_out_num_buffers(struct venus_inst *inst, unsigned int *num) in venc_out_num_buffers() argument
781 ret = venc_init_session(inst); in venc_out_num_buffers()
785 ret = venus_helper_get_bufreq(inst, HFI_BUFFER_INPUT, &bufreq); in venc_out_num_buffers()
789 hfi_session_deinit(inst); in venc_out_num_buffers()
798 struct venus_inst *inst = vb2_get_drv_priv(q); in venc_queue_setup() local
804 *num_planes != inst->fmt_out->num_planes) in venc_queue_setup()
808 *num_planes != inst->fmt_cap->num_planes) in venc_queue_setup()
812 sizes[0] < inst->input_buf_size) in venc_queue_setup()
816 sizes[0] < inst->output_buf_size) in venc_queue_setup()
824 *num_planes = inst->fmt_out->num_planes; in venc_queue_setup()
826 ret = venc_out_num_buffers(inst, &num); in venc_queue_setup()
832 inst->num_input_bufs = *num_buffers; in venc_queue_setup()
835 sizes[p] = get_framesize_uncompressed(p, inst->width, in venc_queue_setup()
836 inst->height); in venc_queue_setup()
837 inst->input_buf_size = sizes[0]; in venc_queue_setup()
840 *num_planes = inst->fmt_cap->num_planes; in venc_queue_setup()
842 inst->num_output_bufs = *num_buffers; in venc_queue_setup()
843 sizes[0] = get_framesize_compressed(inst->width, inst->height); in venc_queue_setup()
844 inst->output_buf_size = sizes[0]; in venc_queue_setup()
854 static int venc_verify_conf(struct venus_inst *inst) in venc_verify_conf() argument
859 if (!inst->num_input_bufs || !inst->num_output_bufs) in venc_verify_conf()
862 ret = venus_helper_get_bufreq(inst, HFI_BUFFER_OUTPUT, &bufreq); in venc_verify_conf()
866 if (inst->num_output_bufs < bufreq.count_actual || in venc_verify_conf()
867 inst->num_output_bufs < bufreq.count_min) in venc_verify_conf()
870 ret = venus_helper_get_bufreq(inst, HFI_BUFFER_INPUT, &bufreq); in venc_verify_conf()
874 if (inst->num_input_bufs < bufreq.count_actual || in venc_verify_conf()
875 inst->num_input_bufs < bufreq.count_min) in venc_verify_conf()
883 struct venus_inst *inst = vb2_get_drv_priv(q); in venc_start_streaming() local
886 mutex_lock(&inst->lock); in venc_start_streaming()
889 inst->streamon_out = 1; in venc_start_streaming()
891 inst->streamon_cap = 1; in venc_start_streaming()
893 if (!(inst->streamon_out & inst->streamon_cap)) { in venc_start_streaming()
894 mutex_unlock(&inst->lock); in venc_start_streaming()
898 venus_helper_init_instance(inst); in venc_start_streaming()
900 inst->sequence_cap = 0; in venc_start_streaming()
901 inst->sequence_out = 0; in venc_start_streaming()
903 ret = venc_init_session(inst); in venc_start_streaming()
907 ret = venc_set_properties(inst); in venc_start_streaming()
911 ret = venc_verify_conf(inst); in venc_start_streaming()
915 ret = venus_helper_set_num_bufs(inst, inst->num_input_bufs, in venc_start_streaming()
916 inst->num_output_bufs); in venc_start_streaming()
920 ret = venus_helper_vb2_start_streaming(inst); in venc_start_streaming()
924 mutex_unlock(&inst->lock); in venc_start_streaming()
929 hfi_session_deinit(inst); in venc_start_streaming()
931 venus_helper_buffers_done(inst, VB2_BUF_STATE_QUEUED); in venc_start_streaming()
933 inst->streamon_out = 0; in venc_start_streaming()
935 inst->streamon_cap = 0; in venc_start_streaming()
936 mutex_unlock(&inst->lock); in venc_start_streaming()
949 static void venc_buf_done(struct venus_inst *inst, unsigned int buf_type, in venc_buf_done() argument
962 vbuf = venus_helper_find_buf(inst, type, tag); in venc_buf_done()
973 vbuf->sequence = inst->sequence_cap++; in venc_buf_done()
975 vbuf->sequence = inst->sequence_out++; in venc_buf_done()
981 static void venc_event_notify(struct venus_inst *inst, u32 event, in venc_event_notify() argument
984 struct device *dev = inst->core->dev_enc; in venc_event_notify()
987 inst->session_error = true; in venc_event_notify()
988 dev_err(dev, "enc: event session error %x\n", inst->error); in venc_event_notify()
1005 struct venus_inst *inst = priv; in m2m_queue_init() local
1013 src_vq->drv_priv = inst; in m2m_queue_init()
1017 src_vq->dev = inst->core->dev; in m2m_queue_init()
1018 if (inst->core->res->hfi_version == HFI_VERSION_1XX) in m2m_queue_init()
1029 dst_vq->drv_priv = inst; in m2m_queue_init()
1033 dst_vq->dev = inst->core->dev; in m2m_queue_init()
1043 static void venc_inst_init(struct venus_inst *inst) in venc_inst_init() argument
1045 inst->fmt_cap = &venc_formats[2]; in venc_inst_init()
1046 inst->fmt_out = &venc_formats[0]; in venc_inst_init()
1047 inst->width = 1280; in venc_inst_init()
1048 inst->height = ALIGN(720, 32); in venc_inst_init()
1049 inst->out_width = 1280; in venc_inst_init()
1050 inst->out_height = 720; in venc_inst_init()
1051 inst->fps = 15; in venc_inst_init()
1052 inst->timeperframe.numerator = 1; in venc_inst_init()
1053 inst->timeperframe.denominator = 15; in venc_inst_init()
1055 inst->cap_width.min = 96; in venc_inst_init()
1056 inst->cap_width.max = 1920; in venc_inst_init()
1057 if (inst->core->res->hfi_version == HFI_VERSION_3XX) in venc_inst_init()
1058 inst->cap_width.max = 3840; in venc_inst_init()
1059 inst->cap_width.step_size = 2; in venc_inst_init()
1060 inst->cap_height.min = 64; in venc_inst_init()
1061 inst->cap_height.max = ALIGN(1080, 32); in venc_inst_init()
1062 if (inst->core->res->hfi_version == HFI_VERSION_3XX) in venc_inst_init()
1063 inst->cap_height.max = ALIGN(2160, 32); in venc_inst_init()
1064 inst->cap_height.step_size = 2; in venc_inst_init()
1065 inst->cap_framerate.min = 1; in venc_inst_init()
1066 inst->cap_framerate.max = 30; in venc_inst_init()
1067 inst->cap_framerate.step_size = 1; in venc_inst_init()
1068 inst->cap_mbs_per_frame.min = 24; in venc_inst_init()
1069 inst->cap_mbs_per_frame.max = 8160; in venc_inst_init()
1075 struct venus_inst *inst; in venc_open() local
1078 inst = kzalloc(sizeof(*inst), GFP_KERNEL); in venc_open()
1079 if (!inst) in venc_open()
1082 INIT_LIST_HEAD(&inst->registeredbufs); in venc_open()
1083 INIT_LIST_HEAD(&inst->internalbufs); in venc_open()
1084 INIT_LIST_HEAD(&inst->list); in venc_open()
1085 mutex_init(&inst->lock); in venc_open()
1087 inst->core = core; in venc_open()
1088 inst->session_type = VIDC_SESSION_TYPE_ENC; in venc_open()
1090 venus_helper_init_instance(inst); in venc_open()
1096 ret = venc_ctrl_init(inst); in venc_open()
1100 ret = hfi_session_create(inst, &venc_hfi_ops); in venc_open()
1104 venc_inst_init(inst); in venc_open()
1110 inst->m2m_dev = v4l2_m2m_init(&venc_m2m_ops); in venc_open()
1111 if (IS_ERR(inst->m2m_dev)) { in venc_open()
1112 ret = PTR_ERR(inst->m2m_dev); in venc_open()
1116 inst->m2m_ctx = v4l2_m2m_ctx_init(inst->m2m_dev, inst, m2m_queue_init); in venc_open()
1117 if (IS_ERR(inst->m2m_ctx)) { in venc_open()
1118 ret = PTR_ERR(inst->m2m_ctx); in venc_open()
1122 v4l2_fh_init(&inst->fh, core->vdev_enc); in venc_open()
1124 inst->fh.ctrl_handler = &inst->ctrl_handler; in venc_open()
1125 v4l2_fh_add(&inst->fh); in venc_open()
1126 inst->fh.m2m_ctx = inst->m2m_ctx; in venc_open()
1127 file->private_data = &inst->fh; in venc_open()
1132 v4l2_m2m_release(inst->m2m_dev); in venc_open()
1134 hfi_session_destroy(inst); in venc_open()
1136 venc_ctrl_deinit(inst); in venc_open()
1140 kfree(inst); in venc_open()
1146 struct venus_inst *inst = to_inst(file); in venc_close() local
1148 v4l2_m2m_ctx_release(inst->m2m_ctx); in venc_close()
1149 v4l2_m2m_release(inst->m2m_dev); in venc_close()
1150 venc_ctrl_deinit(inst); in venc_close()
1151 hfi_session_destroy(inst); in venc_close()
1152 mutex_destroy(&inst->lock); in venc_close()
1153 v4l2_fh_del(&inst->fh); in venc_close()
1154 v4l2_fh_exit(&inst->fh); in venc_close()
1156 pm_runtime_put_sync(inst->core->dev_enc); in venc_close()
1158 kfree(inst); in venc_close()