Hi Hans, Thanks for your suggestion. I will fix below check fails in patch v11. Best Regards, Yunfei Dong On Fri, 2022-04-29 at 11:44 +0200, Hans Verkuil wrote: > Hi Yunfei, > > On 26/04/2022 12:08, Yunfei Dong wrote: > > This series adds support for mt8192 h264/vp8/vp9 decoder drivers. > > Firstly, refactor > > power/clock/interrupt interfaces for mt8192 is lat and core > > architecture. > > > > Secondly, add new functions to get frame buffer size and resolution > > according > > to decoder capability from scp side. Then add callback function to > > get/put > > capture buffer in order to enable lat and core decoder in parallel, > > need to > > adjust GStreamer at the same time. > > > > Then add to support MT21C compressed mode and fix v4l2-compliance > > fail. > > > > Next, extract H264 request api driver to let mt8183 and mt8192 use > > the same > > code, and adds mt8192 frame based h264 driver for stateless > > decoder. > > > > Lastly, add vp8 and vp9 stateless decoder drivers. > > > > Patches 1 refactor power/clock/interrupt interface. > > Patches 2~4 get frame buffer size and resolution according to > > decoder capability. > > Patches 5 set capture queue bytesused. > > Patches 6 adjust GStreamer. > > Patch 7~11 add to support MT21C compressed mode and fix v4l2- > > compliance fail. > > patch 12 record capture queue format type. > > Patch 13~14 extract h264 driver and add mt8192 frame based driver > > for h264 decoder. > > Patch 15~16 add vp8 and vp9 stateless decoder drivers. > > Patch 17 prevent kernel crash when rmmod mtk-vcodec-dec.ko > > I'm getting loads of sparse and smatch warnings/errors: > > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_common. > c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_common. > c:20:28: warning: incorrect type in argument 1 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_common. > c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_common. > c:176:21: warning: incorrect type in argument 1 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_common. > c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_common. > c:179:21: warning: incorrect type in argument 1 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c:463:26: warning: incorrect type in argument 1 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c:647:60: warning: incorrect type in argument 2 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c:723:30: warning: incorrect type in argument 1 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c:740:48: warning: incorrect type in argument 2 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :1995:44: warning: incorrect type in argument 2 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :532:34: warning: incorrect type in argument 2 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :673:40: warning: incorrect type in argument 2 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :674:48: warning: incorrect type in argument 2 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :675:45: warning: incorrect type in argument 2 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :678:37: warning: incorrect type in argument 2 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :684:21: warning: incorrect type in argument 1 (different address > spaces) > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :1912:45: warning: Using plain integer as NULL pointer > SPARSE:/home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :1924:44: warning: incorrect type in argument 2 (different address > spaces) > > > smatch: ERRORS > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > : > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :1192 vdec_vp9_slice_map_counts_eob_coef() error: buffer overflow > 'counts->coef_probs[i][j][k]->band_0' > 3 <= 5 > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > : > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :1194 vdec_vp9_slice_map_counts_eob_coef() error: buffer overflow > 'counts->eob_branch[i][j][k]->band_0' > 3 <= 5 > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > : > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :1196 vdec_vp9_slice_map_counts_eob_coef() error: buffer overflow > 'counts->coef_probs[i][j][k]->band_0' > 3 <= 5 > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > : > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > :2018 vdec_vp9_slice_core_decode() error: we previously assumed 'pfc' > could be null (see line 1963) > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c: > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c:700 vdec_h264_slice_single_decode() warn: unsigned > 'nal_start_idx' is never less than zero. > > And also one compile warning when compiling on a 32 bit platform > (i.e. arm or i686): > > In file included from /home/hans/work/build/media- > git/include/linux/kernel.h:29, > from /home/hans/work/build/media- > git/include/linux/cpumask.h:10, > from /home/hans/work/build/media- > git/include/linux/mm_types_task.h:14, > from /home/hans/work/build/media- > git/include/linux/mm_types.h:5, > from /home/hans/work/build/media- > git/include/linux/buildid.h:5, > from /home/hans/work/build/media- > git/include/linux/module.h:14, > from /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c:7: > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c: In function 'vdec_h264_slice_single_decode': > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c:684:76: warning: cast from pointer to integer of different size > [-Wpointer-to-int-cast] > 684 | inst->ctx->decoded_frame_cnt, > y_fb_dma, c_fb_dma, (u64)fb); > | > ^ > /home/hans/work/build/media-git/include/linux/printk.h:418:33: note: > in definition of macro 'printk_index_wrap' > 418 | _p_func(_fmt, > ##__VA_ARGS__); \ > | ^~~~~~~~~~~ > /home/hans/work/build/media-git/include/linux/printk.h:132:17: note: > in expansion of macro 'printk' > 132 | printk(fmt, ##__VA_ARGS__); \ > | ^~~~~~ > /home/hans/work/build/media-git/include/linux/printk.h:576:9: note: > in expansion of macro 'no_printk' > 576 | no_printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__) > | ^~~~~~~~~ > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/../mtk_vcodec_util.h: > 45:9: note: in expansion of macro 'pr_debug' > 45 | pr_debug("[MTK_VCODEC][%d]: " fmt > "\n", \ > | ^~~~~~~~ > /home/hans/work/build/media- > git/drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_i > f.c:683:9: note: in expansion of macro 'mtk_vcodec_debug' > 683 | mtk_vcodec_debug(inst, "+ [%d] FB y_dma=%llx > c_dma=%llx va=0x%llx", > | ^~~~~~~~~~~~~~~~ > > Regards, > > Hans > > > --- > > changes compared with v9: > > - fix kernel robot build fail for patch 16 > > changes compared with v8: > > - fix vp9 build error > > - fix kernel-doc fail > > changes compared with v7: > > - adjust GStreamer, separate src buffer done with > > v4l2_ctrl_request_complete for patch 6. > > - remove v4l2_m2m_set_dst_buffered. > > - add new patch to set each plane bytesused in buf prepare for > > patch 5. > > - using upstream interface to update vp9 prob tables for patch 16. > > - fix maintainer comments. > > - test the driver with chrome VD and GStreamer(H264/VP9/VP8/AV1). > > changes compared with v6: > > - rebase to the latest media stage and fix conficts > > - fix memcpy to memcpy_fromio or memcpy_toio > > - fix h264 crash when test field bitstream > > changes compared with v5: > > - fix vp9 comments for patch 15 > > - fix vp8 comments for patch 14. > > - fix comments for patch 12. > > - fix build errors. > > changes compared with v4: > > - fix checkpatch.pl fail. > > - fix kernel-doc fail. > > - rebase to the latest media codec driver. > > changes compared with v3: > > - remove enum mtk_chip for patch 2. > > - add vp8 stateless decoder drivers for patch 14. > > - add vp9 stateless decoder drivers for patch 15. > > changes compared with v2: > > - add new patch 11 to record capture queue format type. > > - separate patch 4 according to tzung-bi's suggestion. > > - re-write commit message for patch 5 according to tzung-bi's > > suggestion. > > changes compared with v1: > > - rewrite commit message for patch 12. > > - rewrite cover-letter message. > > --- > > Yunfei Dong (17): > > media: mediatek: vcodec: Add vdec enable/disable hardware helpers > > media: mediatek: vcodec: Using firmware type to separate > > different > > firmware architecture > > media: mediatek: vcodec: get capture queue buffer size from scp > > media: mediatek: vcodec: Read max resolution from dec_capability > > media: mediatek: vcodec: set each plane bytesused in buf prepare > > media: mediatek: vcodec: Refactor get and put capture buffer flow > > media: mediatek: vcodec: Refactor supported vdec formats and > > framesizes > > media: mediatek: vcodec: Getting supported decoder format types > > media: mediatek: vcodec: Add format to support MT21C > > media: mediatek: vcodec: disable vp8 4K capability > > media: mediatek: vcodec: Fix v4l2-compliance fail > > media: mediatek: vcodec: record capture queue format type > > media: mediatek: vcodec: Extract H264 common code > > media: mediatek: vcodec: support stateless H.264 decoding for > > mt8192 > > media: mediatek: vcodec: support stateless VP8 decoding > > media: mediatek: vcodec: support stateless VP9 decoding > > media: mediatek: vcodec: prevent kernel crash when rmmod > > mtk-vcodec-dec.ko > > > > .../media/platform/mediatek/vcodec/Makefile | 4 + > > .../platform/mediatek/vcodec/mtk_vcodec_dec.c | 62 +- > > .../mediatek/vcodec/mtk_vcodec_dec_drv.c | 8 +- > > .../mediatek/vcodec/mtk_vcodec_dec_pm.c | 166 +- > > .../mediatek/vcodec/mtk_vcodec_dec_pm.h | 6 +- > > .../mediatek/vcodec/mtk_vcodec_dec_stateful.c | 19 +- > > .../vcodec/mtk_vcodec_dec_stateless.c | 257 ++- > > .../platform/mediatek/vcodec/mtk_vcodec_drv.h | 41 +- > > .../mediatek/vcodec/mtk_vcodec_enc_drv.c | 5 - > > .../platform/mediatek/vcodec/mtk_vcodec_fw.c | 6 + > > .../platform/mediatek/vcodec/mtk_vcodec_fw.h | 1 + > > .../vcodec/vdec/vdec_h264_req_common.c | 310 +++ > > .../vcodec/vdec/vdec_h264_req_common.h | 274 +++ > > .../mediatek/vcodec/vdec/vdec_h264_req_if.c | 438 +--- > > .../vcodec/vdec/vdec_h264_req_multi_if.c | 626 +++++ > > .../mediatek/vcodec/vdec/vdec_vp8_req_if.c | 437 ++++ > > .../vcodec/vdec/vdec_vp9_req_lat_if.c | 2031 > > +++++++++++++++++ > > .../platform/mediatek/vcodec/vdec_drv_if.c | 37 +- > > .../platform/mediatek/vcodec/vdec_drv_if.h | 3 + > > .../platform/mediatek/vcodec/vdec_ipi_msg.h | 36 + > > .../platform/mediatek/vcodec/vdec_msg_queue.c | 2 + > > .../platform/mediatek/vcodec/vdec_msg_queue.h | 2 + > > .../platform/mediatek/vcodec/vdec_vpu_if.c | 53 +- > > .../platform/mediatek/vcodec/vdec_vpu_if.h | 15 + > > .../platform/mediatek/vcodec/venc_vpu_if.c | 2 +- > > include/linux/remoteproc/mtk_scp.h | 2 + > > 26 files changed, 4242 insertions(+), 601 deletions(-) > > create mode 100644 > > drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_common.c > > create mode 100644 > > drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_common.h > > create mode 100644 > > drivers/media/platform/mediatek/vcodec/vdec/vdec_h264_req_multi_if. > > c > > create mode 100644 > > drivers/media/platform/mediatek/vcodec/vdec/vdec_vp8_req_if.c > > create mode 100644 > > drivers/media/platform/mediatek/vcodec/vdec/vdec_vp9_req_lat_if.c > > > >