rga mmu use ionmmu passed
authorzsq <zsq@rock-chips.com>
Mon, 11 Aug 2014 07:24:58 +0000 (15:24 +0800)
committerzsq <zsq@rock-chips.com>
Mon, 11 Aug 2014 07:24:58 +0000 (15:24 +0800)
arch/arm/boot/dts/rk312x.dtsi
drivers/video/rockchip/rga/rga.h
drivers/video/rockchip/rga/rga_drv.c
drivers/video/rockchip/rga/rga_mmu_info.c
drivers/video/rockchip/rga2/rga2_drv.c

index 04e51f2ee1d8c5861951fb7a4cb2a86694fecd4b..35aa3c9c4dd87a7ac09b8470a548f7af4adac692 100755 (executable)
        };
        
        rga: rga@1010c000 {
-               compatible = "rockchip,rga_drv";
+               compatible = "rockchip,rk312x-rga";
                reg = <0x1010c000 0x1000>;
                interrupts = <GIC_SPI 44 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&clk_gates0 11>, <&clk_gates1 4>;
index fbd36e2f1f33357b7e4c7aef73460be5ef80ca5c..bd121895cc4e76b9f105fe263210a967f3176c42 100755 (executable)
@@ -383,8 +383,6 @@ typedef struct rga_service_info {
     uint32_t            *pre_scale_buf;\r
     atomic_t            int_disable;     /* 0 int enable 1 int disable  */\r
     atomic_t            cmd_num;\r
-    atomic_t            src_format_swt;\r
-    int                 last_prc_src_format;\r
     atomic_t            rga_working;\r
     bool                enable;\r
 \r
index 59b571eaacac1e4b491c6a76cdde478841a88975..2a506f805ec03c947dc2acaf17dc3c7e8bdf7c98 100755 (executable)
@@ -151,6 +151,8 @@ static void print_info(struct rga_req *req)
     printk("clip.xmin = %d, clip.xmax = %d. clip.ymin = %d, clip.ymax = %d\n",\r
         req->clip.xmin, req->clip.xmax, req->clip.ymin, req->clip.ymax);\r
 \r
+    printk("mmu_flag = %.8x\n", req->mmu_info.mmu_flag);\r
+\r
     //printk("alpha_rop_flag = %.8x\n", req->alpha_rop_flag);\r
     //printk("alpha_rop_mode = %.8x\n", req->alpha_rop_mode);\r
     //printk("PD_mode = %.8x\n", req->PD_mode);\r
@@ -1198,7 +1200,7 @@ static struct miscdevice rga_dev ={
 \r
 #if defined(CONFIG_OF)\r
 static const struct of_device_id rockchip_rga_dt_ids[] = {\r
-       { .compatible = "rockchip,rga_drv", },\r
+       { .compatible = "rockchip,rk312x-rga", },\r
        {},\r
 };\r
 #endif\r
@@ -1213,8 +1215,6 @@ static int rga_drv_probe(struct platform_device *pdev)
        mutex_init(&rga_service.lock);\r
        mutex_init(&rga_service.mutex);\r
        atomic_set(&rga_service.total_running, 0);\r
-       atomic_set(&rga_service.src_format_swt, 0);\r
-       rga_service.last_prc_src_format = 1; /* default is yuv first*/\r
        rga_service.enable = false;\r
 \r
     rga_ioctl_kernel_p = rga_ioctl_kernel_imp;\r
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
index 5f908f422c857d68933265212dbac7ead51dd266..4db550e7fcb90b60ba2d1f255a75344a67ab3ede 100755 (executable)
@@ -1111,7 +1111,7 @@ static struct miscdevice rga2_dev ={
 };\r
 \r
 static const struct of_device_id rockchip_rga_dt_ids[] = {\r
-       { .compatible = "rockchip,rga2_drv", },\r
+       { .compatible = "rockchip,rk3288-rga2", },\r
        {},\r
 };\r
 \r