fix rga support DMA buf error
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / rga / rga_drv.c
index 38d0683a4ee0f3b4d41e230385f4496ca5cc4a67..b8e38f5328dd5b95c18747d7c5762ffdf5f1014f 100755 (executable)
@@ -27,8 +27,8 @@
 #include <asm/io.h>\r
 #include <linux/irq.h>\r
 #include <linux/interrupt.h>\r
-#include <mach/io.h>\r
-#include <mach/irqs.h>\r
+//#include <mach/io.h>\r
+//#include <mach/irqs.h>\r
 #include <linux/fs.h>\r
 #include <asm/uaccess.h>\r
 #include <linux/miscdevice.h>\r
 #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
 #include "RGA_API.h"\r
 \r
+#define RGA_TEST_CASE 0\r
+\r
 #define RGA_TEST 0\r
 #define RGA_TEST_TIME 0\r
 #define RGA_TEST_FLUSH_TIME 0\r
@@ -60,7 +67,7 @@
 \r
 #define RGA_MAJOR              255\r
 \r
-#if defined(CONFIG_ARCH_RK2928)\r
+#if defined(CONFIG_ARCH_RK2928) || defined(CONFIG_ARCH_RK3026)\r
 #define RK30_RGA_PHYS          RK2928_RGA_PHYS\r
 #define RK30_RGA_SIZE          RK2928_RGA_SIZE\r
 #endif\r
 #define DRIVER_DESC            "RGA Device Driver"\r
 #define DRIVER_NAME            "rga"\r
 \r
-#define RGA_VERSION   "1.001"\r
+#define RGA_VERSION   "1.003"\r
 \r
 ktime_t rga_start;\r
 ktime_t rga_end;\r
 \r
