diff --git a/drivers/media/platform/rockchip/isp/capture_v1x.c b/drivers/media/platform/rockchip/isp/capture_v1x.c index 67fff9c34e60..2230bd24b5d8 100644 --- a/drivers/media/platform/rockchip/isp/capture_v1x.c +++ b/drivers/media/platform/rockchip/isp/capture_v1x.c @@ -607,7 +607,7 @@ static void rkisp_buf_queue(struct vb2_buffer *vb) memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); for (i = 0; i < isp_fmt->mplanes; i++) { vb2_plane_vaddr(vb, i); - if (stream->ispdev->hw_dev->is_mmu) { + if (stream->ispdev->hw_dev->is_dma_sg_ops) { sgt = vb2_dma_sg_plane_desc(vb, i); ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl); } else { diff --git a/drivers/media/platform/rockchip/isp/capture_v20.c b/drivers/media/platform/rockchip/isp/capture_v20.c index 16cfc6861e8b..5d3cc8c3b154 100644 --- a/drivers/media/platform/rockchip/isp/capture_v20.c +++ b/drivers/media/platform/rockchip/isp/capture_v20.c @@ -1671,7 +1671,7 @@ static void rkisp_buf_queue(struct vb2_buffer *vb) memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); for (i = 0; i < isp_fmt->mplanes; i++) { vb2_plane_vaddr(vb, i); - if (stream->ispdev->hw_dev->is_mmu) { + if (stream->ispdev->hw_dev->is_dma_sg_ops) { sgt = vb2_dma_sg_plane_desc(vb, i); ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl); } else { diff --git a/drivers/media/platform/rockchip/isp/capture_v21.c b/drivers/media/platform/rockchip/isp/capture_v21.c index e9d8a86c869f..06260f1641e3 100644 --- a/drivers/media/platform/rockchip/isp/capture_v21.c +++ b/drivers/media/platform/rockchip/isp/capture_v21.c @@ -970,7 +970,7 @@ static void rkisp_buf_queue(struct vb2_buffer *vb) memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); for (i = 0; i < isp_fmt->mplanes; i++) { vb2_plane_vaddr(vb, i); - if (stream->ispdev->hw_dev->is_mmu) { + if (stream->ispdev->hw_dev->is_dma_sg_ops) { sgt = vb2_dma_sg_plane_desc(vb, i); ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl); } else { diff --git a/drivers/media/platform/rockchip/isp/common.c b/drivers/media/platform/rockchip/isp/common.c index f4d641e8e79a..a890fb4480ef 100644 --- a/drivers/media/platform/rockchip/isp/common.c +++ b/drivers/media/platform/rockchip/isp/common.c @@ -94,7 +94,7 @@ int rkisp_alloc_buffer(struct rkisp_device *dev, } buf->mem_priv = mem_priv; - if (dev->hw_dev->is_mmu) { + if (dev->hw_dev->is_dma_sg_ops) { sg_tbl = (struct sg_table *)g_ops->cookie(mem_priv); buf->dma_addr = sg_dma_address(sg_tbl->sgl); } else { diff --git a/drivers/media/platform/rockchip/isp/dmarx.c b/drivers/media/platform/rockchip/isp/dmarx.c index fabdfb520196..c46007ac12f9 100644 --- a/drivers/media/platform/rockchip/isp/dmarx.c +++ b/drivers/media/platform/rockchip/isp/dmarx.c @@ -493,7 +493,7 @@ static void rkisp_buf_queue(struct vb2_buffer *vb) memset(ispbuf->buff_addr, 0, sizeof(ispbuf->buff_addr)); for (i = 0; i < isp_fmt->mplanes; i++) { - if (stream->ispdev->hw_dev->is_mmu) { + if (stream->ispdev->hw_dev->is_dma_sg_ops) { sgt = vb2_dma_sg_plane_desc(vb, i); ispbuf->buff_addr[i] = sg_dma_address(sgt->sgl); } else { diff --git a/drivers/media/platform/rockchip/isp/hw.c b/drivers/media/platform/rockchip/isp/hw.c index 8bc2c0662044..626d20204b62 100644 --- a/drivers/media/platform/rockchip/isp/hw.c +++ b/drivers/media/platform/rockchip/isp/hw.c @@ -647,6 +647,7 @@ static int rkisp_hw_probe(struct platform_device *pdev) struct rkisp_hw_dev *hw_dev; struct resource *res; int i, ret; + bool is_mem_reserved = true; match = of_match_node(rkisp_hw_of_match, node); if (IS_ERR(match)) @@ -737,22 +738,29 @@ static int rkisp_hw_probe(struct platform_device *pdev) hw_dev->is_single = true; hw_dev->is_mi_update = false; hw_dev->is_dma_contig = true; + hw_dev->is_dma_sg_ops = false; hw_dev->is_buf_init = false; hw_dev->is_shutdown = false; hw_dev->is_mmu = is_iommu_enable(dev); ret = of_reserved_mem_device_init(dev); if (ret) { + is_mem_reserved = false; + if (!hw_dev->is_mmu) - dev_warn(dev, "No reserved memory region. default cma area!\n"); + dev_info(dev, "No reserved memory region. default cma area!\n"); else hw_dev->is_dma_contig = false; } - if (!hw_dev->is_mmu) - hw_dev->mem_ops = &vb2_dma_contig_memops; - else if (!hw_dev->is_dma_contig) - hw_dev->mem_ops = &vb2_dma_sg_memops; - else + if (is_mem_reserved) { + /* reserved memory using rdma_sg */ hw_dev->mem_ops = &vb2_rdma_sg_memops; + hw_dev->is_dma_sg_ops = true; + } else if (hw_dev->is_mmu) { + hw_dev->mem_ops = &vb2_dma_sg_memops; + hw_dev->is_dma_sg_ops = true; + } else { + hw_dev->mem_ops = &vb2_dma_contig_memops; + } pm_runtime_enable(dev); diff --git a/drivers/media/platform/rockchip/isp/hw.h b/drivers/media/platform/rockchip/isp/hw.h index 80ed119081db..8b34e203bd6a 100644 --- a/drivers/media/platform/rockchip/isp/hw.h +++ b/drivers/media/platform/rockchip/isp/hw.h @@ -71,6 +71,7 @@ struct rkisp_hw_dev { int buf_init_cnt; bool is_feature_on; bool is_dma_contig; + bool is_dma_sg_ops; bool is_mmu; bool is_idle; bool is_single;