diff --git a/drivers/video/rockchip/rga3/include/rga_common.h b/drivers/video/rockchip/rga3/include/rga_common.h index 6c64f74019c9..4ed75821f89a 100644 --- a/drivers/video/rockchip/rga3/include/rga_common.h +++ b/drivers/video/rockchip/rga3/include/rga_common.h @@ -83,4 +83,6 @@ void rga_dump_memory_parm(struct rga_memory_parm *parm); void rga_dump_external_buffer(struct rga_external_buffer *buffer); void rga_dump_req(struct rga_request *request, struct rga_req *req); +unsigned long rga_get_free_pages(gfp_t gfp_mask, unsigned int *order, unsigned long size); + #endif diff --git a/drivers/video/rockchip/rga3/rga_common.c b/drivers/video/rockchip/rga3/rga_common.c index a8af72430303..1563583ddeb8 100644 --- a/drivers/video/rockchip/rga3/rga_common.c +++ b/drivers/video/rockchip/rga3/rga_common.c @@ -925,3 +925,27 @@ void rga_dump_req(struct rga_request *request, struct rga_req *req) rga_req_log(request, "core_mask = %#x, priority = %d, in_fence = %d(%#x)\n", req->core, req->priority, req->in_fence_fd, req->in_fence_fd); } + +unsigned long rga_get_free_pages(gfp_t gfp_mask, unsigned int *order, unsigned long size) +{ + int cur_order, max_order; + unsigned long pages; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 8, 0) + max_order = MAX_ORDER; +#else + max_order = MAX_PAGE_ORDER; +#endif + + cur_order = get_order(size); + if (cur_order > max_order) { + rga_err("Can not alloc pages with order[%d] for viraddr pages, max_order = %d\n", + cur_order, max_order); + return 0; + } + + pages = __get_free_pages(gfp_mask, cur_order); + *order = cur_order; + + return pages; +} diff --git a/drivers/video/rockchip/rga3/rga_debugger.c b/drivers/video/rockchip/rga3/rga_debugger.c index 572035977338..95cc8097648b 100644 --- a/drivers/video/rockchip/rga3/rga_debugger.c +++ b/drivers/video/rockchip/rga3/rga_debugger.c @@ -14,6 +14,7 @@ #include #include #include +#include #include "rga.h" #include "rga_debugger.h" diff --git a/drivers/video/rockchip/rga3/rga_drv.c b/drivers/video/rockchip/rga3/rga_drv.c index d0d71fefd685..9ef013bb651c 100644 --- a/drivers/video/rockchip/rga3/rga_drv.c +++ b/drivers/video/rockchip/rga3/rga_drv.c @@ -1497,7 +1497,11 @@ pm_disable: return ret; } +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 11, 0) static int rga_drv_remove(struct platform_device *pdev) +#else +static void rga_drv_remove(struct platform_device *pdev) +#endif { struct rga_scheduler_t *scheduler = NULL; @@ -1515,7 +1519,9 @@ static int rga_drv_remove(struct platform_device *pdev) up_write(&rga_drvdata->rwsem); +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 11, 0) return 0; +#endif } static void rga_drv_shutdown(struct platform_device *pdev) diff --git a/drivers/video/rockchip/rga3/rga_iommu.c b/drivers/video/rockchip/rga3/rga_iommu.c index 3ba0d58b2c20..4a3223e835cb 100644 --- a/drivers/video/rockchip/rga3/rga_iommu.c +++ b/drivers/video/rockchip/rga3/rga_iommu.c @@ -167,28 +167,16 @@ struct rga_mmu_base *rga_mmu_base_init(size_t size) * malloc pre scale mid buf mmu table: * size * channel_num * address_size */ - order = get_order(size * 3 * sizeof(*mmu_base->buf_virtual)); - if (order >= MAX_ORDER) { - pr_err("Can not alloc pages with order[%d] for mmu_page_table, max_order = %d\n", - order, MAX_ORDER); - goto err_free_mmu_base; - } - - mmu_base->buf_virtual = (uint32_t *) __get_free_pages(GFP_KERNEL | GFP_DMA32, order); + mmu_base->buf_virtual = (uint32_t *)rga_get_free_pages(GFP_KERNEL | GFP_DMA32, + &order, size * 3 * sizeof(*mmu_base->buf_virtual)); if (mmu_base->buf_virtual == NULL) { pr_err("Can not alloc pages for mmu_page_table\n"); goto err_free_mmu_base; } mmu_base->buf_order = order; - order = get_order(size * sizeof(*mmu_base->pages)); - if (order >= MAX_ORDER) { - pr_err("Can not alloc pages with order[%d] for mmu_base->pages, max_order = %d\n", - order, MAX_ORDER); - goto err_free_buf_virtual; - } - - mmu_base->pages = (struct page **)__get_free_pages(GFP_KERNEL | GFP_DMA32, order); + mmu_base->pages = (struct page **)rga_get_free_pages(GFP_KERNEL | GFP_DMA32, + &order, size * sizeof(*mmu_base->pages)); if (mmu_base->pages == NULL) { pr_err("Can not alloc pages for mmu_base->pages\n"); goto err_free_buf_virtual; diff --git a/drivers/video/rockchip/rga3/rga_mm.c b/drivers/video/rockchip/rga3/rga_mm.c index eb34fde9d769..b130e6e604e8 100644 --- a/drivers/video/rockchip/rga3/rga_mm.c +++ b/drivers/video/rockchip/rga3/rga_mm.c @@ -133,9 +133,12 @@ static int rga_get_user_pages(struct page **pages, unsigned long Memory, result = get_user_pages_remote(current, current_mm, Memory << PAGE_SHIFT, pageCount, writeFlag ? FOLL_WRITE : 0, pages, NULL, NULL); -#else +#elif LINUX_VERSION_CODE < KERNEL_VERSION(6, 5, 0) result = get_user_pages_remote(current_mm, Memory << PAGE_SHIFT, pageCount, writeFlag ? FOLL_WRITE : 0, pages, NULL, NULL); +#else + result = get_user_pages_remote(current_mm, Memory << PAGE_SHIFT, + pageCount, writeFlag ? FOLL_WRITE : 0, pages, NULL); #endif if (result > 0 && result >= pageCount) { @@ -252,14 +255,8 @@ static int rga_alloc_virt_addr(struct rga_virt_addr **virt_addr_p, } /* alloc pages and page_table */ - order = get_order(count * sizeof(struct page *)); - if (order >= MAX_ORDER) { - rga_err("Can not alloc pages with order[%d] for viraddr pages, max_order = %d\n", - order, MAX_ORDER); - return -ENOMEM; - } - - pages = (struct page **)__get_free_pages(GFP_KERNEL, order); + pages = (struct page **)rga_get_free_pages(GFP_KERNEL, + &order, count * sizeof(struct page *)); if (pages == NULL) { rga_err("%s can not alloc pages for viraddr pages\n", __func__); return -ENOMEM; @@ -1196,14 +1193,8 @@ static int rga_mm_set_mmu_base(struct rga_job *job, } if (job->flags & RGA_JOB_USE_HANDLE) { - order = get_order(page_count * sizeof(uint32_t *)); - if (order >= MAX_ORDER) { - rga_job_err(job, "Can not alloc pages with order[%d] for page_table, max_order = %d\n", - order, MAX_ORDER); - return -ENOMEM; - } - - page_table = (uint32_t *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order); + page_table = (uint32_t *)rga_get_free_pages(GFP_KERNEL | GFP_DMA32, + &order, page_count * sizeof(uint32_t *)); if (page_table == NULL) { rga_job_err(job, "%s can not alloc pages for page_table, order = %d\n", __func__, order); @@ -1261,14 +1252,8 @@ static int rga_mm_set_mmu_base(struct rga_job *job, } if (job->flags & RGA_JOB_USE_HANDLE) { - order = get_order(page_count * sizeof(uint32_t *)); - if (order >= MAX_ORDER) { - rga_job_err(job, "Can not alloc pages with order[%d] for page_table, max_order = %d\n", - order, MAX_ORDER); - return -ENOMEM; - } - - page_table = (uint32_t *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order); + page_table = (uint32_t *)rga_get_free_pages(GFP_KERNEL | GFP_DMA32, + &order, page_count * sizeof(uint32_t *)); if (page_table == NULL) { rga_job_err(job, "%s can not alloc pages for page_table, order = %d\n", __func__, order);