media: rockchip: cif: vb2 dma sg for iommu enable

Change-Id: I06049142d51f4137683a6e871d42cf1b0e3c3fc5
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2020-12-17 17:09:10 +08:00
committed by Tao Huang
parent 0d8540d244
commit 2679d1c2f5
4 changed files with 17 additions and 5 deletions

View File

@@ -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

View File

@@ -15,6 +15,7 @@
#include <media/v4l2-ioctl.h>
#include <media/v4l2-subdev.h>
#include <media/videobuf2-dma-contig.h>
#include <media/videobuf2-dma-sg.h>
#include <soc/rockchip/rockchip-system-status.h>
#include <dt-bindings/soc/rockchip-system-status.h>
@@ -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;

View File

@@ -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");

View File

@@ -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;