diff --git a/drivers/media/platform/rockchip/isp/capture_v1x.c b/drivers/media/platform/rockchip/isp/capture_v1x.c index 3da62b03e318..c7550cacac10 100644 --- a/drivers/media/platform/rockchip/isp/capture_v1x.c +++ b/drivers/media/platform/rockchip/isp/capture_v1x.c @@ -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); } diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c index eb9d4e282cd6..1b6f075556b7 100644 --- a/drivers/media/platform/rockchip/isp/capture_v20.c +++ b/drivers/media/platform/rockchip/isp/capture_v20.c @@ -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); } diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c index 9e2f34990dbb..c1b2f548c4ec 100644 --- a/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/drivers/media/platform/rockchip/isp/capture_v21.c @@ -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); } diff --git a/drivers/media/platform/rockchip/isp/common.c b/drivers/media/platform/rockchip/isp/common.c index d20dc7694bda..d780b4716dc5 100644 --- a/drivers/media/platform/rockchip/isp/common.c +++ b/drivers/media/platform/rockchip/isp/common.c @@ -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); diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index 339f98ba32d6..548e49703a8e 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -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); diff --git a/drivers/media/platform/rockchip/isp/hw.h b/drivers/media/platform/rockchip/isp/hw.h index 212512a27187..233da2ef002b 100644 --- a/drivers/media/platform/rockchip/isp/hw.h +++ b/drivers/media/platform/rockchip/isp/hw.h @@ -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; diff --git a/drivers/media/platform/rockchip/ispp/common.c b/drivers/media/platform/rockchip/ispp/common.c index 305f4c00bd3c..1e54f0c8ec10 100644 --- a/drivers/media/platform/rockchip/ispp/common.c +++ b/drivers/media/platform/rockchip/ispp/common.c @@ -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); diff --git a/drivers/media/platform/rockchip/ispp/hw.c b/drivers/media/platform/rockchip/ispp/hw.c index e1e01cee0f8d..a71765d391c9 100644 --- a/drivers/media/platform/rockchip/ispp/hw.c +++ b/drivers/media/platform/rockchip/ispp/hw.c @@ -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); diff --git a/drivers/media/platform/rockchip/ispp/hw.h b/drivers/media/platform/rockchip/ispp/hw.h index 16b555d1c3bd..ffc22f2e194a 100644 --- a/drivers/media/platform/rockchip/ispp/hw.h +++ b/drivers/media/platform/rockchip/ispp/hw.h @@ -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 diff --git a/drivers/media/platform/rockchip/ispp/stats.c b/drivers/media/platform/rockchip/ispp/stats.c index 6dff60f5cdf7..9b11fdb332dc 100644 --- a/drivers/media/platform/rockchip/ispp/stats.c +++ b/drivers/media/platform/rockchip/ispp/stats.c @@ -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); } diff --git a/drivers/media/platform/rockchip/ispp/stream.c b/drivers/media/platform/rockchip/ispp/stream.c index 704e846c0a03..008d9f37f87c 100644 --- a/drivers/media/platform/rockchip/ispp/stream.c +++ b/drivers/media/platform/rockchip/ispp/stream.c @@ -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); }