media: rockchip: isp/ispp add dma contiguous attrs

if device add reserved memory area and enable iommu,
pages can alloc from contiguous memory region, this
need DMA_ATTR_FORCE_CONTIGUOUS attrs.

Change-Id: I12e00467a1f7e4c6661397663835c328351715b9
Signed-off-by: Cai YiWei <cyw@rock-chips.com>
This commit is contained in:
Cai YiWei
2021-01-06 18:10:53 +08:00
committed by Tao Huang
parent 46e7d9882b
commit 505e09028a
11 changed files with 37 additions and 18 deletions

View File

@@ -860,7 +860,8 @@ static int rkisp_init_vb2_queue(struct vb2_queue *q,
q->lock = &stream->ispdev->apilock;
q->dev = stream->ispdev->hw_dev->dev;
q->allow_cache_hints = 1;
if (stream->ispdev->hw_dev->is_dma_contig)
q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
return vb2_queue_init(q);
}

View File

@@ -1907,7 +1907,8 @@ static int rkisp_init_vb2_queue(struct vb2_queue *q,
q->dev = stream->ispdev->hw_dev->dev;
q->allow_cache_hints = 1;
q->bidirectional = 1;
if (stream->ispdev->hw_dev->is_dma_contig)
q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
return vb2_queue_init(q);
}

View File

@@ -1254,7 +1254,8 @@ static int rkisp_init_vb2_queue(struct vb2_queue *q,
q->dev = stream->ispdev->hw_dev->dev;
q->allow_cache_hints = 1;
q->bidirectional = 1;
if (stream->ispdev->hw_dev->is_dma_contig)
q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
return vb2_queue_init(q);
}

View File

@@ -78,6 +78,8 @@ int rkisp_alloc_buffer(struct rkisp_device *dev,
goto err;
}
if (dev->hw_dev->is_dma_contig)
attrs |= DMA_ATTR_FORCE_CONTIGUOUS;
buf->size = PAGE_ALIGN(buf->size);
mem_priv = g_ops->alloc(dev->hw_dev->dev, attrs, buf->size,
DMA_BIDIRECTIONAL, GFP_KERNEL);
@@ -93,7 +95,7 @@ int rkisp_alloc_buffer(struct rkisp_device *dev,
} else {
buf->dma_addr = *((dma_addr_t *)g_ops->cookie(mem_priv));
}
if (!attrs)
if (buf->is_need_vaddr)
buf->vaddr = g_ops->vaddr(mem_priv);
if (buf->is_need_dbuf) {
buf->dbuf = g_ops->get_dmabuf(mem_priv, O_RDWR);

View File

@@ -709,14 +709,18 @@ static int rkisp_hw_probe(struct platform_device *pdev)
hw_dev->is_idle = true;
hw_dev->is_single = true;
hw_dev->is_mi_update = false;
hw_dev->is_dma_contig = true;
hw_dev->is_mmu = is_iommu_enable(dev);
if (!hw_dev->is_mmu) {
if (!hw_dev->is_mmu)
hw_dev->mem_ops = &vb2_dma_contig_memops;
ret = of_reserved_mem_device_init(dev);
if (ret)
dev_err(dev, "No reserved memory region\n");
} else {
else
hw_dev->mem_ops = &vb2_dma_sg_memops;
ret = of_reserved_mem_device_init(dev);
if (ret) {
if (!hw_dev->is_mmu)
dev_warn(dev, "No reserved memory region. default cma area!\n");
else
hw_dev->is_dma_contig = false;
}
pm_runtime_enable(dev);

View File

@@ -54,7 +54,7 @@ struct rkisp_hw_dev {
struct list_head list;
struct rkisp_dummy_buffer dummy_buf;
const struct vb2_mem_ops *mem_ops;
bool is_dma_contig;
bool is_mmu;
bool is_idle;
bool is_single;

View File

@@ -76,6 +76,8 @@ int rkispp_allow_buffer(struct rkispp_device *dev,
goto err;
}
if (dev->hw_dev->is_dma_contig)
attrs |= DMA_ATTR_FORCE_CONTIGUOUS;
buf->size = PAGE_ALIGN(buf->size);
mem_priv = g_ops->alloc(dev->hw_dev->dev, attrs, buf->size,
DMA_BIDIRECTIONAL, GFP_KERNEL);
@@ -91,7 +93,7 @@ int rkispp_allow_buffer(struct rkispp_device *dev,
} else {
buf->dma_addr = *((dma_addr_t *)g_ops->cookie(mem_priv));
}
if (!attrs)
if (buf->is_need_vaddr)
buf->vaddr = g_ops->vaddr(mem_priv);
if (buf->is_need_dbuf) {
buf->dbuf = g_ops->get_dmabuf(mem_priv, O_RDWR);

View File

@@ -286,14 +286,18 @@ static int rkispp_hw_probe(struct platform_device *pdev)
hw_dev->is_idle = true;
hw_dev->is_single = true;
hw_dev->is_fec_ext = false;
hw_dev->is_dma_contig = true;
hw_dev->is_mmu = is_iommu_enable(dev);
if (!hw_dev->is_mmu) {
if (!hw_dev->is_mmu)
hw_dev->mem_ops = &vb2_dma_contig_memops;
ret = of_reserved_mem_device_init(dev);
if (ret)
dev_warn(dev, "No reserved memory region assign to ispp\n");
} else {
else
hw_dev->mem_ops = &vb2_dma_sg_memops;
ret = of_reserved_mem_device_init(dev);
if (ret) {
if (!hw_dev->is_mmu)
dev_warn(dev, "No reserved memory region. default cma area!\n");
else
hw_dev->is_dma_contig = false;
}
rkispp_register_fec(hw_dev);

View File

@@ -49,10 +49,11 @@ struct rkispp_hw_dev {
spinlock_t buf_lock;
atomic_t refcnt;
const struct vb2_mem_ops *mem_ops;
struct rkisp_ispp_reg *reg_buf;
bool is_mmu;
bool is_idle;
bool is_single;
bool is_fec_ext;
struct rkisp_ispp_reg *reg_buf;
bool is_dma_contig;
};
#endif

View File

@@ -305,6 +305,8 @@ static int rkispp_stats_init_vb2_queue(struct vb2_queue *q,
q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
q->lock = &stats_vdev->dev->iqlock;
q->dev = stats_vdev->dev->hw_dev->dev;
if (stats_vdev->dev->hw_dev->is_dma_contig)
q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
return vb2_queue_init(q);
}

View File

@@ -1790,7 +1790,8 @@ static int rkispp_init_vb2_queue(struct vb2_queue *q,
q->lock = &stream->isppdev->apilock;
q->dev = stream->isppdev->hw_dev->dev;
q->allow_cache_hints = 1;
if (stream->isppdev->hw_dev->is_dma_contig)
q->dma_attrs = DMA_ATTR_FORCE_CONTIGUOUS;
return vb2_queue_init(q);
}