fix rga2 3368 first proc scale bug
authorShengqin.Zhang <zsq@rock-chips.com>
Mon, 13 Jul 2015 07:05:44 +0000 (15:05 +0800)
committerShengqin.Zhang <zsq@rock-chips.com>
Mon, 13 Jul 2015 07:05:44 +0000 (15:05 +0800)
Signed-off-by: Shengqin.Zhang <zsq@rock-chips.com>
arch/arm64/boot/dts/rk3368.dtsi
drivers/video/rockchip/rga2/rga2.h
drivers/video/rockchip/rga2/rga2_drv.c [changed mode: 0755->0644]
drivers/video/rockchip/rga2/rga2_mmu_info.c

index 9a4f5c783d49055f2188e8ad837dfa577f86a3ee..7586427950b5886e1d6e322abd7e4b85d71cb1da 100755 (executable)
 
        rga@ff920000 {
                compatible = "rockchip,rga2";
+                dev_mode = <1>;
                reg = <0x0 0xff920000 0x0 0x1000>;
                interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&clk_gates16 1>, <&clk_gates16 0>, <&clk_rga>;
index a6d0c3e2b66037f7d4c9b5c5c1a378553c17045c..48ed517c20f97e238356c979effc1db9e3fd140e 100755 (executable)
@@ -676,6 +676,7 @@ struct rga2_service_info {
     int                 last_prc_src_format;\r
     atomic_t            rga_working;\r
     bool                enable;\r
+    uint32_t            dev_mode;\r
 \r
     //struct rga_req      req[10];\r
 \r
old mode 100755 (executable)
new mode 100644 (file)
index e4b5bc6..041847d
@@ -76,6 +76,7 @@ ktime_t rga2_start;
 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
@@ -261,6 +262,7 @@ static void rga2_power_off(void)
        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
@@ -519,7 +521,7 @@ static void rga2_try_set_reg(void)
 \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
@@ -531,7 +533,7 @@ static void rga2_try_set_reg(void)
             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
@@ -628,11 +630,11 @@ static int rga2_convert_dma_buf(struct rga2_req *req)
     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
@@ -655,11 +657,11 @@ static int rga2_convert_dma_buf(struct rga2_req *req)
         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
@@ -682,7 +684,7 @@ static int rga2_convert_dma_buf(struct rga2_req *req)
         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
@@ -819,14 +821,15 @@ static int rga2_blit_sync(rga2_session *session, struct rga2_req *req)
     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
@@ -853,7 +856,22 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
                }\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
@@ -865,15 +883,23 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 \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
@@ -927,7 +953,7 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 #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
@@ -961,7 +987,22 @@ static long compat_rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 \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
@@ -970,13 +1011,29 @@ static long compat_rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
                        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
@@ -1157,6 +1214,7 @@ static int rga2_drv_probe(struct platform_device *pdev)
        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
@@ -1210,6 +1268,7 @@ static int rga2_drv_probe(struct platform_device *pdev)
 \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
index 0d90d539a470be29841a292e4d95365261e7e41a..b7f2a10a5fdfec5552e0bba4a048c574144a15e1 100644 (file)
@@ -67,15 +67,20 @@ static int rga2_mmu_buf_get_try(struct rga2_mmu_buf_t *t, uint32_t size)
 {\r
     mutex_lock(&rga2_service.lock);\r
     if((t->back - t->front) > t->size) {\r
-        if(t->front + size > t->back - t->size)\r
+        if(t->front + size > t->back - t->size) {\r
+           pr_info("front %d, back %d dsize %d size %d", t->front, t->back, t->size, size);\r
             return -1;\r
+       }\r
     }\r
     else {\r
-        if((t->front + size) > t->back)\r
+        if((t->front + size) > t->back) {\r
+           pr_info("front %d, back %d dsize %d size %d", t->front, t->back, t->size, size);\r
             return -1;\r
+       }\r
 \r
         if(t->front + size > t->size) {\r
             if (size > (t->back - t->size)) {\r
+               pr_info("front %d, back %d dsize %d size %d", t->front, t->back, t->size, size);\r
                 return -1;\r
             }\r
             t->front = 0;\r