rk3288: enable rga2 dmabuf support
authorzsq <zsq@rock-chips.com>
Sat, 22 Mar 2014 11:38:02 +0000 (19:38 +0800)
committerljf <ljf@rock-chips.com>
Sat, 22 Mar 2014 11:38:02 +0000 (19:38 +0800)
arch/arm/configs/rockchip_defconfig
drivers/video/rockchip/rga2/rga2_drv.c [changed mode: 0644->0755]

index cd255c009a885f14b57a1f9bc1a724d91b218578..519f7f1692518dac0f4cc84eb24359daa17232b8 100755 (executable)
@@ -356,7 +356,7 @@ CONFIG_RK32_LVDS=y
 CONFIG_DP_ANX6345=y
 CONFIG_RK32_DP=y
 CONFIG_RK_HDMI=y
-CONFIG_ROCKCHIP_RGA=y
+CONFIG_ROCKCHIP_RGA2=y
 CONFIG_LOGO=y
 # CONFIG_LOGO_LINUX_MONO is not set
 # CONFIG_LOGO_LINUX_VGA16 is not set
old mode 100644 (file)
new mode 100755 (executable)
index bb23925..c35fe94
 #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 "rga2.h"\r
 #include "rga2_reg_info.h"\r
 #include "rga2_mmu_info.h"\r
@@ -84,6 +89,10 @@ struct rga2_drvdata_t {
        struct clk *hclk_rga2;\r
        struct clk *pd_rga2;\r
     struct clk *rga2;\r
+\r
+    #if defined(CONFIG_ION_ROCKCHIP)\r
+    struct ion_client * ion_client;\r
+    #endif\r
 };\r
 \r
 struct rga2_drvdata_t *rga2_drvdata;\r
@@ -91,6 +100,10 @@ struct rga2_drvdata_t *rga2_drvdata;
 struct rga2_service_info rga2_service;\r
 struct rga2_mmu_buf_t rga2_mmu_buf;\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 rga2_blit_async(rga2_session *session, struct rga2_req *req);\r
 static void rga2_del_running_list(void);\r
 static void rga2_del_running_list_timeout(void);\r
@@ -250,9 +263,9 @@ static void rga2_power_on(void)
        if (rga2_service.enable)\r
                return;\r
 \r
-    //clk_enable(rga2_drvdata->rga2);\r
-       //clk_prepare_enable(rga2_drvdata->aclk_rga2);\r
-       //clk_prepare_enable(rga2_drvdata->hclk_rga2);\r
+    clk_prepare_enable(rga2_drvdata->rga2);\r
+       clk_prepare_enable(rga2_drvdata->aclk_rga2);\r
+       clk_prepare_enable(rga2_drvdata->hclk_rga2);\r
        //clk_enable(rga2_drvdata->pd_rga2);\r
        wake_lock(&rga2_drvdata->wake_lock);\r
        rga2_service.enable = true;\r
@@ -276,9 +289,9 @@ static void rga2_power_off(void)
        }\r
 \r
        //clk_disable(rga2_drvdata->pd_rga2);\r
-    //clk_disable(rga2_drvdata->rga2);\r
-       //clk_disable_unprepare(rga2_drvdata->aclk_rga2);\r
-       //clk_disable_unprepare(rga2_drvdata->hclk_rga2);\r
+    clk_disable_unprepare(rga2_drvdata->rga2);\r
+       clk_disable_unprepare(rga2_drvdata->aclk_rga2);\r
+       clk_disable_unprepare(rga2_drvdata->hclk_rga2);\r
        wake_unlock(&rga2_drvdata->wake_lock);\r
        rga2_service.enable = false;\r
 }\r
@@ -663,12 +676,63 @@ static void rga2_del_running_list_timeout(void)
     }\r
 }\r
 \r
