From 44e65c2c29accde8968869d86c29bc361cf8023c Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Wed, 29 May 2024 16:34:51 +0800 Subject: [PATCH] video: rockchip: rga3: add dma_addr in struct rga_dma_buffer Signed-off-by: Yu Qiaowei Change-Id: I5c1208032c957920b51ee6a489a257947b5dc55b --- drivers/video/rockchip/rga3/include/rga_drv.h | 3 +- drivers/video/rockchip/rga3/rga_dma_buf.c | 4 +-- drivers/video/rockchip/rga3/rga_mm.c | 29 ++++++++++++++++--- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga_drv.h b/drivers/video/rockchip/rga3/include/rga_drv.h index 890563febf4d..22ddef42477a 100644 --- a/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/drivers/video/rockchip/rga3/include/rga_drv.h @@ -165,13 +165,14 @@ struct rga_dma_buffer { struct dma_buf *dma_buf; struct dma_buf_attachment *attach; struct sg_table *sgt; - void *vmap_ptr; + void *vaddr; struct iommu_domain *domain; enum dma_data_direction dir; dma_addr_t iova; + dma_addr_t dma_addr; unsigned long size; /* * The offset of the first page of the sgt. diff --git a/drivers/video/rockchip/rga3/rga_dma_buf.c b/drivers/video/rockchip/rga3/rga_dma_buf.c index 5a37c3a61e75..75699232b73d 100644 --- a/drivers/video/rockchip/rga3/rga_dma_buf.c +++ b/drivers/video/rockchip/rga3/rga_dma_buf.c @@ -458,7 +458,7 @@ int rga_dma_map_buf(struct dma_buf *dma_buf, struct rga_dma_buffer *rga_dma_buff rga_dma_buffer->dma_buf = dma_buf; rga_dma_buffer->attach = attach; rga_dma_buffer->sgt = sgt; - rga_dma_buffer->iova = sg_dma_address(sgt->sgl); + rga_dma_buffer->dma_addr = sg_dma_address(sgt->sgl); rga_dma_buffer->dir = dir; rga_dma_buffer->size = 0; for_each_sgtable_sg(sgt, sg, i) @@ -509,7 +509,7 @@ int rga_dma_map_fd(int fd, struct rga_dma_buffer *rga_dma_buffer, rga_dma_buffer->dma_buf = dma_buf; rga_dma_buffer->attach = attach; rga_dma_buffer->sgt = sgt; - rga_dma_buffer->iova = sg_dma_address(sgt->sgl); + rga_dma_buffer->dma_addr = sg_dma_address(sgt->sgl); rga_dma_buffer->dir = dir; rga_dma_buffer->size = 0; for_each_sgtable_sg(sgt, sg, i) diff --git a/drivers/video/rockchip/rga3/rga_mm.c b/drivers/video/rockchip/rga3/rga_mm.c index de7e9a6fd7fa..5acfe65517b7 100644 --- a/drivers/video/rockchip/rga3/rga_mm.c +++ b/drivers/video/rockchip/rga3/rga_mm.c @@ -444,6 +444,9 @@ static int rga_mm_map_dma_buffer(struct rga_external_buffer *external_buffer, buffer->scheduler = scheduler; + if (scheduler->data->mmu == RGA_IOMMU) + buffer->iova = buffer->dma_addr; + if (rga_mm_check_range_sgt(buffer->sgt)) mm_flag |= RGA_MEM_UNDER_4G; @@ -608,6 +611,9 @@ static int rga_mm_map_virt_addr(struct rga_external_buffer *external_buffer, __func__, scheduler->core); goto free_dma_buffer; } + + buffer->dma_addr = buffer->iova; + break; case RGA_MMU: ret = dma_map_sg(scheduler->dev, sgt->sgl, sgt->orig_nents, DMA_BIDIRECTIONAL); @@ -978,9 +984,12 @@ void rga_mm_dump_buffer(struct rga_internal_buffer *dump_buffer) break; pr_info("dma_buffer:\n"); - pr_info("dma_buf = %p, iova = 0x%lx, sgt = %p, size = %ld, map_core = 0x%x\n", - dump_buffer->dma_buffer->dma_buf, + pr_info("dma_buf = %p\n", + dump_buffer->dma_buffer->dma_buf); + pr_info("iova = 0x%lx, dma_addr = 0x%lx, offset = 0x%lx, sgt = %p, size = %ld, map_core = 0x%x\n", (unsigned long)dump_buffer->dma_buffer->iova, + (unsigned long)dump_buffer->dma_buffer->dma_addr, + (unsigned long)dump_buffer->dma_buffer->offset, dump_buffer->dma_buffer->sgt, dump_buffer->dma_buffer->size, dump_buffer->dma_buffer->scheduler->core); @@ -1002,8 +1011,9 @@ void rga_mm_dump_buffer(struct rga_internal_buffer *dump_buffer) if (rga_mm_is_invalid_dma_buffer(dump_buffer->dma_buffer)) break; - pr_info("iova = 0x%lx, offset = 0x%lx, sgt = %p, size = %ld, map_core = 0x%x\n", + pr_info("iova = 0x%lx, dma_addr = 0x%lx, offset = 0x%lx, sgt = %p, size = %ld, map_core = 0x%x\n", (unsigned long)dump_buffer->dma_buffer->iova, + (unsigned long)dump_buffer->dma_buffer->dma_addr, (unsigned long)dump_buffer->dma_buffer->offset, dump_buffer->dma_buffer->sgt, dump_buffer->dma_buffer->size, @@ -1014,7 +1024,8 @@ void rga_mm_dump_buffer(struct rga_internal_buffer *dump_buffer) (unsigned long)dump_buffer->phys_addr); break; case RGA_PHYSICAL_ADDRESS: - pr_info("physical address: pa = 0x%lx\n", (unsigned long)dump_buffer->phys_addr); + pr_info("physical address:\n"); + pr_info("pa = 0x%lx\n", (unsigned long)dump_buffer->phys_addr); break; default: pr_err("Illegal external buffer!\n"); @@ -1851,6 +1862,11 @@ static void rga_mm_unmap_channel_job_buffer(struct rga_job *job, if (rga_mm_sync_dma_sg_for_cpu(job_buffer->addr, job, dir)) pr_err("sync sgt for cpu error!\n"); + if (DEBUGGER_EN(MM)) { + pr_info("unmap buffer:\n"); + rga_mm_dump_buffer(job_buffer->addr); + } + rga_mm_unmap_buffer(job_buffer->addr); kfree(job_buffer->addr); @@ -1878,6 +1894,11 @@ static int rga_mm_map_channel_job_buffer(struct rga_job *job, goto error_free_buffer; } + if (DEBUGGER_EN(MM)) { + pr_info("map buffer:\n"); + rga_mm_dump_buffer(buffer); + } + ret = rga_mm_get_buffer_info(job, buffer, &img->yrgb_addr); if (ret < 0) { pr_err("Failed to get internal buffer info!\n");