try to fix rga flush timeout reset bug
authorzsq <zsq@rock-chips.com>
Thu, 12 Apr 2012 07:47:06 +0000 (07:47 +0000)
committerzsq <zsq@rock-chips.com>
Thu, 12 Apr 2012 07:47:06 +0000 (07:47 +0000)
drivers/video/rockchip/rga/rga_drv.c
drivers/video/rockchip/rga/rga_mmu_info.c

index 1cfc565bac01ca0dc77e7048a88824ec975b5d26..c54255efae52c9a4780d723d505d9b2e42fdd98a 100755 (executable)
@@ -96,6 +96,8 @@ static struct clk *hclk_rga;
 \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_try_set_reg(uint32_t num);\r
+\r
 \r
 \r
 /* Logging */\r
@@ -263,11 +265,14 @@ static int rga_flush(rga_session *session, unsigned long arg)
        if (unlikely(ret_timeout < 0)) {\r
                pr_err("flush pid %d wait task ret %d\n", session->pid, ret);                    \r
         rga_soft_reset();\r
+        rga_del_running_list();\r
         ret = -ETIMEDOUT;\r
        } else if (0 == ret_timeout) {\r
                pr_err("flush pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));\r
         printk("bus  = %.8x\n", rga_read(RGA_INT));\r
         rga_soft_reset();\r
+        rga_del_running_list();\r
+        rga_try_set_reg(1);\r
                ret = -ETIMEDOUT;\r
        }\r
 \r
@@ -345,6 +350,7 @@ static void rga_copy_reg(struct rga_reg *reg, uint32_t offset)
     \r
     atomic_add(1, &rga_service.cmd_num);\r
        atomic_add(1, &reg->session->task_running);\r
+    atomic_add(1, &rga_service.total_running);\r
     \r
     cmd_buf = (uint32_t *)rga_service.cmd_buff + offset*28;\r
     reg_p = (uint32_t *)reg->cmd_reg;\r
@@ -573,10 +579,7 @@ static void rga_try_set_reg(uint32_t num)
                 /* Start proc */\r
                 atomic_set(&reg->session->done, 0);                \r
                 rga_write(0x1, RGA_CMD_CTRL);\r
-\r
-                atomic_add(1, &rga_service.total_running);\r
-                atomic_add(1, &reg->session->task_running);\r
-\r
+                \r
                 #if RGA_TEST\r
                 {\r
                     uint32_t i;\r
@@ -765,12 +768,15 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req)
     {\r
                pr_err("sync pid %d wait task ret %d\n", session->pid, ret_timeout);        \r
         rga_soft_reset();\r
+        rga_del_running_list();\r
         ret = -ETIMEDOUT;\r
        } \r
     else if (0 == ret_timeout)\r
     {\r
                pr_err("sync pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));\r
         rga_soft_reset();\r
+        rga_del_running_list();\r
+        rga_try_set_reg(1);\r
                ret = -ETIMEDOUT;\r
        }\r
 \r
@@ -1175,7 +1181,6 @@ static int __init rga_init(void)
        }\r
 \r
     //rga_test_0();\r
-    //rga_test_1();\r
     \r
        INFO("Module initialized.\n");  \r
     \r
index c9e6763977057bff2fab65a6612c8fec2e0f67a6..e41c3dc41ddec1157f520433bcfad48426567dc4 100755 (executable)
@@ -220,7 +220,6 @@ static int rga_MapUserMemory(struct page **pages,
     uint32_t i;\r
     uint32_t status;\r
     uint32_t Address;\r
-    uint32_t t_mem;\r
     status = 0;\r
     Address = 0;\r
 \r
@@ -243,10 +242,8 @@ static int rga_MapUserMemory(struct page **pages,
             struct vm_area_struct *vma;\r
 \r
             for(i=0; i<pageCount; i++)\r
-            {\r
-                t_mem = (Memory + i) << PAGE_SHIFT;\r
-                \r
-                vma = find_vma(current->mm, t_mem);\r
+            {                \r
+                vma = find_vma(current->mm, (Memory + i) << PAGE_SHIFT);\r
 \r
                 if (vma && (vma->vm_flags & VM_PFNMAP) )\r
                 {\r
@@ -255,15 +252,24 @@ static int rga_MapUserMemory(struct page **pages,
                         pte_t       * pte;\r
                         spinlock_t  * ptl;\r
                         unsigned long pfn;                                                                        \r
+                        pgd_t * pgd;\r
+                        pud_t * pud;\r
+                        \r
+                        pgd = pgd_offset(current->mm, (Memory + i) << PAGE_SHIFT);\r
 \r
-                        pgd_t * pgd = pgd_offset(current->mm, t_mem);\r
-                        pud_t * pud = pud_offset(pgd, t_mem);\r
+                        if(pgd_val(*pgd) == 0)\r
+                        {\r
+                            printk("pgd value is zero \n");\r
+                            break;\r
+                        }\r
+                        \r
+                        pud = pud_offset(pgd, (Memory + i) << PAGE_SHIFT);\r
                         if (pud)\r
                         {\r
-                            pmd_t * pmd = pmd_offset(pud, t_mem);\r
+                            pmd_t * pmd = pmd_offset(pud, (Memory + i) << PAGE_SHIFT);\r
                             if (pmd)\r
                             {\r
-                                pte = pte_offset_map_lock(current->mm, pmd, t_mem, &ptl);\r
+                                pte = pte_offset_map_lock(current->mm, pmd, (Memory + i) << PAGE_SHIFT, &ptl);\r
                                 if (!pte)\r
                                 {\r
                                     break;\r
@@ -280,7 +286,7 @@ static int rga_MapUserMemory(struct page **pages,
                         }\r
 \r
                         pfn = pte_pfn(*pte);\r
-                        Address = ((pfn << PAGE_SHIFT) | (((unsigned long)t_mem) & ~PAGE_MASK));                        \r
+                        Address = ((pfn << PAGE_SHIFT) | (((unsigned long)((Memory + i) << PAGE_SHIFT)) & ~PAGE_MASK));                        \r
                         pte_unmap_unlock(pte, ptl);                                                                        \r
                     }\r
                     while (0);\r