rga mmu use ionmmu passed
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / rga / rga_mmu_info.c
index a0152787a03c68d04796a418ccc574cc5825cba2..dbbc43c6aea98dcdaabf0dd23ec56a7a2f2520b0 100755 (executable)
@@ -467,7 +467,6 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
             return -EINVAL;\r
         }\r
 \r
-\r
         /* Cal out the needed mem size */\r
         AllSize = SrcMemSize + DstMemSize;\r
 \r
@@ -485,8 +484,7 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
             break;\r
         }\r
 \r
-        if((req->mmu_info.mmu_flag >> 8) & 1)\r
-        {\r
+        if((req->mmu_info.mmu_flag >> 8) & 1) {\r
             if (req->sg_src) {\r
                 ret = rga_MapION(req->sg_src, &MMU_Base[0], SrcMemSize);\r
             }\r
@@ -499,18 +497,12 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
                 }\r
             }\r
         }\r
-        else\r
-        {\r
+        else {\r
             MMU_p = MMU_Base;\r
 \r
-            if(req->src.yrgb_addr == (uint32_t)rga_service.pre_scale_buf)\r
-            {\r
-                /* Down scale ratio over 2, Last prc    */\r
-                /* MMU table copy from pre scale table  */\r
-\r
+            if(req->src.yrgb_addr == (uint32_t)rga_service.pre_scale_buf) {\r
                 for(i=0; i<SrcMemSize; i++)\r
                     MMU_p[i] = rga_service.pre_scale_buf[i];\r
-\r
             }\r
             else {\r
                 for(i=0; i<SrcMemSize; i++)\r
@@ -519,16 +511,20 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
         }\r
 \r
         if ((req->mmu_info.mmu_flag >> 10) & 1) {\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
-                status = ret;\r
-                break;\r
+            if (req->sg_dst) {\r
+                ret = rga_MapION(req->sg_dst, &MMU_Base[SrcMemSize], DstMemSize);\r
+            }\r
+            else {\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
+                    status = ret;\r
+                    break;\r
+                }\r
             }\r
         }\r
         else {\r
             MMU_p = MMU_Base + SrcMemSize;\r
-\r
             for(i=0; i<DstMemSize; i++)\r
                 MMU_p[i] = (uint32_t)((DstStart + i) << PAGE_SHIFT);\r
         }\r
@@ -548,7 +544,10 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
         req->src.uv_addr = (req->src.uv_addr & (~PAGE_MASK)) | (uv_size << PAGE_SHIFT);\r
         req->src.v_addr = (req->src.v_addr & (~PAGE_MASK)) | (v_size << PAGE_SHIFT);\r
 \r
+        uv_size = (req->dst.uv_addr - (DstStart << PAGE_SHIFT)) >> PAGE_SHIFT;\r
+\r
         req->dst.yrgb_addr = (req->dst.yrgb_addr & (~PAGE_MASK)) | (SrcMemSize << PAGE_SHIFT);\r
+        req->dst.uv_addr = (req->dst.uv_addr & (~PAGE_MASK)) | ((SrcMemSize + uv_size) << PAGE_SHIFT);\r
 \r
         /*record the malloc buf for the cmd end to release*/\r
         reg->MMU_base = MMU_Base;\r
@@ -762,23 +761,23 @@ static int rga_mmu_info_color_fill_mode(struct rga_reg *reg, struct rga_req *req
             break;\r
         }\r
 \r
-        if (req->dst.yrgb_addr < KERNEL_SPACE_VALID)\r
-        {\r
-            ret = rga_MapUserMemory(&pages[0], &MMU_Base[0], DstStart, DstMemSize);\r
-            if (ret < 0) {\r
-                pr_err("rga map dst memory failed\n");\r
-                status = ret;\r
-                break;\r
+        if (req->dst.yrgb_addr < KERNEL_SPACE_VALID) {\r
+            if (req->sg_dst) {\r
+                ret = rga_MapION(req->sg_dst, &MMU_Base[0], DstMemSize);\r
+            }\r
+            else {\r
+                ret = rga_MapUserMemory(&pages[0], &MMU_Base[0], DstStart, DstMemSize);\r
+                if (ret < 0) {\r
+                    pr_err("rga map dst memory failed\n");\r
+                    status = ret;\r
+                    break;\r
+                }\r
             }\r
         }\r
-        else\r
-        {\r
+        else {\r
             MMU_p = MMU_Base;\r
-\r
             for(i=0; i<DstMemSize; i++)\r
-            {\r
-                MMU_p[i] = (uint32_t)virt_to_phys((uint32_t *)((DstStart + i) << PAGE_SHIFT));\r
-            }\r
+                MMU_p[i] = (uint32_t)((DstStart + i) << PAGE_SHIFT);\r
         }\r
 \r
         MMU_Base[AllSize] = MMU_Base[AllSize - 1];\r
@@ -1058,8 +1057,7 @@ static int rga_mmu_info_pre_scale_mode(struct rga_reg *reg, struct rga_req *req)
 \r
     MMU_Base = NULL;\r
 \r
-    do\r
-    {\r
+    do {\r
         /* cal src buf mmu info */\r
         SrcMemSize = rga_buf_size_cal(req->src.yrgb_addr, req->src.uv_addr, req->src.v_addr,\r
                                         req->src.format, req->src.vir_w, req->src.vir_h,\r
@@ -1079,8 +1077,7 @@ static int rga_mmu_info_pre_scale_mode(struct rga_reg *reg, struct rga_req *req)
         AllSize = SrcMemSize + DstMemSize;\r
 \r
         pages = kzalloc((AllSize)* sizeof(struct page *), GFP_KERNEL);\r
-        if(pages == NULL)\r
-        {\r
+        if(pages == NULL) {\r
             pr_err("RGA MMU malloc pages mem failed\n");\r
             status = RGA_MALLOC_ERROR;\r
             break;\r
@@ -1098,55 +1095,51 @@ static int rga_mmu_info_pre_scale_mode(struct rga_reg *reg, struct rga_req *req)
         }\r
 \r
         /* map src pages */\r
-        if (req->src.yrgb_addr < KERNEL_SPACE_VALID)\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
-                status = ret;\r
-                break;\r
+        if ((req->mmu_info.mmu_flag >> 8) & 1) {\r
+            if (req->sg_src) {\r
+                ret = rga_MapION(req->sg_src, &MMU_Base[0], SrcMemSize);\r
+            }\r
+            else {\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
+                    status = ret;\r
+                    break;\r
+                }\r
             }\r
         }\r
-        else\r
-        {\r
+        else {\r
             MMU_p = MMU_Base;\r
 \r
             for(i=0; i<SrcMemSize; i++)\r
-            {\r
-                MMU_p[i] = (uint32_t)virt_to_phys((uint32_t *)((SrcStart + i) << PAGE_SHIFT));\r
-            }\r
+                MMU_p[i] = (uint32_t)((SrcStart + i) << PAGE_SHIFT);\r
         }\r
 \r
-\r
-        if(req->dst.yrgb_addr >= KERNEL_SPACE_VALID)\r
+        if((req->mmu_info.mmu_flag >> 10) & 1) {\r
+            if (req->sg_dst) {\r
+                ret = rga_MapION(req->sg_dst, &MMU_Base[SrcMemSize], DstMemSize);\r
+            }\r
+            else {\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
+                    status = ret;\r
+                    break;\r
+                }\r
+            }\r
+        }\r
+        else\r
         {\r
             /* kernel space */\r
             MMU_p = MMU_Base + SrcMemSize;\r
 \r
-            if(req->dst.yrgb_addr == (uint32_t)rga_service.pre_scale_buf)\r
-            {\r
+            if(req->dst.yrgb_addr == (uint32_t)rga_service.pre_scale_buf) {\r
                 for(i=0; i<DstMemSize; i++)\r
-                {\r
                     MMU_p[i] = rga_service.pre_scale_buf[i];\r
-                }\r
             }\r
-            else\r
-            {\r
+            else {\r
                 for(i=0; i<DstMemSize; i++)\r
-                {\r
-                    MMU_p[i] = virt_to_phys((uint32_t *)((DstStart + i) << PAGE_SHIFT));\r
-                }\r
-            }\r
-        }\r
-        else\r
-        {\r
-            /* user space */\r
-            ret = rga_MapUserMemory(&pages[SrcMemSize], &MMU_Base[SrcMemSize], DstStart, DstMemSize);\r
-            if (ret < 0)\r
-            {\r
-                pr_err("rga map dst memory failed\n");\r
-                status = ret;\r
-                break;\r
+                    MMU_p[i] = (uint32_t)((DstStart + i) << PAGE_SHIFT);\r
             }\r
         }\r
 \r