change rga mmu remap index method
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / rga / rga_mmu_info.c
index e8167d7fc5305fe0cdb34bd70ba6878306bfa8fc..8a1f5fd67ee2ca9b3fcd3cadafbed3c7b092556c 100755 (executable)
@@ -248,7 +248,7 @@ static int rga_MapUserMemory(struct page **pages,
     uint32_t temp;\r
     status = 0;\r
     Address = 0;\r
-\r
+    \r
     do\r
     {    \r
         down_read(&current->mm->mmap_sem);\r
@@ -262,7 +262,8 @@ static int rga_MapUserMemory(struct page **pages,
                 NULL\r
                 );\r
         up_read(&current->mm->mmap_sem);\r
-                        \r
+\r
+        #if 0                \r
         if(result <= 0 || result < pageCount) \r
         {\r
             status = 0;\r
@@ -282,6 +283,73 @@ static int rga_MapUserMemory(struct page **pages,
 \r
             return status;\r
         }\r
+        #else\r
+        if(result <= 0 || result < pageCount) \r
+        {\r
+            struct vm_area_struct *vma;\r
+\r
+            for(i=0; i<pageCount; i++)\r
+            {                \r
+                vma = find_vma(current->mm, (Memory + i) << PAGE_SHIFT);\r
+\r
+                if (vma && (vma->vm_flags & VM_PFNMAP) )\r
+                {\r
+                    do\r
+                    {\r
+                        pte_t       * pte;\r
+                        spinlock_t  * ptl;\r
+                        unsigned long pfn;                                                                        \r
+                        pgd_t * pgd;\r
+                        pud_t * pud;\r
+                        \r
+                        pgd = pgd_offset(current->mm, (Memory + i) << PAGE_SHIFT);\r
+\r
+                        if(pgd_val(*pgd) == 0)\r
+                        {\r
+                            printk("rga pgd value is zero \n");\r
+                            break;\r
+                        }\r
+                        \r
+                        pud = pud_offset(pgd, (Memory + i) << PAGE_SHIFT);\r
+                        if (pud)\r
+                        {\r
+                            pmd_t * pmd = pmd_offset(pud, (Memory + i) << PAGE_SHIFT);\r
+                            if (pmd)\r
+                            {\r
+                                pte = pte_offset_map_lock(current->mm, pmd, (Memory + i) << PAGE_SHIFT, &ptl);\r
+                                if (!pte)\r
+                                {\r
+                                    break;\r
+                                }\r
+                            }\r
+                            else\r
+                            {\r
+                                break;\r
+                            }\r
+                        }\r
+                        else\r
+                        {\r
+                            break;\r
+                        }\r
+\r
+                        pfn = pte_pfn(*pte);\r
+                        Address = ((pfn << PAGE_SHIFT) | (((unsigned long)((Memory + i) << PAGE_SHIFT)) & ~PAGE_MASK));                        \r
+                        pte_unmap_unlock(pte, ptl);                                                                        \r
+                    }\r
+                    while (0);\r
+\r
+                    pageTable[i] = Address;\r
+                }\r
+                else\r
+                {\r
+                    status = RGA_OUT_OF_RESOURCES;\r
+                    break;\r
+                }     \r
+            }\r
+            \r
+            return 0;\r
+        }\r
+        #endif\r
 \r
         for (i = 0; i < pageCount; i++)\r
         {\r
@@ -370,14 +438,14 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
         /* Cal out the needed mem size */\r
         AllSize = SrcMemSize + DstMemSize;\r
                            \r
-        pages = kmalloc((AllSize + 1)* sizeof(struct page *), GFP_KERNEL);\r
+        pages = kzalloc((AllSize + 1)* sizeof(struct page *), GFP_KERNEL);\r
         if(pages == NULL) {\r
             pr_err("RGA MMU malloc pages mem failed\n");\r
             status = RGA_MALLOC_ERROR;\r
             break;                \r
         }\r
         \r
-        MMU_Base = kmalloc((AllSize + 1) * sizeof(uint32_t), GFP_KERNEL);\r
+        MMU_Base = kzalloc((AllSize + 1) * sizeof(uint32_t), GFP_KERNEL);\r
         if(MMU_Base == NULL) {\r
             pr_err("RGA MMU malloc MMU_Base point failed\n");\r
             status = RGA_MALLOC_ERROR;\r
@@ -385,7 +453,7 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
         }\r
 \r
         if(req->src.yrgb_addr < KERNEL_SPACE_VALID)\r
-        {            \r
+        {               \r
             ret = rga_MapUserMemory(&pages[0], &MMU_Base[0], SrcStart, SrcMemSize);\r
             if (ret < 0) {\r
                 pr_err("rga map src memory failed\n");\r
@@ -421,7 +489,7 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
             #if 0\r
             ktime_t start, end;\r
             start = ktime_get();\r
-            #endif\r
+            #endif            \r
             ret = rga_MapUserMemory(&pages[SrcMemSize], &MMU_Base[SrcMemSize], DstStart, DstMemSize);\r
             if (ret < 0) {\r
                 pr_err("rga map dst memory failed\n");\r