Lines Matching refs:sess

40 u32 amvdec_get_output_size(struct amvdec_session *sess)
42 return get_output_size(sess->width, sess->height);
46 static int vdec_codec_needs_recycle(struct amvdec_session *sess)
48 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops;
55 struct amvdec_session *sess = data;
56 struct amvdec_core *core = sess->core;
57 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops;
61 mutex_lock(&sess->bufs_recycle_lock);
62 list_for_each_entry_safe(tmp, n, &sess->bufs_recycle, list) {
70 mutex_unlock(&sess->bufs_recycle_lock);
78 static int vdec_poweron(struct amvdec_session *sess)
81 struct amvdec_ops *vdec_ops = sess->fmt_out->vdec_ops;
83 ret = clk_prepare_enable(sess->core->dos_parser_clk);
87 ret = clk_prepare_enable(sess->core->dos_clk);
91 ret = vdec_ops->start(sess);
95 esparser_power_up(sess);
100 clk_disable_unprepare(sess->core->dos_clk);
102 clk_disable_unprepare(sess->core->dos_parser_clk);
107 static void vdec_wait_inactive(struct amvdec_session *sess)
110 while (time_is_after_jiffies64(sess->last_irq_jiffies +
115 static void vdec_poweroff(struct amvdec_session *sess)
117 struct amvdec_ops *vdec_ops = sess->fmt_out->vdec_ops;
118 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops;
120 sess->should_stop = 1;
121 vdec_wait_inactive(sess);
123 codec_ops->drain(sess);
125 vdec_ops->stop(sess);
126 clk_disable_unprepare(sess->core->dos_clk);
127 clk_disable_unprepare(sess->core->dos_parser_clk);
131 vdec_queue_recycle(struct amvdec_session *sess, struct vb2_buffer *vb)
140 mutex_lock(&sess->bufs_recycle_lock);
141 list_add_tail(&new_buf->list, &sess->bufs_recycle);
142 mutex_unlock(&sess->bufs_recycle_lock);
147 struct amvdec_session *sess = priv;
149 schedule_work(&sess->esparser_queue_work);
154 struct amvdec_session *sess = priv;
156 v4l2_m2m_job_finish(sess->m2m_dev, sess->m2m_ctx);
165 struct amvdec_session *sess,
169 const struct amvdec_format *fmt_out = sess->fmt_out;
172 u32 min_buf_capture = v4l2_ctrl_g_ctrl(sess->ctrl_min_buf_capture);
186 sess->num_dst_bufs = q_num_bufs + *num_buffers;
187 q->min_queued_buffers = max(fmt_out->min_buffers, sess->num_dst_bufs);
194 struct amvdec_session *sess = vb2_get_drv_priv(q);
195 u32 output_size = amvdec_get_output_size(sess);
201 sizes[0] < sess->src_buffer_size)
205 switch (sess->pixfmt_cap) {
223 process_num_buffers(q, sess, num_buffers, false);
232 sizes[0] = sess->src_buffer_size;
236 switch (sess->pixfmt_cap) {
252 process_num_buffers(q, sess, num_buffers, true);
258 sess->changed_format = 1;
265 struct amvdec_session *sess = vb2_get_drv_priv(vb->vb2_queue);
266 struct v4l2_m2m_ctx *m2m_ctx = sess->m2m_ctx;
270 if (!sess->streamon_out)
273 if (sess->streamon_cap &&
275 vdec_codec_needs_recycle(sess))
276 vdec_queue_recycle(sess, vb);
278 schedule_work(&sess->esparser_queue_work);
283 struct amvdec_session *sess = vb2_get_drv_priv(q);
284 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops;
285 struct amvdec_core *core = sess->core;
289 if (core->cur_sess && core->cur_sess != sess) {
295 sess->streamon_out = 1;
297 sess->streamon_cap = 1;
299 if (!sess->streamon_out)
302 if (sess->status == STATUS_NEEDS_RESUME &&
304 sess->changed_format) {
305 codec_ops->resume(sess);
306 sess->status = STATUS_RUNNING;
310 if (sess->status == STATUS_RUNNING ||
311 sess->status == STATUS_NEEDS_RESUME ||
312 sess->status == STATUS_INIT)
315 sess->vififo_size = SIZE_VIFIFO;
316 sess->vififo_vaddr =
317 dma_alloc_coherent(sess->core->dev, sess->vififo_size,
318 &sess->vififo_paddr, GFP_KERNEL);
319 if (!sess->vififo_vaddr) {
320 dev_err(sess->core->dev, "Failed to request VIFIFO buffer\n");
325 sess->should_stop = 0;
326 sess->keyframe_found = 0;
327 sess->last_offset = 0;
328 sess->wrap_count = 0;
329 sess->pixelaspect.numerator = 1;
330 sess->pixelaspect.denominator = 1;
331 atomic_set(&sess->esparser_queued_bufs, 0);
332 v4l2_ctrl_s_ctrl(sess->ctrl_min_buf_capture, 1);
334 ret = vdec_poweron(sess);
338 sess->sequence_cap = 0;
339 sess->sequence_out = 0;
340 if (vdec_codec_needs_recycle(sess))
341 sess->recycle_thread = kthread_run(vdec_recycle_thread, sess,
344 sess->status = STATUS_INIT;
345 core->cur_sess = sess;
346 schedule_work(&sess->esparser_queue_work);
350 dma_free_coherent(sess->core->dev, sess->vififo_size,
351 sess->vififo_vaddr, sess->vififo_paddr);
353 while ((buf = v4l2_m2m_src_buf_remove(sess->m2m_ctx)))
355 while ((buf = v4l2_m2m_dst_buf_remove(sess->m2m_ctx)))
359 sess->streamon_out = 0;
361 sess->streamon_cap = 0;
366 static void vdec_free_canvas(struct amvdec_session *sess)
370 for (i = 0; i < sess->canvas_num; ++i)
371 meson_canvas_free(sess->core->canvas, sess->canvas_alloc[i]);
373 sess->canvas_num = 0;
376 static void vdec_reset_timestamps(struct amvdec_session *sess)
380 list_for_each_entry_safe(tmp, n, &sess->timestamps, list) {
386 static void vdec_reset_bufs_recycle(struct amvdec_session *sess)
390 list_for_each_entry_safe(tmp, n, &sess->bufs_recycle, list) {
398 struct amvdec_session *sess = vb2_get_drv_priv(q);
399 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops;
400 struct amvdec_core *core = sess->core;
403 if (sess->status == STATUS_RUNNING ||
404 sess->status == STATUS_INIT ||
405 (sess->status == STATUS_NEEDS_RESUME &&
406 (!sess->streamon_out || !sess->streamon_cap))) {
407 if (vdec_codec_needs_recycle(sess))
408 kthread_stop(sess->recycle_thread);
410 vdec_poweroff(sess);
411 vdec_free_canvas(sess);
412 dma_free_coherent(sess->core->dev, sess->vififo_size,
413 sess->vififo_vaddr, sess->vififo_paddr);
414 vdec_reset_timestamps(sess);
415 vdec_reset_bufs_recycle(sess);
416 kfree(sess->priv);
417 sess->priv = NULL;
419 sess->status = STATUS_STOPPED;
423 while ((buf = v4l2_m2m_src_buf_remove(sess->m2m_ctx)))
426 sess->streamon_out = 0;
429 if (sess->status >= STATUS_RUNNING && codec_ops->drain)
430 codec_ops->drain(sess);
432 while ((buf = v4l2_m2m_dst_buf_remove(sess->m2m_ctx)))
435 sess->streamon_cap = 0;
493 vdec_try_fmt_common(struct amvdec_session *sess, u32 size,
498 const struct amvdec_format *fmts = sess->core->platform->formats;
514 fmt_out = sess->fmt_out;
526 pfmt[0].sizeimage = sess->src_buffer_size;
530 fmt_out = sess->fmt_out;
563 struct amvdec_session *sess =
566 vdec_try_fmt_common(sess, sess->core->platform->num_formats, f);
573 struct amvdec_session *sess =
578 pixmp->pixelformat = sess->pixfmt_cap;
580 pixmp->pixelformat = sess->fmt_out->pixfmt;
583 pixmp->width = sess->width;
584 pixmp->height = sess->height;
585 pixmp->colorspace = sess->colorspace;
586 pixmp->ycbcr_enc = sess->ycbcr_enc;
587 pixmp->quantization = sess->quantization;
588 pixmp->xfer_func = sess->xfer_func;
590 pixmp->width = sess->width;
591 pixmp->height = sess->height;
594 vdec_try_fmt_common(sess, sess->core->platform->num_formats, f);
601 struct amvdec_session *sess =
604 u32 num_formats = sess->core->platform->num_formats;
612 fmt_out = vdec_try_fmt_common(sess, num_formats, f);
618 pixfmt_cap = sess->pixfmt_cap;
621 pixfmt_out = sess->fmt_out->pixfmt;
630 vdec_try_fmt_common(sess, num_formats, &format);
633 sess->width = format.fmt.pix_mp.width;
634 sess->height = format.fmt.pix_mp.height;
635 sess->colorspace = pixmp->colorspace;
636 sess->ycbcr_enc = pixmp->ycbcr_enc;
637 sess->quantization = pixmp->quantization;
638 sess->xfer_func = pixmp->xfer_func;
639 sess->src_buffer_size = pixmp->plane_fmt[0].sizeimage;
648 vdec_try_fmt_common(sess, num_formats, &format);
650 sess->width = format.fmt.pix_mp.width;
651 sess->height = format.fmt.pix_mp.height;
654 sess->fmt_out = fmt_out;
656 sess->pixfmt_cap = format.fmt.pix_mp.pixelformat;
663 struct amvdec_session *sess =
665 const struct vdec_platform *platform = sess->core->platform;
678 fmt_out = sess->fmt_out;
693 struct amvdec_session *sess =
695 const struct amvdec_format *formats = sess->core->platform->formats;
697 u32 num_formats = sess->core->platform->num_formats;
718 struct amvdec_session *sess =
720 struct amvdec_codec_ops *codec_ops = sess->fmt_out->codec_ops;
721 struct device *dev = sess->core->dev;
728 if (!(sess->streamon_out & sess->streamon_cap))
732 v4l2_m2m_clear_state(sess->m2m_ctx);
733 sess->should_stop = 0;
743 sess->should_stop = 1;
745 v4l2_m2m_mark_stopped(sess->m2m_ctx);
748 vdec_wait_inactive(sess);
749 codec_ops->drain(sess);
754 esparser_queue_eos(sess->core, data, len);
755 vdec_wait_inactive(sess);
778 struct amvdec_session *sess =
784 *f = sess->pixelaspect;
818 struct amvdec_session *sess = priv;
826 src_vq->drv_priv = sess;
829 src_vq->dev = sess->core->dev;
830 src_vq->lock = &sess->lock;
840 dst_vq->drv_priv = sess;
843 dst_vq->dev = sess->core->dev;
844 dst_vq->lock = &sess->lock;
848 static int vdec_init_ctrls(struct amvdec_session *sess)
850 struct v4l2_ctrl_handler *ctrl_handler = &sess->ctrl_handler;
857 sess->ctrl_min_buf_capture =
876 struct amvdec_session *sess;
879 sess = kzalloc(sizeof(*sess), GFP_KERNEL);
880 if (!sess)
883 sess->core = core;
885 sess->m2m_dev = v4l2_m2m_init(&vdec_m2m_ops);
886 if (IS_ERR(sess->m2m_dev)) {
888 ret = PTR_ERR(sess->m2m_dev);
892 sess->m2m_ctx = v4l2_m2m_ctx_init(sess->m2m_dev, sess, m2m_queue_init);
893 if (IS_ERR(sess->m2m_ctx)) {
895 ret = PTR_ERR(sess->m2m_ctx);
899 ret = vdec_init_ctrls(sess);
903 sess->pixfmt_cap = formats[0].pixfmts_cap[0];
904 sess->fmt_out = &formats[0];
905 sess->width = 1280;
906 sess->height = 720;
907 sess->pixelaspect.numerator = 1;
908 sess->pixelaspect.denominator = 1;
909 sess->src_buffer_size = SZ_1M;
911 INIT_LIST_HEAD(&sess->timestamps);
912 INIT_LIST_HEAD(&sess->bufs_recycle);
913 INIT_WORK(&sess->esparser_queue_work, esparser_queue_all_src);
914 mutex_init(&sess->lock);
915 mutex_init(&sess->bufs_recycle_lock);
916 spin_lock_init(&sess->ts_spinlock);
918 v4l2_fh_init(&sess->fh, core->vdev_dec);
919 sess->fh.ctrl_handler = &sess->ctrl_handler;
920 v4l2_fh_add(&sess->fh);
921 sess->fh.m2m_ctx = sess->m2m_ctx;
922 file->private_data = &sess->fh;
927 v4l2_m2m_release(sess->m2m_dev);
929 kfree(sess);
935 struct amvdec_session *sess =
938 v4l2_m2m_ctx_release(sess->m2m_ctx);
939 v4l2_m2m_release(sess->m2m_dev);
940 v4l2_fh_del(&sess->fh);
941 v4l2_fh_exit(&sess->fh);
943 mutex_destroy(&sess->lock);
944 mutex_destroy(&sess->bufs_recycle_lock);
946 kfree(sess);
963 struct amvdec_session *sess = core->cur_sess;
965 sess->last_irq_jiffies = get_jiffies_64();
967 return sess->fmt_out->codec_ops->isr(sess);
973 struct amvdec_session *sess = core->cur_sess;
975 return sess->fmt_out->codec_ops->threaded_isr(sess);