#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
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
}\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
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
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
}\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
\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
\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
{\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
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