Lines Matching refs:sess

40 u32 amvdec_get_output_size(struct amvdec_session *sess)  in amvdec_get_output_size()  argument
42 return get_output_size(sess->width, sess->height); in amvdec_get_output_size()
46 static int vdec_codec_needs_recycle(struct amvdec_session *sess) in vdec_codec_needs_recycle() argument
48 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops; in vdec_codec_needs_recycle()
55 struct amvdec_session *sess = data; in vdec_recycle_thread() local
56 struct amvdec_core *core = sess->core; in vdec_recycle_thread()
57 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops; in vdec_recycle_thread()
61 mutex_lock(&sess->bufs_recycle_lock); in vdec_recycle_thread()
62 list_for_each_entry_safe(tmp, n, &sess->bufs_recycle, list) { in vdec_recycle_thread()
70 mutex_unlock(&sess->bufs_recycle_lock); in vdec_recycle_thread()
78 static int vdec_poweron(struct amvdec_session *sess) in vdec_poweron() argument
81 struct amvdec_ops *vdec_ops = sess->fmt_out->vdec_ops; in vdec_poweron()
83 ret = clk_prepare_enable(sess->core->dos_parser_clk); in vdec_poweron()
87 ret = clk_prepare_enable(sess->core->dos_clk); in vdec_poweron()
91 ret = vdec_ops->start(sess); in vdec_poweron()
95 esparser_power_up(sess); in vdec_poweron()
100 clk_disable_unprepare(sess->core->dos_clk); in vdec_poweron()
102 clk_disable_unprepare(sess->core->dos_parser_clk); in vdec_poweron()
107 static void vdec_wait_inactive(struct amvdec_session *sess) in vdec_wait_inactive() argument
110 while (time_is_after_jiffies64(sess->last_irq_jiffies + in vdec_wait_inactive()
115 static void vdec_poweroff(struct amvdec_session *sess) in vdec_poweroff() argument
117 struct amvdec_ops *vdec_ops = sess->fmt_out->vdec_ops; in vdec_poweroff()
118 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops; in vdec_poweroff()
120 sess->should_stop = 1; in vdec_poweroff()
121 vdec_wait_inactive(sess); in vdec_poweroff()
123 codec_ops->drain(sess); in vdec_poweroff()
125 vdec_ops->stop(sess); in vdec_poweroff()
126 clk_disable_unprepare(sess->core->dos_clk); in vdec_poweroff()
127 clk_disable_unprepare(sess->core->dos_parser_clk); in vdec_poweroff()
131 vdec_queue_recycle(struct amvdec_session *sess, struct vb2_buffer *vb) in vdec_queue_recycle() argument
140 mutex_lock(&sess->bufs_recycle_lock); in vdec_queue_recycle()
141 list_add_tail(&new_buf->list, &sess->bufs_recycle); in vdec_queue_recycle()
142 mutex_unlock(&sess->bufs_recycle_lock); in vdec_queue_recycle()
147 struct amvdec_session *sess = priv; in vdec_m2m_device_run() local
149 schedule_work(&sess->esparser_queue_work); in vdec_m2m_device_run()
154 struct amvdec_session *sess = priv; in vdec_m2m_job_abort() local
156 v4l2_m2m_job_finish(sess->m2m_dev, sess->m2m_ctx); in vdec_m2m_job_abort()
165 struct amvdec_session *sess, in process_num_buffers() argument
169 const struct amvdec_format *fmt_out = sess->fmt_out; in process_num_buffers()
171 u32 min_buf_capture = v4l2_ctrl_g_ctrl(sess->ctrl_min_buf_capture); in process_num_buffers()
185 sess->num_dst_bufs = q->num_buffers + *num_buffers; in process_num_buffers()
186 q->min_buffers_needed = max(fmt_out->min_buffers, sess->num_dst_bufs); in process_num_buffers()
193 struct amvdec_session *sess = vb2_get_drv_priv(q); in vdec_queue_setup() local
194 u32 output_size = amvdec_get_output_size(sess); in vdec_queue_setup()
200 sizes[0] < sess->src_buffer_size) in vdec_queue_setup()
204 switch (sess->pixfmt_cap) { in vdec_queue_setup()
222 process_num_buffers(q, sess, num_buffers, false); in vdec_queue_setup()
231 sizes[0] = sess->src_buffer_size; in vdec_queue_setup()
235 switch (sess->pixfmt_cap) { in vdec_queue_setup()
251 process_num_buffers(q, sess, num_buffers, true); in vdec_queue_setup()
257 sess->changed_format = 1; in vdec_queue_setup()
264 struct amvdec_session *sess = vb2_get_drv_priv(vb->vb2_queue); in vdec_vb2_buf_queue() local
265 struct v4l2_m2m_ctx *m2m_ctx = sess->m2m_ctx; in vdec_vb2_buf_queue()
269 if (!sess->streamon_out) in vdec_vb2_buf_queue()
272 if (sess->streamon_cap && in vdec_vb2_buf_queue()
274 vdec_codec_needs_recycle(sess)) in vdec_vb2_buf_queue()
275 vdec_queue_recycle(sess, vb); in vdec_vb2_buf_queue()
277 schedule_work(&sess->esparser_queue_work); in vdec_vb2_buf_queue()
282 struct amvdec_session *sess = vb2_get_drv_priv(q); in vdec_start_streaming() local
283 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops; in vdec_start_streaming()
284 struct amvdec_core *core = sess->core; in vdec_start_streaming()
288 if (core->cur_sess && core->cur_sess != sess) { in vdec_start_streaming()
294 sess->streamon_out = 1; in vdec_start_streaming()
296 sess->streamon_cap = 1; in vdec_start_streaming()
298 if (!sess->streamon_out) in vdec_start_streaming()
301 if (sess->status == STATUS_NEEDS_RESUME && in vdec_start_streaming()
303 sess->changed_format) { in vdec_start_streaming()
304 codec_ops->resume(sess); in vdec_start_streaming()
305 sess->status = STATUS_RUNNING; in vdec_start_streaming()
309 if (sess->status == STATUS_RUNNING || in vdec_start_streaming()
310 sess->status == STATUS_NEEDS_RESUME || in vdec_start_streaming()
311 sess->status == STATUS_INIT) in vdec_start_streaming()
314 sess->vififo_size = SIZE_VIFIFO; in vdec_start_streaming()
315 sess->vififo_vaddr = in vdec_start_streaming()
316 dma_alloc_coherent(sess->core->dev, sess->vififo_size, in vdec_start_streaming()
317 &sess->vififo_paddr, GFP_KERNEL); in vdec_start_streaming()
318 if (!sess->vififo_vaddr) { in vdec_start_streaming()
319 dev_err(sess->core->dev, "Failed to request VIFIFO buffer\n"); in vdec_start_streaming()
324 sess->should_stop = 0; in vdec_start_streaming()
325 sess->keyframe_found = 0; in vdec_start_streaming()
326 sess->last_offset = 0; in vdec_start_streaming()
327 sess->wrap_count = 0; in vdec_start_streaming()
328 sess->pixelaspect.numerator = 1; in vdec_start_streaming()
329 sess->pixelaspect.denominator = 1; in vdec_start_streaming()
330 atomic_set(&sess->esparser_queued_bufs, 0); in vdec_start_streaming()
331 v4l2_ctrl_s_ctrl(sess->ctrl_min_buf_capture, 1); in vdec_start_streaming()
333 ret = vdec_poweron(sess); in vdec_start_streaming()
337 sess->sequence_cap = 0; in vdec_start_streaming()
338 sess->sequence_out = 0; in vdec_start_streaming()
339 if (vdec_codec_needs_recycle(sess)) in vdec_start_streaming()
340 sess->recycle_thread = kthread_run(vdec_recycle_thread, sess, in vdec_start_streaming()
343 sess->status = STATUS_INIT; in vdec_start_streaming()
344 core->cur_sess = sess; in vdec_start_streaming()
345 schedule_work(&sess->esparser_queue_work); in vdec_start_streaming()
349 dma_free_coherent(sess->core->dev, sess->vififo_size, in vdec_start_streaming()
350 sess->vififo_vaddr, sess->vififo_paddr); in vdec_start_streaming()
352 while ((buf = v4l2_m2m_src_buf_remove(sess->m2m_ctx))) in vdec_start_streaming()
354 while ((buf = v4l2_m2m_dst_buf_remove(sess->m2m_ctx))) in vdec_start_streaming()
358 sess->streamon_out = 0; in vdec_start_streaming()
360 sess->streamon_cap = 0; in vdec_start_streaming()
365 static void vdec_free_canvas(struct amvdec_session *sess) in vdec_free_canvas() argument
369 for (i = 0; i < sess->canvas_num; ++i) in vdec_free_canvas()
370 meson_canvas_free(sess->core->canvas, sess->canvas_alloc[i]); in vdec_free_canvas()
372 sess->canvas_num = 0; in vdec_free_canvas()
375 static void vdec_reset_timestamps(struct amvdec_session *sess) in vdec_reset_timestamps() argument
379 list_for_each_entry_safe(tmp, n, &sess->timestamps, list) { in vdec_reset_timestamps()
385 static void vdec_reset_bufs_recycle(struct amvdec_session *sess) in vdec_reset_bufs_recycle() argument
389 list_for_each_entry_safe(tmp, n, &sess->bufs_recycle, list) { in vdec_reset_bufs_recycle()
397 struct amvdec_session *sess = vb2_get_drv_priv(q); in vdec_stop_streaming() local
398 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops; in vdec_stop_streaming()
399 struct amvdec_core *core = sess->core; in vdec_stop_streaming()
402 if (sess->status == STATUS_RUNNING || in vdec_stop_streaming()
403 sess->status == STATUS_INIT || in vdec_stop_streaming()
404 (sess->status == STATUS_NEEDS_RESUME && in vdec_stop_streaming()
405 (!sess->streamon_out || !sess->streamon_cap))) { in vdec_stop_streaming()
406 if (vdec_codec_needs_recycle(sess)) in vdec_stop_streaming()
407 kthread_stop(sess->recycle_thread); in vdec_stop_streaming()
409 vdec_poweroff(sess); in vdec_stop_streaming()
410 vdec_free_canvas(sess); in vdec_stop_streaming()
411 dma_free_coherent(sess->core->dev, sess->vififo_size, in vdec_stop_streaming()
412 sess->vififo_vaddr, sess->vififo_paddr); in vdec_stop_streaming()
413 vdec_reset_timestamps(sess); in vdec_stop_streaming()
414 vdec_reset_bufs_recycle(sess); in vdec_stop_streaming()
415 kfree(sess->priv); in vdec_stop_streaming()
416 sess->priv = NULL; in vdec_stop_streaming()
418 sess->status = STATUS_STOPPED; in vdec_stop_streaming()
422 while ((buf = v4l2_m2m_src_buf_remove(sess->m2m_ctx))) in vdec_stop_streaming()
425 sess->streamon_out = 0; in vdec_stop_streaming()
428 if (sess->status >= STATUS_RUNNING && codec_ops->drain) in vdec_stop_streaming()
429 codec_ops->drain(sess); in vdec_stop_streaming()
431 while ((buf = v4l2_m2m_dst_buf_remove(sess->m2m_ctx))) in vdec_stop_streaming()
434 sess->streamon_cap = 0; in vdec_stop_streaming()
492 vdec_try_fmt_common(struct amvdec_session *sess, u32 size, in vdec_try_fmt_common() argument
497 const struct amvdec_format *fmts = sess->core->platform->formats; in vdec_try_fmt_common()
513 fmt_out = sess->fmt_out; in vdec_try_fmt_common()
525 pfmt[0].sizeimage = sess->src_buffer_size; in vdec_try_fmt_common()
529 fmt_out = sess->fmt_out; in vdec_try_fmt_common()
562 struct amvdec_session *sess = in vdec_try_fmt() local
565 vdec_try_fmt_common(sess, sess->core->platform->num_formats, f); in vdec_try_fmt()
572 struct amvdec_session *sess = in vdec_g_fmt() local
577 pixmp->pixelformat = sess->pixfmt_cap; in vdec_g_fmt()
579 pixmp->pixelformat = sess->fmt_out->pixfmt; in vdec_g_fmt()
582 pixmp->width = sess->width; in vdec_g_fmt()
583 pixmp->height = sess->height; in vdec_g_fmt()
584 pixmp->colorspace = sess->colorspace; in vdec_g_fmt()
585 pixmp->ycbcr_enc = sess->ycbcr_enc; in vdec_g_fmt()
586 pixmp->quantization = sess->quantization; in vdec_g_fmt()
587 pixmp->xfer_func = sess->xfer_func; in vdec_g_fmt()
589 pixmp->width = sess->width; in vdec_g_fmt()
590 pixmp->height = sess->height; in vdec_g_fmt()
593 vdec_try_fmt_common(sess, sess->core->platform->num_formats, f); in vdec_g_fmt()
600 struct amvdec_session *sess = in vdec_s_fmt() local
603 u32 num_formats = sess->core->platform->num_formats; in vdec_s_fmt()
611 fmt_out = vdec_try_fmt_common(sess, num_formats, f); in vdec_s_fmt()
617 pixfmt_cap = sess->pixfmt_cap; in vdec_s_fmt()
620 pixfmt_out = sess->fmt_out->pixfmt; in vdec_s_fmt()
629 vdec_try_fmt_common(sess, num_formats, &format); in vdec_s_fmt()
632 sess->width = format.fmt.pix_mp.width; in vdec_s_fmt()
633 sess->height = format.fmt.pix_mp.height; in vdec_s_fmt()
634 sess->colorspace = pixmp->colorspace; in vdec_s_fmt()
635 sess->ycbcr_enc = pixmp->ycbcr_enc; in vdec_s_fmt()
636 sess->quantization = pixmp->quantization; in vdec_s_fmt()
637 sess->xfer_func = pixmp->xfer_func; in vdec_s_fmt()
638 sess->src_buffer_size = pixmp->plane_fmt[0].sizeimage; in vdec_s_fmt()
647 vdec_try_fmt_common(sess, num_formats, &format); in vdec_s_fmt()
649 sess->width = format.fmt.pix_mp.width; in vdec_s_fmt()
650 sess->height = format.fmt.pix_mp.height; in vdec_s_fmt()
653 sess->fmt_out = fmt_out; in vdec_s_fmt()
655 sess->pixfmt_cap = format.fmt.pix_mp.pixelformat; in vdec_s_fmt()
662 struct amvdec_session *sess = in vdec_enum_fmt() local
664 const struct vdec_platform *platform = sess->core->platform; in vdec_enum_fmt()
677 fmt_out = sess->fmt_out; in vdec_enum_fmt()
692 struct amvdec_session *sess = in vdec_enum_framesizes() local
694 const struct amvdec_format *formats = sess->core->platform->formats; in vdec_enum_framesizes()
696 u32 num_formats = sess->core->platform->num_formats; in vdec_enum_framesizes()
717 struct amvdec_session *sess = in vdec_decoder_cmd() local
719 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops; in vdec_decoder_cmd()
720 struct device *dev = sess->core->dev; in vdec_decoder_cmd()
727 if (!(sess->streamon_out & sess->streamon_cap)) in vdec_decoder_cmd()
731 v4l2_m2m_clear_state(sess->m2m_ctx); in vdec_decoder_cmd()
732 sess->should_stop = 0; in vdec_decoder_cmd()
742 sess->should_stop = 1; in vdec_decoder_cmd()
744 v4l2_m2m_mark_stopped(sess->m2m_ctx); in vdec_decoder_cmd()
747 vdec_wait_inactive(sess); in vdec_decoder_cmd()
748 codec_ops->drain(sess); in vdec_decoder_cmd()
753 esparser_queue_eos(sess->core, data, len); in vdec_decoder_cmd()
754 vdec_wait_inactive(sess); in vdec_decoder_cmd()
777 struct amvdec_session *sess = in vdec_g_pixelaspect() local
783 *f = sess->pixelaspect; in vdec_g_pixelaspect()
817 struct amvdec_session *sess = priv; in m2m_queue_init() local
825 src_vq->drv_priv = sess; in m2m_queue_init()
828 src_vq->dev = sess->core->dev; in m2m_queue_init()
829 src_vq->lock = &sess->lock; in m2m_queue_init()
839 dst_vq->drv_priv = sess; in m2m_queue_init()
842 dst_vq->dev = sess->core->dev; in m2m_queue_init()
843 dst_vq->lock = &sess->lock; in m2m_queue_init()
847 static int vdec_init_ctrls(struct amvdec_session *sess) in vdec_init_ctrls() argument
849 struct v4l2_ctrl_handler *ctrl_handler = &sess->ctrl_handler; in vdec_init_ctrls()
856 sess->ctrl_min_buf_capture = in vdec_init_ctrls()
875 struct amvdec_session *sess; in vdec_open() local
878 sess = kzalloc(sizeof(*sess), GFP_KERNEL); in vdec_open()
879 if (!sess) in vdec_open()
882 sess->core = core; in vdec_open()
884 sess->m2m_dev = v4l2_m2m_init(&vdec_m2m_ops); in vdec_open()
885 if (IS_ERR(sess->m2m_dev)) { in vdec_open()
887 ret = PTR_ERR(sess->m2m_dev); in vdec_open()
891 sess->m2m_ctx = v4l2_m2m_ctx_init(sess->m2m_dev, sess, m2m_queue_init); in vdec_open()
892 if (IS_ERR(sess->m2m_ctx)) { in vdec_open()
894 ret = PTR_ERR(sess->m2m_ctx); in vdec_open()
898 ret = vdec_init_ctrls(sess); in vdec_open()
902 sess->pixfmt_cap = formats[0].pixfmts_cap[0]; in vdec_open()
903 sess->fmt_out = &formats[0]; in vdec_open()
904 sess->width = 1280; in vdec_open()
905 sess->height = 720; in vdec_open()
906 sess->pixelaspect.numerator = 1; in vdec_open()
907 sess->pixelaspect.denominator = 1; in vdec_open()
908 sess->src_buffer_size = SZ_1M; in vdec_open()
910 INIT_LIST_HEAD(&sess->timestamps); in vdec_open()
911 INIT_LIST_HEAD(&sess->bufs_recycle); in vdec_open()
912 INIT_WORK(&sess->esparser_queue_work, esparser_queue_all_src); in vdec_open()
913 mutex_init(&sess->lock); in vdec_open()
914 mutex_init(&sess->bufs_recycle_lock); in vdec_open()
915 spin_lock_init(&sess->ts_spinlock); in vdec_open()
917 v4l2_fh_init(&sess->fh, core->vdev_dec); in vdec_open()
918 sess->fh.ctrl_handler = &sess->ctrl_handler; in vdec_open()
919 v4l2_fh_add(&sess->fh); in vdec_open()
920 sess->fh.m2m_ctx = sess->m2m_ctx; in vdec_open()
921 file->private_data = &sess->fh; in vdec_open()
926 v4l2_m2m_release(sess->m2m_dev); in vdec_open()
928 kfree(sess); in vdec_open()
934 struct amvdec_session *sess = in vdec_close() local
937 v4l2_m2m_ctx_release(sess->m2m_ctx); in vdec_close()
938 v4l2_m2m_release(sess->m2m_dev); in vdec_close()
939 v4l2_fh_del(&sess->fh); in vdec_close()
940 v4l2_fh_exit(&sess->fh); in vdec_close()
942 mutex_destroy(&sess->lock); in vdec_close()
943 mutex_destroy(&sess->bufs_recycle_lock); in vdec_close()
945 kfree(sess); in vdec_close()
962 struct amvdec_session *sess = core->cur_sess; in vdec_isr() local
964 sess->last_irq_jiffies = get_jiffies_64(); in vdec_isr()
966 return sess->fmt_out->codec_ops->isr(sess); in vdec_isr()
972 struct amvdec_session *sess = core->cur_sess; in vdec_threaded_isr() local
974 return sess->fmt_out->codec_ops->threaded_isr(sess); in vdec_threaded_isr()