From 2679d1c2f5fa014f6eed93aa39b03e0372ad913b Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Thu, 17 Dec 2020 17:09:10 +0800 Subject: [PATCH] media: rockchip: cif: vb2 dma sg for iommu enable Change-Id: I06049142d51f4137683a6e871d42cf1b0e3c3fc5 Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/cif/Kconfig | 1 + drivers/media/platform/rockchip/cif/capture.c | 14 ++++++++++++-- drivers/media/platform/rockchip/cif/dev.c | 5 ++--- drivers/media/platform/rockchip/cif/dev.h | 2 ++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/drivers/media/platform/rockchip/cif/Kconfig b/drivers/media/platform/rockchip/cif/Kconfig index 9a535b65da69..4f2644d603bd 100644 --- a/drivers/media/platform/rockchip/cif/Kconfig +++ b/drivers/media/platform/rockchip/cif/Kconfig @@ -5,6 +5,7 @@ config VIDEO_ROCKCHIP_CIF depends on ARCH_ROCKCHIP || COMPILE_TEST depends on MEDIA_CAMERA_SUPPORT select VIDEOBUF2_DMA_CONTIG + select VIDEOBUF2_DMA_SG select V4L2_FWNODE select PHY_ROCKCHIP_MIPI_RX default n diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 2fd1dcd05270..e86893a0f2f9 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include @@ -1624,7 +1625,13 @@ static void rkcif_buf_queue(struct vb2_buffer *vb) for (i = 0; i < fmt->mplanes; i++) { void *addr = vb2_plane_vaddr(vb, i); - cifbuf->buff_addr[i] = vb2_dma_contig_plane_dma_addr(vb, i); + if (stream->cifdev->iommu_en) { + struct sg_table *sgt = vb2_dma_sg_plane_desc(vb, i); + + cifbuf->buff_addr[i] = sg_dma_address(sgt->sgl); + } else { + cifbuf->buff_addr[i] = vb2_dma_contig_plane_dma_addr(vb, i); + } if (rkcif_debug && addr && !stream->cifdev->hw_dev->iommu_en) { memset(addr, 0, pixm->plane_fmt[i].sizeimage); v4l2_dbg(1, rkcif_debug, &stream->cifdev->v4l2_dev, @@ -2407,7 +2414,10 @@ static int rkcif_init_vb2_queue(struct vb2_queue *q, q->io_modes = VB2_MMAP | VB2_DMABUF; q->drv_priv = stream; q->ops = &rkcif_vb2_ops; - q->mem_ops = &vb2_dma_contig_memops; + if (stream->cifdev->iommu_en) + q->mem_ops = &vb2_dma_sg_memops; + else + q->mem_ops = &vb2_dma_contig_memops; q->buf_struct_size = sizeof(struct rkcif_buffer); q->min_buffers_needed = CIF_REQ_BUFS_MIN; q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC; diff --git a/drivers/media/platform/rockchip/cif/dev.c b/drivers/media/platform/rockchip/cif/dev.c index ae1203591544..d764d77b6d75 100644 --- a/drivers/media/platform/rockchip/cif/dev.c +++ b/drivers/media/platform/rockchip/cif/dev.c @@ -941,7 +941,6 @@ static int rkcif_plat_probe(struct platform_device *pdev) struct device *dev = &pdev->dev; struct rkcif_device *cif_dev; const struct rkcif_match_data *data; - bool iommu_en; int ret; sprintf(rkcif_version, "v%02x.%02x.%02x", @@ -968,8 +967,8 @@ static int rkcif_plat_probe(struct platform_device *pdev) rkcif_attach_hw(cif_dev); - iommu_en = is_iommu_enable(dev); - if (!iommu_en) { + cif_dev->iommu_en = is_iommu_enable(dev); + if (!cif_dev->iommu_en) { ret = of_reserved_mem_device_init(dev); if (ret) dev_info(dev, "No reserved memory region assign to CIF\n"); diff --git a/drivers/media/platform/rockchip/cif/dev.h b/drivers/media/platform/rockchip/cif/dev.h index 06cd6b2871e7..0cf2ab5362df 100644 --- a/drivers/media/platform/rockchip/cif/dev.h +++ b/drivers/media/platform/rockchip/cif/dev.h @@ -472,6 +472,8 @@ struct rkcif_device { struct rkcif_work_struct reset_work; struct rkcif_timer reset_watchdog_timer; unsigned int buf_wake_up_cnt; + + bool iommu_en; }; extern struct platform_driver rkcif_plat_drv;