Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: vicodec: Register another node for stateless decoder

Add stateless decoder instance field to the dev struct and
register another node for the statelsess decoder.
The stateless API for the node will be implemented in further patches.

Signed-off-by: Dafna Hirschfeld <dafna3@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
[hverkuil-cisco@xs4all.nl: fix typo: videdev-stateless-dec -> stateless-decoder]
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>

authored by

Dafna Hirschfeld and committed by
Mauro Carvalho Chehab
fde649b4 f05a51b9

+42 -4
+42 -4
drivers/media/platform/vicodec/vicodec-core.c
··· 104 104 struct v4l2_device v4l2_dev; 105 105 struct vicodec_dev_instance stateful_enc; 106 106 struct vicodec_dev_instance stateful_dec; 107 + struct vicodec_dev_instance stateless_dec; 107 108 #ifdef CONFIG_MEDIA_CONTROLLER 108 109 struct media_device mdev; 109 110 #endif ··· 115 114 struct v4l2_fh fh; 116 115 struct vicodec_dev *dev; 117 116 bool is_enc; 117 + bool is_stateless; 118 118 spinlock_t *lock; 119 119 120 120 struct v4l2_ctrl_handler hdl; ··· 374 372 375 373 if (ctx->is_enc) 376 374 v4l2_m2m_job_finish(dev->stateful_enc.m2m_dev, ctx->fh.m2m_ctx); 375 + else if (ctx->is_stateless) 376 + v4l2_m2m_job_finish(dev->stateless_dec.m2m_dev, 377 + ctx->fh.m2m_ctx); 377 378 else 378 379 v4l2_m2m_job_finish(dev->stateful_dec.m2m_dev, ctx->fh.m2m_ctx); 379 380 } ··· 1513 1508 src_vq->ops = &vicodec_qops; 1514 1509 src_vq->mem_ops = &vb2_vmalloc_memops; 1515 1510 src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; 1516 - src_vq->lock = ctx->is_enc ? &ctx->dev->stateful_enc.mutex : 1517 - &ctx->dev->stateful_dec.mutex; 1511 + if (ctx->is_enc) 1512 + src_vq->lock = &ctx->dev->stateful_enc.mutex; 1513 + else if (ctx->is_stateless) 1514 + src_vq->lock = &ctx->dev->stateless_dec.mutex; 1515 + else 1516 + src_vq->lock = &ctx->dev->stateful_dec.mutex; 1517 + src_vq->supports_requests = ctx->is_stateless; 1518 + src_vq->requires_requests = ctx->is_stateless; 1518 1519 ret = vb2_queue_init(src_vq); 1519 1520 if (ret) 1520 1521 return ret; ··· 1589 1578 1590 1579 if (vfd == &dev->stateful_enc.vfd) 1591 1580 ctx->is_enc = true; 1581 + else if (vfd == &dev->stateless_dec.vfd) 1582 + ctx->is_stateless = true; 1592 1583 1593 1584 v4l2_fh_init(&ctx->fh, video_devdata(file)); 1594 1585 file->private_data = &ctx->fh; ··· 1603 1590 1, 31, 1, 20); 1604 1591 v4l2_ctrl_new_std(hdl, &vicodec_ctrl_ops, V4L2_CID_FWHT_P_FRAME_QP, 1605 1592 1, 31, 1, 20); 1593 + if (ctx->is_stateless) 1594 + v4l2_ctrl_new_custom(hdl, &vicodec_ctrl_stateless_state, NULL); 1606 1595 if (hdl->error) { 1607 1596 rc = hdl->error; 1608 1597 v4l2_ctrl_handler_free(hdl); ··· 1644 1629 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->stateful_enc.m2m_dev, 1645 1630 ctx, &queue_init); 1646 1631 ctx->lock = &dev->stateful_enc.lock; 1632 + } else if (ctx->is_stateless) { 1633 + ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->stateless_dec.m2m_dev, 1634 + ctx, &queue_init); 1635 + ctx->lock = &dev->stateless_dec.lock; 1647 1636 } else { 1648 1637 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->stateful_dec.m2m_dev, 1649 1638 ctx, &queue_init); ··· 1784 1765 "stateful-decoder", false)) 1785 1766 goto unreg_sf_enc; 1786 1767 1768 + if (register_instance(dev, &dev->stateless_dec, 1769 + "stateless-decoder", false)) 1770 + goto unreg_sf_dec; 1771 + 1787 1772 #ifdef CONFIG_MEDIA_CONTROLLER 1788 1773 ret = v4l2_m2m_register_media_controller(dev->stateful_enc.m2m_dev, 1789 1774 &dev->stateful_enc.vfd, ··· 1805 1782 goto unreg_m2m_sf_enc_mc; 1806 1783 } 1807 1784 1785 + ret = v4l2_m2m_register_media_controller(dev->stateless_dec.m2m_dev, 1786 + &dev->stateless_dec.vfd, 1787 + MEDIA_ENT_F_PROC_VIDEO_DECODER); 1788 + if (ret) { 1789 + v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller for stateless dec\n"); 1790 + goto unreg_m2m_sf_dec_mc; 1791 + } 1792 + 1808 1793 ret = media_device_register(&dev->mdev); 1809 1794 if (ret) { 1810 1795 v4l2_err(&dev->v4l2_dev, "Failed to register mem2mem media device\n"); 1811 - goto unreg_m2m_sf_dec_mc; 1796 + goto unreg_m2m_sl_dec_mc; 1812 1797 } 1813 1798 #endif 1814 1799 return 0; 1815 1800 1816 1801 #ifdef CONFIG_MEDIA_CONTROLLER 1802 + unreg_m2m_sl_dec_mc: 1803 + v4l2_m2m_unregister_media_controller(dev->stateless_dec.m2m_dev); 1817 1804 unreg_m2m_sf_dec_mc: 1818 1805 v4l2_m2m_unregister_media_controller(dev->stateful_dec.m2m_dev); 1819 1806 unreg_m2m_sf_enc_mc: 1820 1807 v4l2_m2m_unregister_media_controller(dev->stateful_enc.m2m_dev); 1821 1808 unreg_m2m: 1809 + video_unregister_device(&dev->stateless_dec.vfd); 1810 + v4l2_m2m_release(dev->stateless_dec.m2m_dev); 1811 + #endif 1812 + unreg_sf_dec: 1822 1813 video_unregister_device(&dev->stateful_dec.vfd); 1823 1814 v4l2_m2m_release(dev->stateful_dec.m2m_dev); 1824 - #endif 1825 1815 unreg_sf_enc: 1826 1816 video_unregister_device(&dev->stateful_enc.vfd); 1827 1817 v4l2_m2m_release(dev->stateful_enc.m2m_dev); ··· 1854 1818 media_device_unregister(&dev->mdev); 1855 1819 v4l2_m2m_unregister_media_controller(dev->stateful_enc.m2m_dev); 1856 1820 v4l2_m2m_unregister_media_controller(dev->stateful_dec.m2m_dev); 1821 + v4l2_m2m_unregister_media_controller(dev->stateless_dec.m2m_dev); 1857 1822 media_device_cleanup(&dev->mdev); 1858 1823 #endif 1859 1824 ··· 1862 1825 v4l2_m2m_release(dev->stateful_dec.m2m_dev); 1863 1826 video_unregister_device(&dev->stateful_enc.vfd); 1864 1827 video_unregister_device(&dev->stateful_dec.vfd); 1828 + video_unregister_device(&dev->stateless_dec.vfd); 1865 1829 v4l2_device_unregister(&dev->v4l2_dev); 1866 1830 1867 1831 return 0;