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

media: mtk-vcodec: Remove VA from encoder frame buffers

The encoder driver has no need to do any CPU access to the source frame
buffers. Use a separate structure for holding DMA addresses and sizes
for those and remove, so we do not end up introducing any erroneous
dereferences of those VAs.

This fixes DMA-buf import from exporters that do not provide contiguous
kernel mappings, which includes the MTK DRM driver.

Signed-off-by: Tomasz Figa <tfiga@chromium.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>

authored by

Tomasz Figa and committed by
Mauro Carvalho Chehab
8b8130f0 25f5c34b

+7 -6
+1 -5
drivers/media/platform/mtk-vcodec/mtk_vcodec_enc.c
··· 1087 1087 src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx); 1088 1088 memset(&frm_buf, 0, sizeof(frm_buf)); 1089 1089 for (i = 0; i < src_buf->num_planes ; i++) { 1090 - frm_buf.fb_addr[i].va = vb2_plane_vaddr(src_buf, i); 1091 1090 frm_buf.fb_addr[i].dma_addr = 1092 1091 vb2_dma_contig_plane_dma_addr(src_buf, i); 1093 1092 frm_buf.fb_addr[i].size = ··· 1097 1098 bs_buf.size = (size_t)dst_buf->planes[0].length; 1098 1099 1099 1100 mtk_v4l2_debug(2, 1100 - "Framebuf VA=%p PA=%llx Size=0x%zx;VA=%p PA=0x%llx Size=0x%zx;VA=%p PA=0x%llx Size=%zu", 1101 - frm_buf.fb_addr[0].va, 1101 + "Framebuf PA=%llx Size=0x%zx;PA=0x%llx Size=0x%zx;PA=0x%llx Size=%zu", 1102 1102 (u64)frm_buf.fb_addr[0].dma_addr, 1103 1103 frm_buf.fb_addr[0].size, 1104 - frm_buf.fb_addr[1].va, 1105 1104 (u64)frm_buf.fb_addr[1].dma_addr, 1106 1105 frm_buf.fb_addr[1].size, 1107 - frm_buf.fb_addr[2].va, 1108 1106 (u64)frm_buf.fb_addr[2].dma_addr, 1109 1107 frm_buf.fb_addr[2].size); 1110 1108
+5
drivers/media/platform/mtk-vcodec/mtk_vcodec_util.h
··· 25 25 dma_addr_t dma_addr; 26 26 }; 27 27 28 + struct mtk_vcodec_fb { 29 + size_t size; 30 + dma_addr_t dma_addr; 31 + }; 32 + 28 33 struct mtk_vcodec_ctx; 29 34 struct mtk_vcodec_dev; 30 35
+1 -1
drivers/media/platform/mtk-vcodec/venc_drv_if.h
··· 106 106 * @fb_addr: plane frame buffer addresses 107 107 */ 108 108 struct venc_frm_buf { 109 - struct mtk_vcodec_mem fb_addr[MTK_VCODEC_MAX_PLANES]; 109 + struct mtk_vcodec_fb fb_addr[MTK_VCODEC_MAX_PLANES]; 110 110 }; 111 111 112 112 /*