From e78c862107d60b59d8569f89ddd6c3b715929cca Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Thu, 8 Dec 2022 20:41:18 +0800 Subject: [PATCH] video: rockchip: rga3: modify the error message of rga_mm 1. More logs about virtual address mapping failures. 2. Fix wrong channel name printing. Signed-off-by: Yu Qiaowei Change-Id: I7559507552dbc617c66819859be58aa8df83561c --- .../video/rockchip/rga3/include/rga_common.h | 2 + .../rockchip/rga3/include/rga_debugger.h | 1 - drivers/video/rockchip/rga3/rga_common.c | 14 +++++ drivers/video/rockchip/rga3/rga_debugger.c | 10 ---- drivers/video/rockchip/rga3/rga_dma_buf.c | 8 +-- drivers/video/rockchip/rga3/rga_drv.c | 6 ++- drivers/video/rockchip/rga3/rga_mm.c | 53 +++++++++++-------- 7 files changed, 54 insertions(+), 40 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga_common.h b/drivers/video/rockchip/rga3/include/rga_common.h index addd4cb7a2a8..13873fa350b5 100644 --- a/drivers/video/rockchip/rga3/include/rga_common.h +++ b/drivers/video/rockchip/rga3/include/rga_common.h @@ -40,5 +40,7 @@ void rga_convert_addr(struct rga_img_info_t *img, bool before_vir_get_channel); void rga_swap_pd_mode(struct rga_req *req_rga); int rga_image_size_cal(int w, int h, int format, int *yrgb_size, int *uv_size, int *v_size); +void rga_dump_memory_parm(struct rga_memory_parm *parm); +void rga_dump_external_buffer(struct rga_external_buffer *buffer); #endif diff --git a/drivers/video/rockchip/rga3/include/rga_debugger.h b/drivers/video/rockchip/rga3/include/rga_debugger.h index 05d5f696652b..c274fe87f070 100644 --- a/drivers/video/rockchip/rga3/include/rga_debugger.h +++ b/drivers/video/rockchip/rga3/include/rga_debugger.h @@ -133,7 +133,6 @@ static inline int rga_procfs_init(void) void rga_cmd_print_debug_info(struct rga_req *req); void rga_request_task_debug_info(struct seq_file *m, struct rga_req *req); -void rga_dump_external_buffer(struct rga_external_buffer *buffer); #ifdef CONFIG_NO_GKI void rga_dump_job_image(struct rga_job *dump_job); #else diff --git a/drivers/video/rockchip/rga3/rga_common.c b/drivers/video/rockchip/rga3/rga_common.c index 0e21326c4cda..ae4f1bf54dff 100644 --- a/drivers/video/rockchip/rga3/rga_common.c +++ b/drivers/video/rockchip/rga3/rga_common.c @@ -665,3 +665,17 @@ int rga_image_size_cal(int w, int h, int format, return (yrgb + uv + v); } + +void rga_dump_memory_parm(struct rga_memory_parm *parm) +{ + pr_info("memory param: w = %d, h = %d, f = %s(0x%x), size = %d\n", + parm->width, parm->height, rga_get_format_name(parm->format), + parm->format, parm->size); +} + +void rga_dump_external_buffer(struct rga_external_buffer *buffer) +{ + pr_info("external: memory = 0x%lx, type = %s\n", + (unsigned long)buffer->memory, rga_get_memory_type_str(buffer->type)); + rga_dump_memory_parm(&buffer->memory_parm); +} diff --git a/drivers/video/rockchip/rga3/rga_debugger.c b/drivers/video/rockchip/rga3/rga_debugger.c index 068e0ccf5ab1..27357bc9bde5 100644 --- a/drivers/video/rockchip/rga3/rga_debugger.c +++ b/drivers/video/rockchip/rga3/rga_debugger.c @@ -826,16 +826,6 @@ void rga_cmd_print_debug_info(struct rga_req *req) req->core, req->priority, req->in_fence_fd); } -void rga_dump_external_buffer(struct rga_external_buffer *buffer) -{ - pr_info("external: memory = 0x%lx, type = %s\n", - (unsigned long)buffer->memory, rga_get_memory_type_str(buffer->type)); - pr_info("param: w = %d, h = %d, f = %s, size = %d\n", - buffer->memory_parm.width, buffer->memory_parm.height, - rga_get_format_name(buffer->memory_parm.format), - buffer->memory_parm.size); -} - #ifdef CONFIG_NO_GKI static int rga_dump_image_to_file(struct rga_internal_buffer *dump_buffer, const char *channel_name, diff --git a/drivers/video/rockchip/rga3/rga_dma_buf.c b/drivers/video/rockchip/rga3/rga_dma_buf.c index b5b0dd0682fc..63af3cde8a37 100644 --- a/drivers/video/rockchip/rga3/rga_dma_buf.c +++ b/drivers/video/rockchip/rga3/rga_dma_buf.c @@ -424,7 +424,7 @@ int rga_dma_map_buf(struct dma_buf *dma_buf, struct rga_dma_buffer *rga_dma_buff if (dma_buf != NULL) { get_dma_buf(dma_buf); } else { - pr_err("dma_buf is Invalid[%p]\n", dma_buf); + pr_err("dma_buf is invalid[%p]\n", dma_buf); return -EINVAL; } @@ -437,7 +437,7 @@ int rga_dma_map_buf(struct dma_buf *dma_buf, struct rga_dma_buffer *rga_dma_buff sgt = dma_buf_map_attachment(attach, dir); if (IS_ERR(sgt)) { - pr_err("Failed to map src attachment\n"); + pr_err("Failed to map attachment\n"); ret = -EINVAL; goto err_get_sgt; } @@ -474,7 +474,7 @@ int rga_dma_map_fd(int fd, struct rga_dma_buffer *rga_dma_buffer, dma_buf = dma_buf_get(fd); if (IS_ERR(dma_buf)) { - pr_err("dma_buf_get fail fd[%d]\n", fd); + pr_err("Fail to get dma_buf from fd[%d]\n", fd); ret = -EINVAL; return ret; } @@ -488,7 +488,7 @@ int rga_dma_map_fd(int fd, struct rga_dma_buffer *rga_dma_buffer, sgt = dma_buf_map_attachment(attach, dir); if (IS_ERR(sgt)) { - pr_err("Failed to map src attachment\n"); + pr_err("Failed to map attachment\n"); ret = -EINVAL; goto err_get_sgt; } diff --git a/drivers/video/rockchip/rga3/rga_drv.c b/drivers/video/rockchip/rga3/rga_drv.c index 3eb5a4a21f7c..789a16202cb7 100644 --- a/drivers/video/rockchip/rga3/rga_drv.c +++ b/drivers/video/rockchip/rga3/rga_drv.c @@ -650,8 +650,9 @@ static long rga_ioctl_import_buffer(unsigned long arg, struct rga_session *sessi ret = rga_mm_import_buffer(&external_buffer[i], session); if (ret == 0) { - pr_err("buffer[%d] mm import buffer failed! memory = 0x%lx, type = 0x%x\n", + pr_err("buffer[%d] mm import buffer failed! memory = 0x%lx, type = %s(0x%x)\n", i, (unsigned long)external_buffer[i].memory, + rga_get_memory_type_str(external_buffer[i].type), external_buffer[i].type); goto err_free_external_buffer; @@ -721,7 +722,8 @@ static long rga_ioctl_release_buffer(unsigned long arg) ret = rga_mm_release_buffer(external_buffer[i].handle); if (ret < 0) { - pr_err("buffer[%d] mm release buffer failed!\n", i); + pr_err("buffer[%d] mm release buffer failed! handle = %d\n", + i, external_buffer[i].handle); goto err_free_external_buffer; } diff --git a/drivers/video/rockchip/rga3/rga_mm.c b/drivers/video/rockchip/rga3/rga_mm.c index 6183aa11db47..03b965300799 100644 --- a/drivers/video/rockchip/rga3/rga_mm.c +++ b/drivers/video/rockchip/rga3/rga_mm.c @@ -53,14 +53,14 @@ static int rga_get_user_pages_from_vma(struct page **pages, unsigned long Memory for (i = 0; i < pageCount; i++) { vma = find_vma(current_mm, (Memory + i) << PAGE_SHIFT); if (!vma) { - pr_err("failed to get vma\n"); + pr_err("page[%d] failed to get vma\n", i); ret = RGA_OUT_OF_RESOURCES; break; } pgd = pgd_offset(current_mm, (Memory + i) << PAGE_SHIFT); if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd))) { - pr_err("failed to get pgd\n"); + pr_err("page[%d] failed to get pgd\n", i); ret = RGA_OUT_OF_RESOURCES; break; } @@ -71,7 +71,7 @@ static int rga_get_user_pages_from_vma(struct page **pages, unsigned long Memory */ p4d = p4d_offset(pgd, (Memory + i) << PAGE_SHIFT); if (p4d_none(*p4d) || unlikely(p4d_bad(*p4d))) { - pr_err("failed to get p4d\n"); + pr_err("page[%d] failed to get p4d\n", i); ret = RGA_OUT_OF_RESOURCES; break; } @@ -82,20 +82,20 @@ static int rga_get_user_pages_from_vma(struct page **pages, unsigned long Memory #endif if (pud_none(*pud) || unlikely(pud_bad(*pud))) { - pr_err("failed to get pud\n"); + pr_err("page[%d] failed to get pud\n", i); ret = RGA_OUT_OF_RESOURCES; break; } pmd = pmd_offset(pud, (Memory + i) << PAGE_SHIFT); if (pmd_none(*pmd) || unlikely(pmd_bad(*pmd))) { - pr_err("failed to get pmd\n"); + pr_err("page[%d] failed to get pmd\n", i); ret = RGA_OUT_OF_RESOURCES; break; } pte = pte_offset_map_lock(current_mm, pmd, (Memory + i) << PAGE_SHIFT, &ptl); if (pte_none(*pte)) { - pr_err("failed to get pte\n"); + pr_err("page[%d] failed to get pte\n", i); pte_unmap_unlock(pte, ptl); ret = RGA_OUT_OF_RESOURCES; break; @@ -106,6 +106,10 @@ static int rga_get_user_pages_from_vma(struct page **pages, unsigned long Memory pte_unmap_unlock(pte, ptl); } + if (ret == RGA_OUT_OF_RESOURCES && i > 0) + pr_err("Only get buffer %d byte from vma, but current image required %d byte", + (int)(i * PAGE_SIZE), (int)(pageCount * PAGE_SIZE)); + return ret; } @@ -144,9 +148,9 @@ static int rga_get_user_pages(struct page **pages, unsigned long Memory, put_page(pages[i]); ret = rga_get_user_pages_from_vma(pages, Memory, pageCount, current_mm); - if (ret < 0) { - pr_err("Can not get user pages from vma, result = %d, pagecount = %d\n", - result, pageCount); + if (ret < 0 && result > 0) { + pr_err("Only get buffer %d byte from user pages, but current image required %d byte\n", + (int)(result * PAGE_SIZE), (int)(pageCount * PAGE_SIZE)); } } @@ -245,6 +249,7 @@ static int rga_alloc_virt_addr(struct rga_virt_addr **virt_addr_p, if (!size) { pr_err("failed to calculating buffer size! size = %ld, count = %d, offset = %ld\n", size, count, (unsigned long)offset); + rga_dump_memory_parm(memory_parm); return -EFAULT; } @@ -259,7 +264,8 @@ static int rga_alloc_virt_addr(struct rga_virt_addr **virt_addr_p, /* get pages from virtual address. */ ret = rga_get_user_pages(pages, viraddr >> PAGE_SHIFT, count, writeFlag, mm); if (ret < 0) { - pr_err("failed to get pages"); + pr_err("failed to get pages from virtual adrees: 0x%lx\n", + (unsigned long)viraddr); ret = -EINVAL; goto out_free_pages; } else if (ret > 0) { @@ -301,7 +307,7 @@ static inline bool rga_mm_check_memory_limit(struct rga_scheduler_t *scheduler, if (scheduler->data->mmu == RGA_MMU && !(mm_flag & RGA_MEM_UNDER_4G)) { - pr_err("%s unsupported Memory larger than 4G!\n", + pr_err("%s unsupported memory larger than 4G!\n", rga_get_mmu_type_str(scheduler->data->mmu)); return false; } @@ -576,8 +582,8 @@ static int rga_mm_map_virt_addr(struct rga_external_buffer *external_buffer, if (mm_flag & RGA_MEM_PHYSICAL_CONTIGUOUS) break; - pr_err("Current RGA mmu[%d] cannot support virtual address!\n", - scheduler->data->mmu); + pr_err("Current %s[%d] cannot support virtual address!\n", + rga_get_mmu_type_str(scheduler->data->mmu), scheduler->data->mmu); goto free_dma_buffer; } @@ -649,7 +655,8 @@ static int rga_mm_map_phys_addr(struct rga_external_buffer *external_buffer, internal_buffer->memory_parm.format, NULL, NULL, NULL); if (buffer_size <= 0) { - pr_err("Fault to get phys addr size!\n"); + pr_err("Failed to get phys addr size!\n"); + rga_dump_memory_parm(&internal_buffer->memory_parm); return buffer_size == 0 ? -EINVAL : buffer_size; } @@ -738,7 +745,7 @@ static int rga_mm_map_buffer(struct rga_external_buffer *external_buffer, ret = rga_mm_map_virt_addr(external_buffer, internal_buffer, job, write_flag); if (ret < 0) { - pr_err("%s iommu_map virtual address error!\n", __func__); + pr_err("%s map virtual address error!\n", __func__); return ret; } @@ -751,7 +758,7 @@ static int rga_mm_map_buffer(struct rga_external_buffer *external_buffer, ret = rga_mm_map_phys_addr(external_buffer, internal_buffer, job); if (ret < 0) { - pr_err("%s iommu_map physical address error!\n", __func__); + pr_err("%s map physical address error!\n", __func__); return ret; } @@ -1415,7 +1422,7 @@ static int rga_mm_get_channel_handle_info(struct rga_mm *mm, ret = rga_mm_get_buffer(mm, job, handle, &img->yrgb_addr, &job_buf->y_addr, dir); if (ret < 0) { - pr_err("handle[%d] Can't get src y/rgb address info!\n", handle); + pr_err("handle[%d] Can't get y/rgb address info!\n", handle); return ret; } } @@ -1425,7 +1432,7 @@ static int rga_mm_get_channel_handle_info(struct rga_mm *mm, ret = rga_mm_get_buffer(mm, job, handle, &img->uv_addr, &job_buf->uv_addr, dir); if (ret < 0) { - pr_err("handle[%d] Can't get src uv address info!\n", handle); + pr_err("handle[%d] Can't get uv address info!\n", handle); return ret; } } @@ -1435,7 +1442,7 @@ static int rga_mm_get_channel_handle_info(struct rga_mm *mm, ret = rga_mm_get_buffer(mm, job, handle, &img->v_addr, &job_buf->v_addr, dir); if (ret < 0) { - pr_err("handle[%d] Can't get src uv address info!\n", handle); + pr_err("handle[%d] Can't get uv address info!\n", handle); return ret; } } @@ -1445,7 +1452,7 @@ static int rga_mm_get_channel_handle_info(struct rga_mm *mm, ret = rga_mm_get_buffer(mm, job, handle, &img->yrgb_addr, &job_buf->addr, dir); if (ret < 0) { - pr_err("handle[%d] Can't get src y/rgb address info!\n", handle); + pr_err("handle[%d] Can't get y/rgb address info!\n", handle); return ret; } } @@ -1496,7 +1503,7 @@ static int rga_mm_get_handle_info(struct rga_job *job) &job->src_buffer, DMA_TO_DEVICE); if (ret < 0) { - pr_err("Can't get src buffer third info!\n"); + pr_err("Can't get src buffer info from handle!\n"); return ret; } } @@ -1506,7 +1513,7 @@ static int rga_mm_get_handle_info(struct rga_job *job) &job->dst_buffer, DMA_TO_DEVICE); if (ret < 0) { - pr_err("Can't get dst buffer third info!\n"); + pr_err("Can't get dst buffer info from handle!\n"); return ret; } } @@ -1528,7 +1535,7 @@ static int rga_mm_get_handle_info(struct rga_job *job) DMA_BIDIRECTIONAL); } if (ret < 0) { - pr_err("Can't get pat buffer third info!\n"); + pr_err("Can't get pat buffer info from handle!\n"); return ret; } }