-int rga_num = 0;\r
+rga_session rga_session_global;\r
 \r
 struct rga_drvdata {\r
        struct miscdevice miscdev;\r
@@ -87,14 +94,22 @@ struct rga_drvdata {
        void (*rga_irq_callback)(int rga_retval);   //callback function used by aync call\r
        struct wake_lock wake_lock;\r
 \r
+    struct clk *pd_rga;\r
        struct clk *aclk_rga;\r
-       struct clk *hclk_rga;\r
-       struct clk *pd_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
@@ -115,6 +130,30 @@ static void rga_try_set_reg(void);
 #define INFO(format, args...)\r
 #endif\r
 \r
+#if RGA_TEST\r
+static void print_info(struct rga_req *req)\r
+{\r
+    printk("src : yrgb_addr = %.8x, src.uv_addr = %.8x, src.v_addr = %.8x, format = %d\n",\r
+            req->src.yrgb_addr, req->src.uv_addr, req->src.v_addr, req->src.format);\r
+    printk("src : act_w = %d, act_h = %d, vir_w = %d, vir_h = %d\n",\r
+        req->src.act_w, req->src.act_h, req->src.vir_w, req->src.vir_h);\r
+    printk("src : x_off = %.8x y_off = %.8x\n", req->src.x_offset, req->src.y_offset);\r
+\r
+    printk("dst : yrgb_addr = %.8x, dst.uv_addr = %.8x, dst.v_addr = %.8x\n",\r
+            req->dst.yrgb_addr, req->dst.uv_addr, req->dst.v_addr);\r
+    printk("dst : x_off = %.8x y_off = %.8x\n", req->dst.x_offset, req->dst.y_offset);\r
+    printk("dst : act_w = %d, act_h = %d, vir_w = %d, vir_h = %d\n",\r
+        req->dst.act_w, req->dst.act_h, req->dst.vir_w, req->dst.vir_h);\r
+\r
+    printk("clip.xmin = %d, clip.xmax = %d. clip.ymin = %d, clip.ymax = %d\n",\r
+        req->clip.xmin, req->clip.xmax, req->clip.ymin, req->clip.ymax);\r
+\r
+    //printk("alpha_rop_flag = %.8x\n", req->alpha_rop_flag);\r
+    //printk("alpha_rop_mode = %.8x\n", req->alpha_rop_mode);\r
+    //printk("PD_mode = %.8x\n", req->PD_mode);\r
+}\r
+#endif\r
+\r
 \r
 static inline void rga_write(u32 b, u32 r)\r
 {\r
@@ -161,6 +200,8 @@ static void rga_dump(void)
     /* Dump waiting list info */\r
     if (!list_empty(&rga_service.waiting))\r
     {\r
+        list_head      *next;\r
+\r
         next = &rga_service.waiting;\r
 \r
         printk("rga_service dump waiting list\n");\r
@@ -181,6 +222,8 @@ static void rga_dump(void)
     {\r
         printk("rga_service dump running list\n");\r
 \r
+        list_head      *next;\r
+\r
         next = &rga_service.running;\r
         do\r
         {\r
@@ -229,9 +272,9 @@ static void rga_power_on(void)
        if (rga_service.enable)\r
                return;\r
 \r
-       clk_enable(drvdata->aclk_rga);\r
-       clk_enable(drvdata->hclk_rga);\r
-       clk_enable(drvdata->pd_rga);\r
+       clk_prepare_enable(drvdata->aclk_rga);\r
+       clk_prepare_enable(drvdata->hclk_rga);\r
+       //clk_prepare_enable(drvdata->pd_rga);\r
        wake_lock(&drvdata->wake_lock);\r
        rga_service.enable = true;\r
 }\r
@@ -253,9 +296,9 @@ static void rga_power_off(void)
                rga_dump();\r
        }\r
 \r
-       clk_disable(drvdata->pd_rga);\r
-       clk_disable(drvdata->aclk_rga);\r
-       clk_disable(drvdata->hclk_rga);\r
+       //clk_disable_unprepare(drvdata->pd_rga);\r
+       clk_disable_unprepare(drvdata->aclk_rga);\r
+       clk_disable_unprepare(drvdata->hclk_rga);\r
        wake_unlock(&drvdata->wake_lock);\r
        rga_service.enable = false;\r
 }\r
@@ -282,17 +325,17 @@ static int rga_flush(rga_session *session, unsigned long arg)
     start = ktime_get();\r
     #endif\r
 \r
-    ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
+    ret_timeout = wait_event_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
 \r
        if (unlikely(ret_timeout < 0)) {\r
-               pr_err("flush pid %d wait task ret %d\n", session->pid, ret);\r
+               //pr_err("flush pid %d wait task ret %d\n", session->pid, ret);\r
         mutex_lock(&rga_service.lock);\r
         rga_del_running_list();\r
         mutex_unlock(&rga_service.lock);\r
-        ret = -ETIMEDOUT;\r
+        ret = ret_timeout;\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
+               //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
         mutex_lock(&rga_service.lock);\r
         rga_del_running_list_timeout();\r
         rga_try_set_reg();\r
@@ -322,7 +365,6 @@ static int rga_get_result(rga_session *session, unsigned long arg)
 \r
        if (unlikely(copy_to_user((void __user *)arg, &num_done, sizeof(int)))) {\r
                        printk("copy_to_user failed\n");\r
-                       ERR("copy_to_user failed\n");\r
                        ret =  -EFAULT;\r
                }\r
        return ret;\r
@@ -338,7 +380,7 @@ static int rga_check_param(const struct rga_req *req)
     {\r
        if (unlikely((req->src.act_w <= 0) || (req->src.act_w > 8191) || (req->src.act_h <= 0) || (req->src.act_h > 8191)))\r
         {\r
-               ERR("invalid source resolution act_w = %d, act_h = %d\n", req->src.act_w, req->src.act_h);\r
+               printk("invalid source resolution act_w = %d, act_h = %d\n", req->src.act_w, req->src.act_h);\r
                return  -EINVAL;\r
        }\r
     }\r
@@ -347,7 +389,7 @@ static int rga_check_param(const struct rga_req *req)
     {\r
        if (unlikely((req->src.vir_w <= 0) || (req->src.vir_w > 8191) || (req->src.vir_h <= 0) || (req->src.vir_h > 8191)))\r
         {\r
-               ERR("invalid source resolution vir_w = %d, vir_h = %d\n", req->src.vir_w, req->src.vir_h);\r
+               printk("invalid source resolution vir_w = %d, vir_h = %d\n", req->src.vir_w, req->src.vir_h);\r
                return  -EINVAL;\r
        }\r
     }\r
@@ -355,26 +397,29 @@ static int rga_check_param(const struct rga_req *req)
        //check dst width and height\r
        if (unlikely((req->dst.act_w <= 0) || (req->dst.act_w > 2048) || (req->dst.act_h <= 0) || (req->dst.act_h > 2048)))\r
     {\r
-               ERR("invalid destination resolution act_w = %d, act_h = %d\n", req->dst.act_w, req->dst.act_h);\r
+               printk("invalid destination resolution act_w = %d, act_h = %d\n", req->dst.act_w, req->dst.act_h);\r
                return  -EINVAL;\r
        }\r
 \r
     if (unlikely((req->dst.vir_w <= 0) || (req->dst.vir_w > 4096) || (req->dst.vir_h <= 0) || (req->dst.vir_h > 2048)))\r
     {\r
-               ERR("invalid destination resolution vir_w = %d, vir_h = %d\n", req->dst.vir_w, req->dst.vir_h);\r
+               printk("invalid destination resolution vir_w = %d, vir_h = %d\n", req->dst.vir_w, req->dst.vir_h);\r
                return  -EINVAL;\r
        }\r
 \r
        //check src_vir_w\r
        if(unlikely(req->src.vir_w < req->src.act_w)){\r
-               ERR("invalid src_vir_w act_w = %d, vir_w = %d\n", req->src.act_w, req->src.vir_w);\r
+               printk("invalid src_vir_w act_w = %d, vir_w = %d\n", req->src.act_w, req->src.vir_w);\r
                return  -EINVAL;\r
        }\r
 \r
        //check dst_vir_w\r
        if(unlikely(req->dst.vir_w < req->dst.act_w)){\r
-               ERR("invalid dst_vir_w act_h = %d, vir_h = %d\n", req->dst.act_w, req->dst.vir_w);\r
-               return  -EINVAL;\r
+        if(req->rotate_mode != 1)\r
+        {\r
+                   printk("invalid dst_vir_w act_h = %d, vir_h = %d\n", req->dst.act_w, req->dst.vir_w);\r
+                   return      -EINVAL;\r
+        }\r
        }\r
 \r
        return 0;\r
@@ -419,8 +464,6 @@ static struct rga_reg * rga_reg_init(rga_session *session, struct rga_req *req)
        INIT_LIST_HEAD(&reg->session_link);\r
        INIT_LIST_HEAD(&reg->status_link);\r
 \r
-    //memcpy(&reg->req, req, sizeof(struct rga_req));\r
-\r
     reg->MMU_base = NULL;\r
 \r
     if (req->mmu_info.mmu_en)\r
@@ -589,7 +632,7 @@ static void rga_try_set_reg(void)
             rga_soft_reset();\r
             #endif\r
 \r
-            rga_write(0x0, RGA_SYS_CTRL);                        \r
+            rga_write(0x0, RGA_SYS_CTRL);\r
             rga_write(0, RGA_MMU_CTRL);\r
 \r
             /* CMD buff */\r
@@ -613,6 +656,10 @@ static void rga_try_set_reg(void)
             /* All CMD finish int */\r
             rga_write(rga_read(RGA_INT)|(0x1<<10)|(0x1<<8), RGA_INT);\r
 \r
+            #if RGA_TEST_TIME\r
+            rga_start = ktime_get();\r
+            #endif\r
+\r
             /* Start proc */\r
             atomic_set(&reg->session->done, 0);\r
             rga_write(0x1, RGA_CMD_CTRL);\r
@@ -631,29 +678,7 @@ static void rga_try_set_reg(void)
 }\r
 \r
 \r
-#if RGA_TEST\r
-static void print_info(struct rga_req *req)\r
-{\r
-    printk("src.yrgb_addr = %.8x, src.uv_addr = %.8x, src.v_addr = %.8x\n",\r
-            req->src.yrgb_addr, req->src.uv_addr, req->src.v_addr);\r
-    printk("src : act_w = %d, act_h = %d, vir_w = %d, vir_h = %d\n",\r
-        req->src.act_w, req->src.act_h, req->src.vir_w, req->src.vir_h);\r
-    printk("src : x_offset = %.8x y_offset = %.8x\n", req->src.x_offset, req->src.y_offset);\r
-\r
-    printk("dst.yrgb_addr = %.8x, dst.uv_addr = %.8x, dst.v_addr = %.8x\n",\r
-            req->dst.yrgb_addr, req->dst.uv_addr, req->dst.v_addr);\r
-    printk("dst : x_offset = %.8x y_offset = %.8x\n", req->dst.x_offset, req->dst.y_offset);\r
-    printk("dst : act_w = %d, act_h = %d, vir_w = %d, vir_h = %d\n",\r
-        req->dst.act_w, req->dst.act_h, req->dst.vir_w, req->dst.vir_h);\r
-\r
-    printk("clip.xmin = %d, clip.xmax = %d. clip.ymin = %d, clip.ymax = %d\n",\r
-        req->clip.xmin, req->clip.xmax, req->clip.ymin, req->clip.ymax);\r
 \r
-    printk("alpha_rop_flag = %.8x\n", req->alpha_rop_flag);\r
-    printk("alpha_rop_mode = %.8x\n", req->alpha_rop_mode);\r
-    printk("PD_mode = %.8x\n", req->PD_mode);\r
-}\r
-#endif\r
 \r
 /* Caller must hold rga_service.lock */\r
 static void rga_del_running_list(void)\r
@@ -675,7 +700,7 @@ static void rga_del_running_list(void)
         if(list_empty(&reg->session->waiting))\r
         {\r
             atomic_set(&reg->session->done, 1);\r
-            wake_up_interruptible_sync(&reg->session->wait);\r
+            wake_up(&reg->session->wait);\r
         }\r
 \r
         rga_reg_deinit(reg);\r
@@ -699,9 +724,9 @@ static void rga_del_running_list_timeout(void)
         atomic_sub(1, &reg->session->task_running);\r
         atomic_sub(1, &rga_service.total_running);\r
 \r
-        printk("RGA soft reset for timeout process\n");\r
+        //printk("RGA soft reset for timeout process\n");\r
         rga_soft_reset();\r
-        \r
+\r
 \r
         #if 0\r
         printk("RGA_INT is %.8x\n", rga_read(RGA_INT));\r
@@ -722,7 +747,7 @@ static void rga_del_running_list_timeout(void)
         if(list_empty(&reg->session->waiting))\r
         {\r
             atomic_set(&reg->session->done, 1);\r
-            wake_up_interruptible_sync(&reg->session->wait);\r
+            wake_up(&reg->session->wait);\r
         }\r
 \r
         rga_reg_deinit(reg);\r
@@ -766,6 +791,37 @@ static void rga_mem_addr_sel(struct rga_req *req)
 }\r
 \r
 \r
+static int rga_convert_dma_buf(struct rga_req *req)\r
+{\r
+       struct ion_handle *hdl;\r
+       ion_phys_addr_t phy_addr;\r
+       size_t len;\r
+\r
+    if(req->src.yrgb_addr) {\r
+        hdl = ion_import_dma_buf(drvdata->ion_client, req->src.yrgb_addr);\r
+           ion_phys(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
+    }\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(drvdata->ion_client, req->dst.yrgb_addr);\r
+           ion_phys(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
+    }\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
@@ -779,12 +835,19 @@ static int rga_blit(rga_session *session, struct rga_req *req)
     sah = req->src.act_h;\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
-            /* generate 2 cmd for pre scale */            \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
                if(ret == -EINVAL) {\r
@@ -814,10 +877,9 @@ static int rga_blit(rga_session *session, struct rga_req *req)
                 break;\r
             }\r
             num = 2;\r
-            \r
+\r
         }\r
-        else\r
-        {\r
+        else {\r
             /* check value if legal */\r
             ret = rga_check_param(req);\r
                if(ret == -EINVAL) {\r
@@ -826,9 +888,7 @@ static int rga_blit(rga_session *session, struct rga_req *req)
                }\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
@@ -855,11 +915,10 @@ static int rga_blit_async(rga_session *session, struct rga_req *req)
 \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
     return ret;\r
 }\r
 \r
@@ -870,32 +929,22 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req)
 \r
     #if RGA_TEST\r
     printk("*** rga_blit_sync proc ***\n");\r
-    print_info(req);\r
-    #endif\r
-\r
-    #if RGA_TEST_TIME\r
-    rga_start = ktime_get();\r
     #endif\r
 \r
+    atomic_set(&session->done, 0);\r
     ret = rga_blit(session, req);\r
     if(ret < 0)\r
-    {\r
         return ret;\r
-    }\r
 \r
-    ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
+    ret_timeout = wait_event_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
 \r
-    if (unlikely(ret_timeout< 0))\r
-    {\r
-               pr_err("sync pid %d wait task ret %d\n", session->pid, ret_timeout);\r
+    if (unlikely(ret_timeout< 0)) {\r
         mutex_lock(&rga_service.lock);\r
         rga_del_running_list();\r
         mutex_unlock(&rga_service.lock);\r
-        ret = -ETIMEDOUT;\r
+        ret = ret_timeout;\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
+    else if (0 == ret_timeout) {\r
         mutex_lock(&rga_service.lock);\r
         rga_del_running_list_timeout();\r
         rga_try_set_reg();\r
@@ -915,38 +964,34 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req)
 \r
 static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)\r
 {\r
-    struct rga_req *req;\r
+    struct rga_req req;\r
        int ret = 0;\r
-    rga_session *session = (rga_session *)file->private_data;\r
+    rga_session *session;\r
 \r
-       if (NULL == session)\r
-    {\r
+    mutex_lock(&rga_service.mutex);\r
+\r
+    session = (rga_session *)file->private_data;\r
+\r
+       if (NULL == session) {\r
         printk("%s [%d] rga thread session is null\n",__FUNCTION__,__LINE__);\r
+        mutex_unlock(&rga_service.mutex);\r
                return -EINVAL;\r
        }\r
 \r
-    req = kzalloc(sizeof(struct rga_req), GFP_KERNEL);\r
-    if(req == NULL)\r
-    {\r
-        printk("%s [%d] get rga_req mem failed\n",__FUNCTION__,__LINE__);\r
-        return -EINVAL;\r
-    }\r
-\r
-       mutex_lock(&rga_service.mutex);\r
+    memset(&req, 0x0, sizeof(req));\r
 \r
-       switch (cmd)\r
-       {\r
+       switch (cmd) {\r
                case RGA_BLIT_SYNC:\r
-               if (unlikely(copy_from_user(req, (struct rga_req*)arg, sizeof(struct rga_req))))\r
+               if (unlikely(copy_from_user(&req, (struct rga_req*)arg, sizeof(struct rga_req))))\r
             {\r
                        ERR("copy_from_user failed\n");\r
                        ret = -EFAULT;\r
                 break;\r
                }\r
-            ret = rga_blit_sync(session, req);\r
+            ret = rga_blit_sync(session, &req);\r
             break;\r
                case RGA_BLIT_ASYNC:\r
-               if (unlikely(copy_from_user(req, (struct rga_req*)arg, sizeof(struct rga_req))))\r
+               if (unlikely(copy_from_user(&req, (struct rga_req*)arg, sizeof(struct rga_req))))\r
             {\r
                        ERR("copy_from_user failed\n");\r
                        ret = -EFAULT;\r
@@ -955,11 +1000,11 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 \r
             if((atomic_read(&rga_service.total_running) > 16))\r
             {\r
-                           ret = rga_blit_sync(session, req);\r
+                           ret = rga_blit_sync(session, &req);\r
             }\r
             else\r
             {\r
-                ret = rga_blit_async(session, req);\r
+                ret = rga_blit_async(session, &req);\r
             }\r
                        break;\r
                case RGA_FLUSH:\r
@@ -980,11 +1025,50 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 \r
        mutex_unlock(&rga_service.mutex);\r
 \r
-        kfree(req);\r
+       return ret;\r
+}\r
+\r
+\r
+long rga_ioctl_kernel(struct rga_req *req)\r
+{\r
+       int ret = 0;\r
+    rga_session *session;\r
+\r
+    mutex_lock(&rga_service.mutex);\r
+\r
+    session = &rga_session_global;\r
+\r
+       if (NULL == session) {\r
+        printk("%s [%d] rga thread session is null\n",__FUNCTION__,__LINE__);\r
+        mutex_unlock(&rga_service.mutex);\r
+               return -EINVAL;\r
+       }\r
+\r
+       switch (RGA_BLIT_SYNC) {\r
+               case RGA_BLIT_SYNC:\r
+            ret = rga_blit_sync(session, req);\r
+            break;\r
+               case RGA_BLIT_ASYNC:\r
+                       break;\r
+               case RGA_FLUSH:\r
+                       break;\r
+        case RGA_GET_RESULT:\r
+            break;\r
+        case RGA_GET_VERSION:\r
+            //ret = 0;\r
+            break;\r
+               default:\r
+                       ERR("unknown ioctl cmd!\n");\r
+                       ret = -EINVAL;\r
+                       break;\r
+       }\r
+\r
+       mutex_unlock(&rga_service.mutex);\r
 \r
        return ret;\r
 }\r
 \r
+\r
 static int rga_open(struct inode *inode, struct file *file)\r
 {\r
     rga_session *session = kzalloc(sizeof(rga_session), GFP_KERNEL);\r
@@ -1029,7 +1113,7 @@ static int rga_release(struct inode *inode, struct file *file)
         /*ͬ²½*/\r
        }\r
 \r
-       wake_up_interruptible_sync(&session->wait);\r
+       wake_up(&session->wait);\r
        mutex_lock(&rga_service.lock);\r
        list_del(&session->list_session);\r
        rga_service_session_clear(session);\r
@@ -1073,15 +1157,21 @@ static struct miscdevice rga_dev ={
     .fops  = &rga_fops,\r
 };\r
 \r
-static int __devinit rga_drv_probe(struct platform_device *pdev)\r
+\r
+#if defined(CONFIG_OF)\r
+static const struct of_device_id rockchip_rga_dt_ids[] = {\r
+       { .compatible = "rockchip,rga", },\r
+       {},\r
+};\r
+#endif\r
+\r
+static int rga_drv_probe(struct platform_device *pdev)\r
 {\r
        struct rga_drvdata *data;\r
+    struct resource *res;\r
+    //struct device_node *np = pdev->dev.of_node;\r
        int ret = 0;\r
 \r
-       INIT_LIST_HEAD(&rga_service.waiting);\r
-       INIT_LIST_HEAD(&rga_service.running);\r
-       INIT_LIST_HEAD(&rga_service.done);\r
-       INIT_LIST_HEAD(&rga_service.session);\r
        mutex_init(&rga_service.lock);\r
        mutex_init(&rga_service.mutex);\r
        atomic_set(&rga_service.total_running, 0);\r
@@ -1089,9 +1179,8 @@ static int __devinit rga_drv_probe(struct platform_device *pdev)
        rga_service.last_prc_src_format = 1; /* default is yuv first*/\r
        rga_service.enable = false;\r
 \r
-       data = kzalloc(sizeof(struct rga_drvdata), GFP_KERNEL);\r
-       if(NULL == data)\r
-       {\r
+       data = devm_kzalloc(&pdev->dev, sizeof(struct rga_drvdata), GFP_KERNEL);\r
+       if(! data) {\r
                ERR("failed to allocate driver data.\n");\r
                return -ENOMEM;\r
        }\r
@@ -1099,36 +1188,30 @@ static int __devinit rga_drv_probe(struct platform_device *pdev)
        INIT_DELAYED_WORK(&data->power_off_work, rga_power_off_work);\r
        wake_lock_init(&data->wake_lock, WAKE_LOCK_SUSPEND, "rga");\r
 \r
-       data->pd_rga = clk_get(NULL, "pd_rga");\r
-       data->aclk_rga = clk_get(NULL, "aclk_rga");\r
-       data->hclk_rga = clk_get(NULL, "hclk_rga");\r
+       //data->pd_rga = devm_clk_get(&pdev->dev, "pd_rga");\r
+    data->aclk_rga = devm_clk_get(&pdev->dev, "aclk_rga");\r
+    data->hclk_rga = devm_clk_get(&pdev->dev, "hclk_rga");\r
 \r
-       /* map the memory */\r
-       if (!request_mem_region(RK30_RGA_PHYS, RK30_RGA_SIZE, "rga_io"))\r
-       {\r
-               pr_info("failed to reserve rga HW regs\n");\r
-               return -EBUSY;\r
-       }\r
-    \r
-       data->rga_base = (void*)ioremap_nocache(RK30_RGA_PHYS, RK30_RGA_SIZE);\r
-       if (data->rga_base == NULL)\r
-       {\r
+    /* map the registers */\r
+       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);\r
+       data->rga_base = devm_ioremap_resource(&pdev->dev, res);\r
+       if (!data->rga_base) {\r
                ERR("rga ioremap failed\n");\r
                ret = -ENOENT;\r
                goto err_ioremap;\r
        }\r
 \r
        /* get the IRQ */\r
-       data->irq = platform_get_irq(pdev, 0);\r
-       if (data->irq <= 0)\r
-       {\r
+       data->irq = ret = platform_get_irq(pdev, 0);\r
+       if (ret <= 0) {\r
                ERR("failed to get rga irq resource (%d).\n", data->irq);\r
                ret = data->irq;\r
                goto err_irq;\r
        }\r
 \r
        /* request the IRQ */\r
-       ret = request_threaded_irq(data->irq, rga_irq, rga_irq_thread, 0, "rga", pdev);\r
+       //ret = request_threaded_irq(data->irq, rga_irq, rga_irq_thread, 0, "rga", pdev);\r
+    ret = devm_request_threaded_irq(&pdev->dev, data->irq, rga_irq, rga_irq_thread, 0, "rga", data);\r
        if (ret)\r
        {\r
                ERR("rga request_irq failed (%d).\n", ret);\r
@@ -1138,6 +1221,16 @@ static int __devinit rga_drv_probe(struct platform_device *pdev)
        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
@@ -1155,7 +1248,7 @@ err_irq:
        iounmap(data->rga_base);\r
 err_ioremap:\r
        wake_lock_destroy(&data->wake_lock);\r
-       kfree(data);\r
+       //kfree(data);\r
 \r
        return ret;\r
 }\r
@@ -1170,20 +1263,21 @@ static int rga_drv_remove(struct platform_device *pdev)
        free_irq(data->irq, &data->miscdev);\r
        iounmap((void __iomem *)(data->rga_base));\r
 \r
-       clk_put(data->pd_rga);\r
-       clk_put(data->aclk_rga);\r
-       clk_put(data->hclk_rga);\r
+       //clk_put(data->pd_rga);\r
+       devm_clk_put(&pdev->dev, data->aclk_rga);\r
+       devm_clk_put(&pdev->dev, data->hclk_rga);\r
 \r
-       kfree(data);\r
+       //kfree(data);\r
        return 0;\r
 }\r
 \r
 static struct platform_driver rga_driver = {\r
        .probe          = rga_drv_probe,\r
-       .remove         = __devexit_p(rga_drv_remove),\r
+       .remove         = rga_drv_remove,\r
        .driver         = {\r
                .owner  = THIS_MODULE,\r
                .name   = "rga",\r
+               .of_match_table = of_match_ptr(rockchip_rga_dt_ids),\r
        },\r
 };\r
 \r
@@ -1228,7 +1322,30 @@ static int __init rga_init(void)
                        return ret;\r
        }\r
 \r
-    //rga_test_0();\r
+    {\r
+        rga_session_global.pid = 0x0000ffff;\r
+        INIT_LIST_HEAD(&rga_session_global.waiting);\r
+        INIT_LIST_HEAD(&rga_session_global.running);\r
+        INIT_LIST_HEAD(&rga_session_global.list_session);\r
+\r
+        INIT_LIST_HEAD(&rga_service.waiting);\r
+           INIT_LIST_HEAD(&rga_service.running);\r
+           INIT_LIST_HEAD(&rga_service.done);\r
+           INIT_LIST_HEAD(&rga_service.session);\r
+\r
+        init_waitqueue_head(&rga_session_global.wait);\r
+        //mutex_lock(&rga_service.lock);\r
+        list_add_tail(&rga_session_global.list_session, &rga_service.session);\r
+        //mutex_unlock(&rga_service.lock);\r
+        atomic_set(&rga_session_global.task_running, 0);\r
+        atomic_set(&rga_session_global.num_done, 0);\r
+    }\r
+\r
+\r
+\r
+    #if RGA_TEST_CASE\r
+    rga_test_0();\r
+    #endif\r
 \r
        INFO("Module initialized.\n");\r
 \r
@@ -1256,19 +1373,17 @@ static void __exit rga_exit(void)
 }\r
 \r
 \r
-#if 0\r
+#if RGA_TEST_CASE\r
 \r
-#if 1\r
 extern struct fb_info * rk_get_fb(int fb_id);\r
 EXPORT_SYMBOL(rk_get_fb);\r
 \r
 extern void rk_direct_fb_show(struct fb_info * fbi);\r
 EXPORT_SYMBOL(rk_direct_fb_show);\r
 \r
-#endif\r
-\r
-unsigned int src_buf[320*240];\r
-unsigned int dst_buf[1024*768];\r
+unsigned int src_buf[1920*1080];\r
+unsigned int dst_buf[1920*1080];\r
+//unsigned int tmp_buf[1920*1080 * 2];\r
 \r
 void rga_test_0(void)\r
 {\r
@@ -1278,6 +1393,7 @@ void rga_test_0(void)
     uint32_t i, j;\r
     uint8_t *p;\r
     uint8_t t;\r
+    uint32_t *dst0, *dst1, *dst2;\r
 \r
     struct fb_info *fb;\r
 \r
@@ -1293,17 +1409,17 @@ void rga_test_0(void)
        //file->private_data = (void *)session;\r
 \r
     fb = rk_get_fb(0);\r
-    \r
+\r
     memset(&req, 0, sizeof(struct rga_req));\r
     src = src_buf;\r
     dst = dst_buf;\r
 \r
-    memset(src_buf, 0x80, 320*240*4);\r
+    memset(src_buf, 0x80, 1024*600*4);\r
+\r
+    dmac_flush_range(&src_buf[0], &src_buf[1024*600]);\r
+    outer_flush_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[1024*600]));\r
 \r
-    dmac_flush_range(&src_buf[0], &src_buf[320*240]);\r
-    outer_flush_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
 \r
-   \r
     #if 0\r
     memset(src_buf, 0x80, 800*480*4);\r
     memset(dst_buf, 0xcc, 800*480*4);\r
@@ -1312,343 +1428,73 @@ void rga_test_0(void)
     outer_flush_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[800*480]));\r
     #endif\r
 \r
-    req.src.act_w = 320;\r
-    req.src.act_h = 240;\r
-\r
-    req.src.vir_w = 320;\r
-    req.src.vir_h = 240;\r
-    req.src.yrgb_addr = (uint32_t)src;\r
-    req.src.uv_addr = (uint32_t)virt_to_phys(src);\r
-    req.src.v_addr = (uint32_t)virt_to_phys(src);\r
-    req.src.format = 0;\r
-\r
-    req.dst.act_w = 320;\r
-    req.dst.act_h = 240;\r
-\r
-    req.dst.vir_w = 1024;\r
-    req.dst.vir_h = 768;\r
-    req.dst.x_offset = 0;\r
-    req.dst.y_offset = 0;\r
-    req.dst.yrgb_addr = (uint32_t)dst;\r
-\r
-    //req.dst.format = RK_FORMAT_RGB_565;\r
-\r
-    req.clip.xmin = 0;\r
-    req.clip.xmax = 1023;\r
-    req.clip.ymin = 0;\r
-    req.clip.ymax = 767;\r
-\r
-    //req.render_mode = color_fill_mode;\r
-    //req.fg_color = 0x80ffffff;\r
-\r
-    //req.rotate_mode = 1;\r
-    //req.scale_mode = 2;\r
-\r
-    //req.alpha_rop_flag = 1;\r
-    //req.alpha_rop_mode = 0x19;\r
-    req.PD_mode = 3;\r
-\r
-    req.sina = 0;\r
-    req.cosa = 65536;\r
-\r
-    req.mmu_info.mmu_flag = 0x21;\r
-    req.mmu_info.mmu_en = 1;\r
-\r
-    rga_blit_sync(&session, &req);\r
-\r
-    dmac_inv_range(&dst_buf[0], &dst_buf[320*240]);\r
-    outer_inv_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[320*240]));\r
-\r
-    for(j=0; j<17; j++)\r
-    {\r
-        for(i=0; i<8; i++)\r
-        {\r
-            printk("%.8x, ", dst_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-\r
-        for(i=8; i<16; i++)\r
-        {\r
-            printk("%.8x, ", dst_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-    }\r
-\r
-    p = (uint8_t *)src_buf;\r
-    p = p + 16 * 4;\r
-\r
-    for(i=0; i<16; i++)\r
-        src_buf[i] = 0;\r
-\r
-    for(j=0; j<16; j++)\r
-    {\r
-        for(i=0; i<16; i++)\r
-        {\r
-            t = j*16 + i;\r
-            src_buf[(j+1)*16 + i] = (t<<24)|(t<<16)|(t<<8)|t;\r
-        }\r
-    }\r
-\r
-    dmac_flush_range(&src_buf[0], &src_buf[320*240]);\r
-    outer_flush_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
+    dst0 = &dst_buf[0];\r
+    //dst1 = &dst_buf[1280*800*4];\r
+    //dst2 = &dst_buf[1280*800*4*2];\r
 \r
-    dmac_inv_range(&src_buf[0], &src_buf[320*240]);\r
-    outer_inv_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
+    i = j = 0;\r
 \r
-    printk("SRC DATA \n");\r
-    for(j=0; j<17; j++)\r
-    {\r
-        for(i=0; i<8; i++)\r
-        {\r
-            printk("%.8x, ", src_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
+    printk("\n********************************\n");\r
+    printk("************ RGA_TEST ************\n");\r
+    printk("********************************\n\n");\r
 \r
-        for(i=8; i<16; i++)\r
-        {\r
-            printk("%.8x, ", src_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-    }    \r
+    req.src.act_w = 1024;\r
+    req.src.act_h = 600;\r
 \r
-    req.src.act_w = 320;\r
-    req.src.act_h = 240;\r
-\r
-    req.src.vir_w = 320;\r
-    req.src.vir_h = 240;\r
-    req.src.yrgb_addr = (uint32_t)src;\r
-    req.src.uv_addr = (uint32_t)virt_to_phys(src);\r
+    req.src.vir_w = 1024;\r
+    req.src.vir_h = 600;\r
+    req.src.yrgb_addr = (uint32_t)virt_to_phys(src);\r
+    req.src.uv_addr = (uint32_t)(req.src.yrgb_addr + 1080*1920);\r
     req.src.v_addr = (uint32_t)virt_to_phys(src);\r
-    req.src.format = 0;\r
+    req.src.format = RK_FORMAT_RGBA_8888;\r
 \r
-    req.dst.act_w = 320;\r
-    req.dst.act_h = 240;\r
+    req.dst.act_w = 600;\r
+    req.dst.act_h = 352;\r
 \r
-    req.dst.vir_w = 1024;\r
-    req.dst.vir_h = 768;\r
-    req.dst.x_offset = 0;\r
+    req.dst.vir_w = 1280;\r
+    req.dst.vir_h = 800;\r
+    req.dst.x_offset = 600;\r
     req.dst.y_offset = 0;\r
-    req.dst.yrgb_addr = (uint32_t)(dst);\r
 \r
-    //req.dst.format = RK_FORMAT_RGB_565;\r
+    dst = dst0;\r
 \r
-    req.clip.xmin = 0;\r
-    req.clip.xmax = 1023;\r
-    req.clip.ymin = 0;\r
-    req.clip.ymax = 767;\r
-\r
-    //req.render_mode = color_fill_mode;\r
-    //req.fg_color = 0x80ffffff;\r
-\r
-    //req.rotate_mode = 1;\r
-    //req.scale_mode = 2;\r
-\r
-    req.alpha_rop_flag = 0x19;\r
-    req.alpha_rop_mode = 0x1;\r
-    req.PD_mode = 3;\r
-\r
-    req.sina = 0;\r
-    req.cosa = 65536;\r
-\r
-    req.mmu_info.mmu_flag = 0x21;\r
-    req.mmu_info.mmu_en = 1;\r
-    \r
-    rga_blit_sync(&session, &req);\r
-\r
-    dmac_inv_range(&dst_buf[0], &dst_buf[320*240]);\r
-    outer_inv_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[320*240]));\r
-\r
-    for(j=0; j<17; j++)\r
-    {\r
-        for(i=0; i<8; i++)\r
-        {\r
-            printk("%.8x, ", dst_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-        for(i=8; i<16; i++)\r
-        {\r
-            printk("%.8x, ", dst_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-    }\r
-\r
-    memset(src_buf, 0x80, 320*240*4);\r
-\r
-    dmac_flush_range(&src_buf[0], &src_buf[320*240]);\r
-    outer_flush_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
-\r
-   \r
-    #if 0\r
-    memset(src_buf, 0x80, 800*480*4);\r
-    memset(dst_buf, 0xcc, 800*480*4);\r
-\r
-    dmac_flush_range(&dst_buf[0], &dst_buf[800*480]);\r
-    outer_flush_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[800*480]));\r
-    #endif\r
-\r
-    req.src.act_w = 320;\r
-    req.src.act_h = 240;\r
-\r
-    req.src.vir_w = 320;\r
-    req.src.vir_h = 240;\r
-    req.src.yrgb_addr = (uint32_t)(src);\r
-    req.src.uv_addr = (uint32_t)virt_to_phys(src);\r
-    req.src.v_addr = (uint32_t)virt_to_phys(src);\r
-    req.src.format = 0;\r
-\r
-    req.dst.act_w = 320;\r
-    req.dst.act_h = 240;\r
-\r
-    req.dst.vir_w = 1024;\r
-    req.dst.vir_h = 768;\r
-    req.dst.x_offset = 0;\r
-    req.dst.y_offset = 0;\r
-    req.dst.yrgb_addr = (uint32_t)(dst);\r
+    req.dst.yrgb_addr = ((uint32_t)virt_to_phys(dst));\r
 \r
     //req.dst.format = RK_FORMAT_RGB_565;\r
 \r
     req.clip.xmin = 0;\r
-    req.clip.xmax = 1023;\r
+    req.clip.xmax = 1279;\r
     req.clip.ymin = 0;\r
-    req.clip.ymax = 767;\r
+    req.clip.ymax = 799;\r
 \r
     //req.render_mode = color_fill_mode;\r
     //req.fg_color = 0x80ffffff;\r
 \r
-    //req.rotate_mode = 1;\r
+    req.rotate_mode = 1;\r
     //req.scale_mode = 2;\r
 \r
-    req.alpha_rop_flag = 0;\r
-    req.alpha_rop_mode = 0x0;\r
-\r
-    req.sina = 0;\r
-    req.cosa = 65536;\r
-\r
-    req.mmu_info.mmu_flag = 0x21;\r
-    req.mmu_info.mmu_en = 1;\r
-\r
-    rga_blit_sync(&session, &req);\r
-\r
-    dmac_inv_range(&dst_buf[0], &dst_buf[320*240]);\r
-    outer_inv_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[320*240]));\r
-\r
-    for(j=0; j<17; j++)\r
-    {\r
-        for(i=0; i<8; i++)\r
-        {\r
-            printk("%.8x, ", dst_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-\r
-        for(i=8; i<16; i++)\r
-        {\r
-            printk("%.8x, ", dst_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-    }\r
-\r
-    p = (uint8_t *)src_buf;\r
-    p = p + 16 * 4;\r
-\r
-    for(i=0; i<16; i++)\r
-        src_buf[i] = 0;\r
-\r
-    for(j=0; j<16; j++)\r
-    {\r
-        for(i=0; i<16; i++)\r
-        {\r
-            t = j*16 + i;\r
-            src_buf[(j+1)*16 + i] = (t<<24)|(t<<16)|(t<<8)|t;\r
-        }\r
-    }\r
-\r
-    dmac_inv_range(&src_buf[0], &src_buf[320*240]);\r
-    outer_inv_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
-    printk("SRC DATA \n");\r
-    for(j=0; j<17; j++)\r
-    {\r
-        for(i=0; i<8; i++)\r
-        {\r
-            printk("%.8x, ", src_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-\r
-        for(i=8; i<16; i++)\r
-        {\r
-            printk("%.8x, ", src_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-    }\r
-\r
-    dmac_flush_range(&src_buf[0], &src_buf[320*240]);\r
-    outer_flush_range(virt_to_phys(&src_buf[0]),virt_to_phys(&src_buf[320*240]));\r
-\r
-    req.src.act_w = 320;\r
-    req.src.act_h = 240;\r
-\r
-    req.src.vir_w = 320;\r
-    req.src.vir_h = 240;\r
-    req.src.yrgb_addr = (uint32_t)(src);\r
-    req.src.uv_addr = (uint32_t)virt_to_phys(src);\r
-    req.src.v_addr = (uint32_t)virt_to_phys(src);\r
-    req.src.format = 0;\r
-\r
-    req.dst.act_w = 320;\r
-    req.dst.act_h = 240;\r
-\r
-    req.dst.vir_w = 1024;\r
-    req.dst.vir_h = 768;\r
-    req.dst.x_offset = 0;\r
-    req.dst.y_offset = 0;\r
-    req.dst.yrgb_addr = (uint32_t)(dst);\r
-\r
-    //req.dst.format = RK_FORMAT_RGB_565;\r
+    //req.alpha_rop_flag = 0;\r
+    //req.alpha_rop_mode = 0x19;\r
+    //req.PD_mode = 3;\r
 \r
-    req.clip.xmin = 0;\r
-    req.clip.xmax = 1023;\r
-    req.clip.ymin = 0;\r
-    req.clip.ymax = 767;\r
+    req.sina = 65536;\r
+    req.cosa = 0;\r
 \r
-    //req.render_mode = color_fill_mode;\r
-    //req.fg_color = 0x80ffffff;\r
-\r
-    //req.rotate_mode = 1;\r
-    //req.scale_mode = 2;\r
+    //req.mmu_info.mmu_flag = 0x21;\r
+    //req.mmu_info.mmu_en = 1;\r
 \r
-    req.alpha_rop_flag = 0x19;\r
-    req.alpha_rop_mode = 0x1;\r
-    req.PD_mode = 3;\r
+    //printk("src = %.8x\n", req.src.yrgb_addr);\r
+    //printk("src = %.8x\n", req.src.uv_addr);\r
+    //printk("dst = %.8x\n", req.dst.yrgb_addr);\r
 \r
-    req.sina = 0;\r
-    req.cosa = 65536;\r
 \r
-    req.mmu_info.mmu_flag = 0x21;\r
-    req.mmu_info.mmu_en = 1;\r
-    \r
     rga_blit_sync(&session, &req);\r
 \r
-    dmac_inv_range(&dst_buf[0], &dst_buf[320*240]);\r
-    outer_inv_range(virt_to_phys(&dst_buf[0]),virt_to_phys(&dst_buf[320*240]));\r
-\r
-    for(j=0; j<17; j++)\r
-    {\r
-        for(i=0; i<8; i++)\r
-        {\r
-            printk("%.8x, ", dst_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-        for(i=8; i<16; i++)\r
-        {\r
-            printk("%.8x, ", dst_buf[j*16 + i]);            \r
-        }\r
-        printk("\n");\r
-    }\r
-\r
     #if 1\r
     fb->var.bits_per_pixel = 32;\r
-    \r
-    fb->var.xres = 1024;\r
-    fb->var.yres = 768;\r
+\r
+    fb->var.xres = 1280;\r
+    fb->var.yres = 800;\r
 \r
     fb->var.red.length = 8;\r
     fb->var.red.offset = 0;\r