From 475afae8106b3562bb08f12c04da72bd1fdb541a Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Fri, 25 Nov 2022 14:35:06 +0800 Subject: [PATCH] video/rockchip: rga: adapt to kernel 4.4 Signed-off-by: Yu Qiaowei Change-Id: Ic1f8e21e5d1841d3533d0d74d46caf668c48645e --- drivers/video/rockchip/rga/rga_mmu_info.c | 102 ++++++++++++---------- 1 file changed, 56 insertions(+), 46 deletions(-) diff --git a/drivers/video/rockchip/rga/rga_mmu_info.c b/drivers/video/rockchip/rga/rga_mmu_info.c index cdd1fcd7bbcb..1380b811c2e5 100644 --- a/drivers/video/rockchip/rga/rga_mmu_info.c +++ b/drivers/video/rockchip/rga/rga_mmu_info.c @@ -44,6 +44,46 @@ static int rga_mmu_buf_get(struct rga_mmu_buf_t *t, uint32_t size) return 0; } +static void rga_current_mm_read_lock(struct mm_struct *mm) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) + mmap_read_lock(mm); +#else + down_read(&mm->mmap_sem); +#endif +} + +static void rga_current_mm_read_unlock(struct mm_struct *mm) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) + mmap_read_unlock(mm); +#else + up_read(&mm->mmap_sem); +#endif +} + +static long rga_get_user_pages(struct page **pages, unsigned long Memory, + uint32_t pageCount, int writeFlag, + struct mm_struct *current_mm) +{ + #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 168) && \ + LINUX_VERSION_CODE < KERNEL_VERSION(4, 5, 0) + return get_user_pages(current, current_mm, Memory << PAGE_SHIFT, + pageCount, writeFlag ? FOLL_WRITE : 0, pages, NULL); + #elif LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) + return get_user_pages(current, current_mm, Memory << PAGE_SHIFT, + pageCount, writeFlag ? FOLL_WRITE : 0, 0, pages, NULL); + #elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) + return get_user_pages_remote(current, current_mm, Memory << PAGE_SHIFT, + pageCount, writeFlag ? FOLL_WRITE : 0, pages, + NULL, NULL); + #else + return get_user_pages_remote(current_mm, Memory << PAGE_SHIFT, + pageCount, writeFlag ? FOLL_WRITE : 0, pages, + NULL, NULL); + #endif +} + static int rga_mmu_buf_get_try(struct rga_mmu_buf_t *t, uint32_t size) { int ret = 0; @@ -333,29 +373,11 @@ static int rga_MapUserMemory(struct page **pages, Address = 0; do { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - mmap_read_lock(current->mm); -#else - down_read(¤t->mm->mmap_sem); -#endif + rga_current_mm_read_lock(current->mm); -#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) - result = get_user_pages(current, current->mm, - Memory << PAGE_SHIFT, pageCount, 1, 0, - pages, NULL); -#elif LINUX_VERSION_CODE < KERNEL_VERSION(5, 10, 0) - result = get_user_pages_remote(current, current->mm, - Memory << PAGE_SHIFT, pageCount, 1, pages, NULL, NULL); -#else - result = get_user_pages_remote(current->mm, Memory << PAGE_SHIFT, - pageCount, 1, pages, NULL, NULL); -#endif + result = rga_get_user_pages(pages, Memory, pageCount, 1, current->mm); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - mmap_read_unlock(current->mm); -#else - up_read(¤t->mm->mmap_sem); -#endif + rga_current_mm_read_unlock(current->mm); #if 0 if(result <= 0 || result < pageCount) @@ -383,19 +405,13 @@ static int rga_MapUserMemory(struct page **pages, struct vm_area_struct *vma; if (result>0) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - mmap_read_lock(current->mm); -#else - down_read(¤t->mm->mmap_sem); -#endif - for (i = 0; i < result; i++) - put_page(pages[i]); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - mmap_read_unlock(current->mm); -#else - up_read(¤t->mm->mmap_sem); -#endif - } + rga_current_mm_read_lock(current->mm); + + for (i = 0; i < result; i++) + put_page(pages[i]); + + rga_current_mm_read_unlock(current->mm); + } for(i=0; i= KERNEL_VERSION(5, 10, 0) - mmap_read_lock(current->mm); -#else - down_read(¤t->mm->mmap_sem); -#endif - for (i = 0; i < result; i++) - put_page(pages[i]); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0) - mmap_read_unlock(current->mm); -#else - up_read(¤t->mm->mmap_sem); -#endif + rga_current_mm_read_lock(current->mm); + + for (i = 0; i < result; i++) + put_page(pages[i]); + + rga_current_mm_read_unlock(current->mm); return 0; }