add rga support for dma buf
authorzsq <zsq@rock-chips.com>
Wed, 5 Mar 2014 09:43:31 +0000 (17:43 +0800)
committerzsq <zsq@rock-chips.com>
Wed, 5 Mar 2014 09:43:31 +0000 (17:43 +0800)
arch/arm/configs/rockchip_defconfig
drivers/video/rockchip/rga/rga_drv.c

index 6bd4d0dceb568a1767fff716de5b9ee27d649515..2adec3e6c2baabcd47597f92dcf7736022a30d3a 100755 (executable)
@@ -278,7 +278,7 @@ CONFIG_USB_NET_INT51X1=y
 CONFIG_USB_IPHETH=y
 CONFIG_USB_SIERRA_NET=y
 CONFIG_WLAN=y
-CONFIG_RKWIFI=y
+CONFIG_RKWIFI=y
 CONFIG_RK903=y
 CONFIG_RKWIFI_26M=y
 CONFIG_WIFI_CONTROL_FUNC=y
@@ -508,6 +508,6 @@ CONFIG_LSM_MMAP_MIN_ADDR=4096
 CONFIG_SECURITY_SELINUX=y
 CONFIG_CRYPTO_NULL=y
 CONFIG_CRYPTO_TWOFISH=y
-CONFIG_ROCKCHIP_RGA=y
+CONFIG_ROCKCHIP_RGA=y
 # CONFIG_ROCKCHIP_RGA2=y
 # CONFIG_CRYPTO_ANSI_CPRNG is not set
index 44b5bb80976758dd4a68531e998d20d2d60c2ce0..1faaf3b86f6ba92ca53ef920f6fe85e20b109fb0 100755 (executable)
 #include <linux/fb.h>\r
 #include <linux/wakelock.h>\r
 \r
+#if defined(CONFIG_ION_ROCKCHIP)\r
+#include <linux/rockchip_ion.h>\r
+#endif\r
+\r
+\r
 #include "rga.h"\r
 #include "rga_reg_info.h"\r
 #include "rga_mmu_info.h"\r
@@ -92,11 +97,19 @@ struct rga_drvdata {
     struct clk *pd_rga;\r
        struct clk *aclk_rga;\r
     struct clk *hclk_rga;\r
+\r
+    //#if defined(CONFIG_ION_ROCKCHIP)\r
+    struct ion_client * ion_client;\r
+    //#endif\r
 };\r
 \r
 static struct rga_drvdata *drvdata;\r
 rga_service_info rga_service;\r
 \r
+#if defined(CONFIG_ION_ROCKCHIP)\r
+extern struct ion_client *rockchip_ion_client_create(const char * name);\r
+#endif\r
+\r
 static int rga_blit_async(rga_session *session, struct rga_req *req);\r
 static void rga_del_running_list(void);\r
 static void rga_del_running_list_timeout(void);\r
@@ -778,6 +791,44 @@ static void rga_mem_addr_sel(struct rga_req *req)
 }\r
 \r
 \r
