mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user