ktime_t rga2_end;\r
\r
int rga2_flag = 0;\r
+int first_RGA2_proc = 0;\r
\r
extern long (*rga_ioctl_kernel_p)(struct rga_req *);\r
\r
clk_disable_unprepare(rga2_drvdata->aclk_rga2);\r
clk_disable_unprepare(rga2_drvdata->hclk_rga2);\r
wake_unlock(&rga2_drvdata->wake_lock);\r
+ first_RGA2_proc = 0;\r
rga2_service.enable = false;\r
}\r
\r
\r
#if RGA2_TEST\r
if(rga2_flag) {\r
- uint32_t i, *p;\r
+ int32_t i, *p;\r
p = rga2_service.cmd_buff;\r
printk("CMD_REG\n");\r
for (i=0; i<8; i++)\r
rga2_write((0x1<<1)|(0x1<<2)|(0x1<<5)|(0x1<<6), RGA2_SYS_CTRL);\r
\r
/* All CMD finish int */\r
- rga2_write(rga2_read(RGA2_INT)|(0x1<<10)|(0x1<<8), RGA2_INT);\r
+ rga2_write(rga2_read(RGA2_INT)|(0x1<<10)|(0x1<<9)|(0x1<<8), RGA2_INT);\r
\r
#if RGA2_TEST_TIME\r
rga2_start = ktime_get();\r
req->sg_dst = NULL;\r
req->sg_els = NULL;\r
\r
- if(req->src.yrgb_addr) {\r
+ if((int)req->src.yrgb_addr > 0) {\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
+ printk("RGA2 SRC ERROR ion buf handle\n");\r
return ret;\r
}\r
if (req->mmu_info.src0_mmu_flag) {\r
req->src.v_addr = req->src.uv_addr + (req->src.vir_w * req->src.vir_h)/4;\r
}\r
\r
- if(req->dst.yrgb_addr) {\r
+ if((int)req->dst.yrgb_addr > 0) {\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
+ printk("RGA2 DST ERROR ion buf handle\n");\r
return ret;\r
}\r
if (req->mmu_info.dst_mmu_flag) {\r
req->dst.v_addr = req->dst.uv_addr + (req->dst.vir_w * req->dst.vir_h)/4;\r
}\r
\r
- if(req->src1.yrgb_addr) {\r
+ if((int)req->src1.yrgb_addr > 0) {\r
hdl = ion_import_dma_buf(rga2_drvdata->ion_client, req->src1.yrgb_addr);\r
if (IS_ERR(hdl)) {\r
ret = PTR_ERR(hdl);\r
return ret;\r
}\r
\r
-\r
static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)\r
{\r
- struct rga2_req req;\r
+ struct rga2_req req, req_first;\r
struct rga_req req_rga;\r
int ret = 0;\r
rga2_session *session;\r
\r
+ return ret;\r
+\r
memset(&req, 0x0, sizeof(req));\r
\r
mutex_lock(&rga2_service.mutex);\r
}\r
RGA_MSG_2_RGA2_MSG(&req_rga, &req);\r
\r
- ret = rga2_blit_sync(session, &req);\r
+ if (first_RGA2_proc == 0 && req.bitblt_mode == bitblt_mode && rga2_service.dev_mode == 1) {\r
+ memcpy(&req_first, &req, sizeof(struct rga2_req));\r
+ if ((req_first.src.act_w != req_first.dst.act_w)\r
+ || (req_first.src.act_h != req_first.dst.act_h)) {\r
+ req_first.src.act_w = MIN(320, MIN(req_first.src.act_w, req_first.dst.act_w));\r
+ req_first.src.act_h = MIN(240, MIN(req_first.src.act_h, req_first.dst.act_h));\r
+ req_first.dst.act_w = req_first.src.act_w;\r
+ req_first.dst.act_h = req_first.src.act_h;\r
+ ret = rga2_blit_async(session, &req_first);\r
+ }\r
+ ret = rga2_blit_sync(session, &req);\r
+ first_RGA2_proc = 1;\r
+ }\r
+ else {\r
+ ret = rga2_blit_sync(session, &req);\r
+ }\r
break;\r
case RGA_BLIT_ASYNC:\r
if (unlikely(copy_from_user(&req_rga, (struct rga_req*)arg, sizeof(struct rga_req))))\r
\r
RGA_MSG_2_RGA2_MSG(&req_rga, &req);\r
\r
- if((atomic_read(&rga2_service.total_running) > 8))\r
- {\r
- ret = rga2_blit_sync(session, &req);\r
+ if (first_RGA2_proc == 0 && req.bitblt_mode == bitblt_mode && rga2_service.dev_mode == 1) {\r
+ memcpy(&req_first, &req, sizeof(struct rga2_req));\r
+ if ((req_first.src.act_w != req_first.dst.act_w)\r
+ || (req_first.src.act_h != req_first.dst.act_h)) {\r
+ req_first.src.act_w = MIN(320, MIN(req_first.src.act_w, req_first.dst.act_w));\r
+ req_first.src.act_h = MIN(240, MIN(req_first.src.act_h, req_first.dst.act_h));\r
+ req_first.dst.act_w = req_first.src.act_w;\r
+ req_first.dst.act_h = req_first.src.act_h;\r
+ ret = rga2_blit_async(session, &req_first);\r
+ }\r
+ ret = rga2_blit_async(session, &req);\r
+ first_RGA2_proc = 1;\r
}\r
- else\r
- {\r
+ else {\r
ret = rga2_blit_async(session, &req);\r
}\r
- break;\r
+ break;\r
case RGA2_BLIT_SYNC:\r
if (unlikely(copy_from_user(&req, (struct rga2_req*)arg, sizeof(struct rga2_req))))\r
{\r
#ifdef CONFIG_COMPAT\r
static long compat_rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)\r
{\r
- struct rga2_req req;\r
+ struct rga2_req req, req_first;\r
struct rga_req_32 req_rga;\r
int ret = 0;\r
rga2_session *session;\r
\r
RGA_MSG_2_RGA2_MSG_32(&req_rga, &req);\r
\r
- ret = rga2_blit_sync(session, &req);\r
+ if (first_RGA2_proc == 0 && req.bitblt_mode == bitblt_mode && rga2_service.dev_mode == 1) {\r
+ memcpy(&req_first, &req, sizeof(struct rga2_req));\r
+ if ((req_first.src.act_w != req_first.dst.act_w)\r
+ || (req_first.src.act_h != req_first.dst.act_h)) {\r
+ req_first.src.act_w = MIN(320, MIN(req_first.src.act_w, req_first.dst.act_w));\r
+ req_first.src.act_h = MIN(240, MIN(req_first.src.act_h, req_first.dst.act_h));\r
+ req_first.dst.act_w = req_first.src.act_w;\r
+ req_first.dst.act_h = req_first.src.act_h;\r
+ ret = rga2_blit_async(session, &req_first);\r
+ }\r
+ ret = rga2_blit_sync(session, &req);\r
+ first_RGA2_proc = 1;\r
+ }\r
+ else {\r
+ ret = rga2_blit_sync(session, &req);\r
+ }\r
break;\r
case RGA_BLIT_ASYNC:\r
if (unlikely(copy_from_user(&req_rga, compat_ptr((compat_uptr_t)arg), sizeof(struct rga_req_32))))\r
ret = -EFAULT;\r
break;\r
}\r
-\r
RGA_MSG_2_RGA2_MSG_32(&req_rga, &req);\r
\r
- if((atomic_read(&rga2_service.total_running) > 8))\r
- ret = rga2_blit_sync(session, &req);\r
- else\r
- ret = rga2_blit_async(session, &req);\r
+ if (first_RGA2_proc == 0 && req.bitblt_mode == bitblt_mode && rga2_service.dev_mode == 1) {\r
+ memcpy(&req_first, &req, sizeof(struct rga2_req));\r
+ if ((req_first.src.act_w != req_first.dst.act_w)\r
+ || (req_first.src.act_h != req_first.dst.act_h)) {\r
+ req_first.src.act_w = MIN(320, MIN(req_first.src.act_w, req_first.dst.act_w));\r
+ req_first.src.act_h = MIN(240, MIN(req_first.src.act_h, req_first.dst.act_h));\r
+ req_first.dst.act_w = req_first.src.act_w;\r
+ req_first.dst.act_h = req_first.src.act_h;\r
+ ret = rga2_blit_async(session, &req_first);\r
+ }\r
+ ret = rga2_blit_sync(session, &req);\r
+ first_RGA2_proc = 1;\r
+ }\r
+ else {\r
+ ret = rga2_blit_sync(session, &req);\r
+ }\r
+\r
+ //if((atomic_read(&rga2_service.total_running) > 8))\r
+ // ret = rga2_blit_sync(session, &req);\r
+ //else\r
+ // ret = rga2_blit_async(session, &req);\r
\r
break;\r
case RGA2_BLIT_SYNC:\r
struct rga2_drvdata_t *data;\r
struct resource *res;\r
int ret = 0;\r
+ struct device_node *np = pdev->dev.of_node;\r
\r
mutex_init(&rga2_service.lock);\r
mutex_init(&rga2_service.mutex);\r
\r
platform_set_drvdata(pdev, data);\r
rga2_drvdata = data;\r
+ of_property_read_u32(np, "dev_mode", &rga2_service.dev_mode);\r
\r
#if defined(CONFIG_ION_ROCKCHIP)\r
data->ion_client = rockchip_ion_client_create("rga");\r