+static int rga_convert_dma_buf(struct rga_req *req)\r
+{\r
+    int usr_fd;\r
+       struct ion_handle *hdl;\r
+       ion_phys_addr_t phy_addr;\r
+       size_t len;\r
+\r
+    if(!req->src.yrgb_addr) {\r
+        if (copy_from_user(&usr_fd, &req->src.yrgb_addr, sizeof(usr_fd)))\r
+            return -EFAULT;\r
+        hdl = ion_import_dma_buf(drvdata->ion_client, usr_fd);\r
+           ion_phys(drvdata->ion_client, hdl, &phy_addr, &len);\r
+        req->src.yrgb_addr = phy_addr;\r
+\r
+        req->src.uv_addr = req->src.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+    }\r
+    else {\r
+        req->src.yrgb_addr = req->src.uv_addr;\r
+        req->src.uv_addr = req->src.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+    }\r
+\r
+    if(!req->dst.yrgb_addr) {\r
+        if (copy_from_user(&usr_fd, &req->dst.yrgb_addr, sizeof(usr_fd)))\r
+            return -EFAULT;\r
+        hdl = ion_import_dma_buf(drvdata->ion_client, usr_fd);\r
+           ion_phys(drvdata->ion_client, hdl, &phy_addr, &len);\r
+        req->dst.yrgb_addr = phy_addr;\r
+\r
+        req->dst.uv_addr = req->dst.yrgb_addr + (req->dst.vir_w * req->dst.vir_h);\r
+    }\r
+    else {\r
+        req->dst.yrgb_addr = req->dst.uv_addr;\r
+        req->dst.uv_addr = req->dst.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
 static int rga_blit(rga_session *session, struct rga_req *req)\r
 {\r
     int ret = -1;\r
@@ -792,10 +843,17 @@ static int rga_blit(rga_session *session, struct rga_req *req)
     daw = req->dst.act_w;\r
     dah = req->dst.act_h;\r
 \r
-    do\r
-    {\r
-        if((req->render_mode == bitblt_mode) && (((saw>>1) >= daw) || ((sah>>1) >= dah)))\r
-        {\r
+    if(rga_convert_dma_buf(req)) {\r
+        printk("RGA : DMA buf copy error\n");\r
+        return -EFAULT;\r
+    }\r
+\r
+    #if RGA_TEST\r
+    print_info(req);\r
+    #endif\r
+\r
+    do {\r
+        if((req->render_mode == bitblt_mode) && (((saw>>1) >= daw) || ((sah>>1) >= dah))) {\r
             /* generate 2 cmd for pre scale */\r
 \r
             ret = rga_check_param(req);\r
@@ -828,8 +886,7 @@ static int rga_blit(rga_session *session, struct rga_req *req)
             num = 2;\r
 \r
         }\r
-        else\r
-        {\r
+        else {\r
             /* check value if legal */\r
             ret = rga_check_param(req);\r
                if(ret == -EINVAL) {\r
@@ -838,9 +895,7 @@ static int rga_blit(rga_session *session, struct rga_req *req)
                }\r
 \r
             if(req->render_mode == bitblt_mode)\r
-            {\r
                 rga_mem_addr_sel(req);\r
-            }\r
 \r
             reg = rga_reg_init(session, req);\r
             if(reg == NULL) {\r
@@ -867,8 +922,8 @@ static int rga_blit_async(rga_session *session, struct rga_req *req)
 \r
     #if RGA_TEST\r
     printk("*** rga_blit_async proc ***\n");\r
-    print_info(req);\r
     #endif\r
+\r
     atomic_set(&session->done, 0);\r
     ret = rga_blit(session, req);\r
 \r
@@ -882,7 +937,6 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req)
 \r
     #if RGA_TEST\r
     printk("*** rga_blit_sync proc ***\n");\r
-    print_info(req);\r
     #endif\r
 \r
     atomic_set(&session->done, 0);\r
@@ -1134,7 +1188,7 @@ static int rga_drv_probe(struct platform_device *pdev)
 {\r
        struct rga_drvdata *data;\r
     struct resource *res;\r
-    struct device_node *np = pdev->dev.of_node;\r
+    //struct device_node *np = pdev->dev.of_node;\r
        int ret = 0;\r
 \r
        mutex_init(&rga_service.lock);\r
@@ -1186,6 +1240,16 @@ static int rga_drv_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, data);\r
        drvdata = data;\r
 \r
+    #if defined(CONFIG_ION_ROCKCHIP)\r
+       data->ion_client = rockchip_ion_client_create("rga");\r
+       if (IS_ERR(data->ion_client)) {\r
+               dev_err(&pdev->dev, "failed to create ion client for rga");\r
+               return PTR_ERR(data->ion_client);\r
+       } else {
+               dev_info(&pdev->dev, "rga ion client create success!\n");\r
+       }
+    #endif\r
+\r
        ret = misc_register(&rga_dev);\r
        if(ret)\r
        {\r