+\r
+static int rga2_convert_dma_buf(struct rga2_req *req)\r
+{\r
+       struct ion_handle *hdl;\r
+       ion_phys_addr_t phy_addr;\r
+       size_t len;\r
+    int ret;\r
+\r
+    if(req->src.yrgb_addr) {\r
+        hdl = ion_import_dma_buf(rga2_drvdata->ion_client, req->src.yrgb_addr);\r
+        if (IS_ERR(hdl)) {\r
+            ret = PTR_ERR(hdl);\r
+            printk("RGA2 ERROR ion buf handle\n");\r
+            return ret;\r
+        }\r
+           ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);\r
+        req->src.yrgb_addr = phy_addr;\r
+        req->src.uv_addr = req->src.yrgb_addr + (req->src.vir_w * req->src.vir_h);\r
+        ion_free(rga2_drvdata->ion_client, hdl);\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
+        hdl = ion_import_dma_buf(rga2_drvdata->ion_client, req->dst.yrgb_addr);\r
+        if (IS_ERR(hdl)) {\r
+            ret = PTR_ERR(hdl);\r
+            printk("RGA2 ERROR ion buf handle\n");\r
+            return ret;\r
+        }\r
+           ion_phys(rga2_drvdata->ion_client, hdl, &phy_addr, &len);\r
+        req->dst.yrgb_addr = phy_addr;\r
+        req->dst.uv_addr = req->dst.yrgb_addr + (req->dst.vir_w * req->dst.vir_h);\r
+        ion_free(rga2_drvdata->ion_client, hdl);\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
+\r
 static int rga2_blit(rga2_session *session, struct rga2_req *req)\r
 {\r
     int ret = -1;\r
     int num = 0;\r
     struct rga2_reg *reg;\r
 \r
+    if(rga2_convert_dma_buf(req)) {\r
+        printk("RGA2 : DMA buf copy error\n");\r
+        return -EFAULT;\r
+    }\r
+\r
     do {\r
         /* check value if legal */\r
         ret = rga2_check_param(req);\r
@@ -1014,9 +1078,9 @@ static int rga2_drv_probe(struct platform_device *pdev)
        wake_lock_init(&data->wake_lock, WAKE_LOCK_SUSPEND, "rga");\r
 \r
        //data->pd_rga2 = clk_get(NULL, "pd_rga");\r
-    //data->rga2 = clk_get(NULL, "rga");\r
-       //data->aclk_rga2 = devm_clk_get(&pdev->dev, "aclk_rga");\r
-    //data->hclk_rga2 = devm_clk_get(&pdev->dev, "hclk_rga");\r
+    data->rga2 = devm_clk_get(&pdev->dev, "clk_rga");\r
+       data->aclk_rga2 = devm_clk_get(&pdev->dev, "aclk_rga");\r
+    data->hclk_rga2 = devm_clk_get(&pdev->dev, "hclk_rga");\r
 \r
        /* map the registers */\r
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);\r
@@ -1046,6 +1110,16 @@ static int rga2_drv_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, data);\r
        rga2_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 {\r
+               dev_info(&pdev->dev, "rga ion client create success!\n");\r
+       }\r
+    #endif\r
+\r
        ret = misc_register(&rga2_dev);\r
        if(ret)\r
        {\r
@@ -1079,9 +1153,9 @@ static int rga2_drv_remove(struct platform_device *pdev)
        iounmap((void __iomem *)(data->rga_base));\r
 \r
        //clk_put(data->pd_rga2);\r
-    //clk_put(data->rga2);\r
-       //devm_clk_put(&pdev->dev, data->aclk_rga2);\r
-       //devm_clk_put(&pdev->dev, data->hclk_rga2);\r
+    devm_clk_put(&pdev->dev, data->rga2);\r
+       devm_clk_put(&pdev->dev, data->aclk_rga2);\r
+       devm_clk_put(&pdev->dev, data->hclk_rga2);\r
 \r
        kfree(data);\r
        return 0;\r