From 7f9bf911cdc9ed41d95574956969d393a7d0231a Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Wed, 1 Mar 2023 09:40:57 +0800 Subject: [PATCH] video: rockchip: rga3: fix abort when virt_addr is free Physically contiguous virt_addr needs to add the offset of the first page when obtaining the phys_addr. Signed-off-by: Yu Qiaowei Change-Id: I8076ad2aac31ad61d8a5e0d4332fe69f702d2adb --- drivers/video/rockchip/rga3/rga_mm.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/video/rockchip/rga3/rga_mm.c b/drivers/video/rockchip/rga3/rga_mm.c index 62c864be8f29..ecc6eae0ed07 100644 --- a/drivers/video/rockchip/rga3/rga_mm.c +++ b/drivers/video/rockchip/rga3/rga_mm.c @@ -181,9 +181,12 @@ static struct sg_table *rga_alloc_sgt(struct rga_virt_addr *virt_addr) } /* get sg form pages. */ - ret = sg_alloc_table_from_pages(sgt, virt_addr->pages, + /* iova requires minimum page alignment, so sgt cannot have offset */ + ret = sg_alloc_table_from_pages(sgt, + virt_addr->pages, virt_addr->page_count, - 0, virt_addr->size, + 0, + virt_addr->size, GFP_KERNEL); if (ret) { pr_err("sg_alloc_table_from_pages failed"); @@ -618,7 +621,7 @@ static int rga_mm_map_virt_addr(struct rga_external_buffer *external_buffer, internal_buffer->virt_addr = virt_addr; internal_buffer->dma_buffer = buffer; internal_buffer->mm_flag = mm_flag; - internal_buffer->phys_addr = phys_addr ? phys_addr : 0; + internal_buffer->phys_addr = phys_addr ? phys_addr + virt_addr->offset : 0; return 0;