mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user