fix mut thread crash bug
authorzsq <zsq@rock-chips.com>
Sun, 8 Apr 2012 08:00:25 +0000 (00:00 -0800)
committerzsq <zsq@rock-chips.com>
Sun, 8 Apr 2012 08:00:25 +0000 (00:00 -0800)
drivers/video/rockchip/rga/RGA_API.c
drivers/video/rockchip/rga/RGA_API.h
drivers/video/rockchip/rga/rga.h
drivers/video/rockchip/rga/rga_drv.c
drivers/video/rockchip/rga/rga_mmu_info.c
drivers/video/rockchip/rga/rga_reg_info.c
drivers/video/rockchip/rga/rga_reg_info.h

index 08dc712d436c210d25007616570c76b4bae55522..ff74da8f7bbe91f7889f9193f9f6370a17a1d00c 100755 (executable)
@@ -78,7 +78,7 @@ matrix_cal(const struct rga_req *msg, TILE_INFO *tile)
 }\r
 \r
 \r
-uint32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1)\r
+int32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1)\r
 {\r
     \r
     struct rga_req *mp;\r
@@ -91,9 +91,21 @@ uint32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1)
     daw = dah = 0;\r
             \r
     mp = msg1;\r
+\r
+    if(msg->dst.act_w == 0) \r
+    {\r
+        printk("%s, [%d] rga dst act_w is zero\n", __FUNCTION__, __LINE__);\r
+        return -EINVAL;\r
+    }\r
+\r
+    if (msg->dst.act_h == 0)\r
+    {\r
+        printk("%s, [%d] rga dst act_w is zero\n", __FUNCTION__, __LINE__);\r
+        return -EINVAL;\r
+    }\r
     w_ratio = (msg->src.act_w << 16) / msg->dst.act_w;\r
     h_ratio = (msg->src.act_h << 16) / msg->dst.act_h;\r
-   \r
+    \r
     memcpy(msg1, msg, sizeof(struct rga_req));\r
 \r
     msg->dst.format = msg->src.format;\r
@@ -117,6 +129,10 @@ uint32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1)
             msg->src.act_w = (daw - 1) << 3;                                                    \r
         }\r
     }\r
+    else\r
+    {\r
+        daw = msg->src.act_w;\r
+    }\r
 \r
     pl = (RGA_pixel_width_init(msg->src.format));\r
     stride = (pl * daw + 3) & (~3);\r
@@ -142,6 +158,10 @@ uint32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1)
             msg->src.act_h = (dah - 1) << 3;                                                    \r
         }\r
     }\r
+    else\r
+    {\r
+        dah = msg->dst.act_h;\r
+    }\r
     \r
     msg->dst.act_h = dah;\r
     msg->dst.vir_h = dah;\r
index 62a8aac4e1445f001ecd0d3a4e021b1ab77723bd..7b966c30cb083224e1b7a6a2c506f39019899f91 100755 (executable)
@@ -7,7 +7,7 @@
 #define ENABLE      1\r
 #define DISABLE     0\r
 \r
-uint32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1);\r
+int32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1);\r
 \r
 \r
 #endif\r
index 01b94b4e9a5d2f4a069c4641624a3bf9ddb9b119..6a528c164b9d7a4cee334c7a3e19c05175894b72 100755 (executable)
@@ -375,6 +375,7 @@ typedef struct rga_service_info {
     atomic_t            cmd_num;\r
     atomic_t            src_format_swt;\r
     int                 last_prc_src_format;\r
+    atomic_t            rga_working;\r
 \r
     struct mutex       mutex;  // mutex\r
 } rga_service_info;\r
index 3adeb55a24d066a0af1c5b2920d00344ece3e722..fb3c5ac6ff947a1badb71159b8c9238ec0d340a8 100755 (executable)
@@ -49,7 +49,6 @@
 #include "rga_mmu_info.h"\r
 #include "RGA_API.h"\r
 \r
-\r
 #define RGA_TEST 0\r
 #define RGA_TEST_TIME 0\r
 #define RGA_TEST_FLUSH_TIME 0\r
@@ -58,7 +57,7 @@
 #define PRE_SCALE_BUF_SIZE  2048*1024*4\r
 \r
 #define RGA_POWER_OFF_DELAY    4*HZ /* 4s */\r
-#define RGA_TIMEOUT_DELAY      2*HZ /* 2s */\r
+#define RGA_TIMEOUT_DELAY      1*HZ /* 1s */\r
 \r
 #define RGA_MAJOR              255\r
 \r
@@ -73,7 +72,7 @@
 ktime_t rga_start;\r
 ktime_t rga_end;\r
 \r
-int num = 0;\r
+int rga_num = 0;\r
 \r
 struct rga_drvdata {\r
        struct miscdevice miscdev;\r
@@ -260,15 +259,16 @@ static int rga_flush(rga_session *session, unsigned long arg)
 \r
     ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
 \r
-    rga_soft_reset();\r
+    \r
     \r
        if (unlikely(ret_timeout < 0)) {\r
-               pr_err("flush pid %d wait task ret %d\n", session->pid, ret);\r
-        rga_del_running_list();\r
+               pr_err("flush pid %d wait task ret %d\n", session->pid, ret);                    \r
+        rga_soft_reset();\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
-        rga_del_running_list();\r
+        printk("bus  = %.8x\n", rga_read(RGA_INT));\r
+        rga_soft_reset();\r
                ret = -ETIMEDOUT;\r
        }\r
 \r
@@ -304,17 +304,16 @@ static int rga_get_result(rga_session *session, unsigned long arg)
 \r
 static int rga_check_param(const struct rga_req *req)\r
 {\r
-       #if 1\r
        /*RGA can support up to 8192*8192 resolution in RGB format,but we limit the image size to 8191*8191 here*/\r
        //check src width and height\r
-       if (unlikely((req->src.act_w < 0) || (req->src.act_w > 8191) || (req->src.act_h < 0) || (req->src.act_h > 8191))) {\r
-               ERR("invalid source resolution\n");\r
+       if (unlikely((req->src.act_w <= 0) || (req->src.act_w > 8191) || (req->src.act_h <= 0) || (req->src.act_h > 8191))) {\r
+               ERR("invalid source resolution act_w = %d, act_h = %d\n", req->src.act_w, req->src.act_h);\r
                return  -EINVAL;\r
        }\r
 \r
        //check dst width and height\r
-       if (unlikely((req->dst.act_w < 0) || (req->dst.act_w > 2048) || (req->dst.act_h < 16) || (req->dst.act_h > 2048))) {\r
-               ERR("invalid destination resolution\n");\r
+       if (unlikely((req->dst.act_w <= 0) || (req->dst.act_w > 2048) || (req->dst.act_h <= 0) || (req->dst.act_h > 2048))) {\r
+               ERR("invalid destination resolution act_w = %d, act_h = %d\n", req->dst.act_w, req->dst.act_h);\r
                return  -EINVAL;\r
        }\r
 \r
@@ -329,10 +328,7 @@ static int rga_check_param(const struct rga_req *req)
                ERR("invalid dst_vir_w\n");\r
                return  -EINVAL;\r
        }\r
-\r
-       #endif\r
-       \r
-       \r
+               \r
        return 0;\r
 }\r
 \r
@@ -385,7 +381,15 @@ static struct rga_reg * rga_reg_init(rga_session *session, struct rga_req *req)
         }\r
     }\r
 \r
-    RGA_gen_reg_info(req, (uint8_t *)reg->cmd_reg);\r
+    if(RGA_gen_reg_info(req, (uint8_t *)reg->cmd_reg) == -1)\r
+    {\r
+        printk("gen reg info error\n");\r
+        if(reg != NULL)\r
+        {\r
+            kfree(reg);            \r
+        }\r
+        return NULL;\r
+    }\r
 \r
     spin_lock_irqsave(&rga_service.lock, flag);\r
        list_add_tail(&reg->status_link, &rga_service.waiting);\r
@@ -507,6 +511,7 @@ static void rga_service_session_clear(rga_session *session)
 static void rga_try_set_reg(uint32_t num)\r
 {\r
     unsigned long flag;\r
+    struct rga_reg *reg ;\r
     \r
     if (!num)\r
     {\r
@@ -522,16 +527,16 @@ static void rga_try_set_reg(uint32_t num)
     {\r
         do\r
         {                        \r
-            if((rga_read(RGA_STATUS) & 0x1)) \r
+            if(!list_empty(&rga_service.running)) \r
             {                   \r
                 break;\r
             }\r
             else \r
             {  \r
-                struct rga_reg *reg = list_entry(rga_service.waiting.next, struct rga_reg, status_link);\r
                 /* RGA is idle */\r
+                reg = list_entry(rga_service.waiting.next, struct rga_reg, status_link);                \r
                 rga_soft_reset();\r
-                rga_del_running_list();\r
+                //rga_del_running_list();\r
                 rga_copy_reg(reg, 0);            \r
                 rga_reg_from_wait_to_run(reg);\r
                 \r
@@ -549,31 +554,11 @@ static void rga_try_set_reg(uint32_t num)
                 /* CMD buff */\r
                 rga_write(virt_to_phys(rga_service.cmd_buff) & (~PAGE_MASK), RGA_CMD_ADDR);               \r
 \r
-                #if RGA_TEST\r
-                {\r
-                    uint32_t i, *p;\r
-                    p = rga_service.cmd_buff;\r
-                    printk("CMD_REG\n");                    \r
-                    for (i=0; i<7; i++)                    \r
-                        printk("%.8x %.8x %.8x %.8x\n", p[i*4+0], p[i*4+1], p[i*4+2], p[i*4+3]);\r
-                }\r
-                #endif\r
-\r
                 /* master mode */\r
                 rga_write(0x1<<2, RGA_SYS_CTRL);\r
                                                               \r
                 /* All CMD finish int */\r
-                rga_write(0x1<<10, RGA_INT);\r
-\r
-                #if 0\r
-                {\r
-                    uint32_t i;\r
-                    for(i=0; i<28; i++)\r
-                    {\r
-                        rga_write(rga_service.cmd_buff[i], 0x100 + i*4);\r
-                    }\r
-                }\r
-                #endif\r
+                rga_write((0x1<<10)|(0x1<<8), RGA_INT);\r
                                                 \r
                 /* Start proc */\r
                 atomic_set(&reg->session->done, 0);\r
@@ -592,9 +577,11 @@ static void rga_try_set_reg(uint32_t num)
             }\r
             num--;\r
         }\r
-        while(num);\r
+        while(0);\r
        }\r
        spin_unlock_irqrestore(&rga_service.lock, flag);\r
+\r
+    \r
 }\r
 \r
 \r
@@ -669,20 +656,25 @@ static int rga_blit(rga_session *session, struct rga_req *req)
             /* generate 2 cmd for pre scale */        \r
             req2 = kmalloc(sizeof(struct rga_req), GFP_KERNEL);\r
             if(NULL == req2) {\r
-                return -EINVAL;            \r
+                return -EFAULT;            \r
             }\r
 \r
+            ret = RGA_gen_two_pro(req, req2);            \r
+            if(ret == -EINVAL) {\r
+                break;\r
+            }            \r
+\r
             ret = rga_check_param(req);\r
                if(ret == -EINVAL) {\r
+                printk("req 1 argument is inval\n");\r
                 break;\r
                }\r
-\r
+                                             \r
             ret = rga_check_param(req2);\r
                if(ret == -EINVAL) {\r
+                printk("req 2 argument is inval\n");\r
                 break;\r
                }\r
-            \r
-            RGA_gen_two_pro(req, req2);\r
 \r
             reg = rga_reg_init_2(session, req, req2);\r
             if(reg == NULL) {\r
@@ -712,7 +704,7 @@ static int rga_blit(rga_session *session, struct rga_req *req)
         return 0;         \r
     }\r
     while(0);\r
-\r
+    \r
     if(NULL != req2)\r
     {\r
         kfree(req2);\r
@@ -752,26 +744,24 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req)
     ret = rga_blit(session, req);\r
         \r
     ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
-\r
-    rga_soft_reset();\r
     \r
     if (unlikely(ret_timeout< 0)) \r
     {\r
-               pr_err("pid %d wait task ret %d\n", session->pid, ret_timeout);\r
-        rga_del_running_list();\r
+               pr_err("sync pid %d wait task ret %d\n", session->pid, ret_timeout);        \r
+        rga_soft_reset();\r
         ret = -ETIMEDOUT;\r
        } \r
     else if (0 == ret_timeout)\r
     {\r
-               pr_err("pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));\r
-        rga_del_running_list();\r
+               pr_err("sync pid %d wait %d task done timeout\n", session->pid, atomic_read(&session->task_running));\r
+        rga_soft_reset();\r
                ret = -ETIMEDOUT;\r
        }\r
 \r
     #if RGA_TEST_TIME\r
     rga_end = ktime_get();\r
     rga_end = ktime_sub(rga_end, rga_start);\r
-    printk("one cmd end time %d\n", (int)ktime_to_us(rga_end));\r
+    printk("sync one cmd end time %d\n", (int)ktime_to_us(rga_end));\r
     #endif\r
             \r
     return ret;   \r
@@ -859,8 +849,7 @@ static int rga_open(struct inode *inode, struct file *file)
     atomic_set(&session->num_done, 0);\r
        file->private_data = (void *)session;\r
 \r
-    DBG("*** rga opened by pid %d *** \n", session->pid);    \r
-       DBG("*** rga dev opened *** \n");\r
+    DBG("*** rga dev opened by pid %d *** \n", session->pid);    \r
        return nonseekable_open(inode, file);\r
     \r
 }\r
@@ -889,44 +878,39 @@ static int rga_release(struct inode *inode, struct file *file)
        kfree(session);\r
        spin_unlock_irqrestore(&rga_service.lock, flag);\r
 \r
-       pr_debug("dev closed\n");\r
+    DBG("*** rga dev close ***\n");\r
        return 0;\r
 }\r
 \r
 static irqreturn_t rga_irq(int irq,  void *dev_id)\r
 {\r
     //struct rga_reg *reg;\r
-    //uint32_t num = 0;\r
-    struct list_head *next;\r
+    uint32_t flag;\r
+    uint32_t i = 0;\r
     //int int_enable = 0;\r
     \r
     #if RGA_TEST\r
     printk("rga_irq is valid\n");\r
     #endif\r
 \r
-    /*clear INT */\r
-       rga_write(rga_read(RGA_INT) | (0x1<<6), RGA_INT);\r
-    rga_write(rga_read(RGA_INT) | (0x1<<7), RGA_INT);\r
-\r
-    if(((rga_read(RGA_STATUS) & 0x1) != 0))// idle\r
+    if(rga_read(RGA_INT) & 0x1)\r
+    {\r
+        printk("bus Error interrupt is occur\n");\r
+    }\r
+   \r
+    while(((rga_read(RGA_STATUS) & 0x1) != 0) && (i<10))// idle\r
        {       \r
-               printk(" irq ERROR : RGA is not idle!\n");\r
-               rga_soft_reset();\r
-       }\r
-\r
-    rga_soft_reset();\r
-    \r
-    spin_lock(&rga_service.lock);\r
+               mdelay(1);\r
+        i++;\r
+       }    \r
 \r
+     /*clear INT */\r
+       rga_write(rga_read(RGA_INT) | (0x1<<6) | (0x1<<7) | (0x1<<4), RGA_INT);\r
+    spin_lock_irqsave(&rga_service.lock, flag);\r
     rga_del_running_list();\r
-\r
-    atomic_set(&rga_service.cmd_num, 0);\r
-\r
-    spin_unlock(&rga_service.lock);\r
-\r
-    next = &rga_service.waiting;\r
-\r
-    if(!list_empty(next))\r
+    spin_unlock_irqrestore(&rga_service.lock, flag);\r
+       \r
+    if(!list_empty(&rga_service.waiting))\r
     {\r
         rga_try_set_reg(1);\r
     }\r
@@ -1245,14 +1229,14 @@ void rga_test_0(void)
     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
+   \r
     req.src.act_w = 1024;\r
     req.src.act_h = 1024;\r
 \r
     req.src.vir_w = 1024;\r
     req.src.vir_h = 1024;\r
     req.src.yrgb_addr = (uint32_t)virt_to_phys(src_buf);\r
-    //req.src.uv_addr = (uint32_t)U4200_320_240_swap0;\r
+    req.src.uv_addr = req.src.yrgb_addr + 1920;\r
     //req.src.v_addr = (uint32_t)V4200_320_240_swap0;\r
     req.src.format = RK_FORMAT_RGBA_8888;\r
 \r
@@ -1261,28 +1245,30 @@ void rga_test_0(void)
 \r
     req.dst.vir_w = 1024;\r
     req.dst.vir_h = 1024;\r
-    req.dst.x_offset = 0;\r
-    req.dst.y_offset = 000;\r
+    req.dst.x_offset = 1023;\r
+    req.dst.y_offset = 0;\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.ymin = 0;\r
     req.clip.ymax = 1023;\r
 \r
     //req.render_mode = color_fill_mode;\r
-    req.fg_color = 0x80808080;\r
+    //req.fg_color = 0x80ffffff;\r
             \r
-    req.rotate_mode = 0;\r
+    req.rotate_mode = 1;\r
     req.scale_mode = 0;\r
 \r
-    req.alpha_rop_flag = 0;\r
-    req.alpha_global_value = 0x80;\r
+    req.alpha_rop_flag = 1;\r
+    req.alpha_rop_mode = 0x1;\r
 \r
-    req.sina = 0x00000;\r
-    req.cosa = 0x10000;\r
+    req.sina = 65536;\r
+    req.cosa = 0;\r
 \r
-    req.mmu_info.mmu_flag = 0;\r
+    req.mmu_info.mmu_flag = 0x0;\r
     req.mmu_info.mmu_en = 0;\r
 \r
     rga_blit_sync(&session, &req);\r
@@ -1301,9 +1287,6 @@ void rga_test_0(void)
     fb->var.green.msb_right = 0;\r
     \r
     fb->var.blue.length = 8;\r
-\r
-\r
-\r
     \r
     fb->var.blue.offset = 16;\r
     fb->var.blue.msb_right = 0;\r
index 66210c07f2d0b8341e7eac56a2a4faaf15989f69..43d97e9f1d1087479a89532d86abf88ab31e2e1e 100755 (executable)
@@ -386,22 +386,19 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
     {               \r
         /* cal src buf mmu info */                     \r
         SrcMemSize = rga_buf_size_cal(req->src.yrgb_addr, req->src.uv_addr, req->src.v_addr,\r
-                                        req->src.format, req->src.vir_w, (req->src.act_h + req->src.y_offset),\r
+                                        req->src.format, req->src.vir_w, req->src.vir_h,\r
                                         &SrcStart);\r
         if(SrcMemSize == 0) {\r
             return -EINVAL;                \r
         }\r
-        \r
-\r
+      \r
         /* cal dst buf mmu info */    \r
         DstMemSize = rga_buf_size_cal(req->dst.yrgb_addr, req->dst.uv_addr, req->dst.v_addr,\r
-                                        req->dst.format, req->dst.vir_w, (req->dst.act_h + req->dst.y_offset),\r
+                                        req->dst.format, req->dst.vir_w, req->dst.vir_h,\r
                                         &DstStart);        \r
         if(DstMemSize == 0) {\r
             return -EINVAL; \r
         }\r
-\r
-        //DstMemSize += 1;\r
         \r
         CMDMemSize = 0;\r
         /* cal cmd buf mmu info */\r
@@ -420,7 +417,7 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
             break;                \r
         }\r
         \r
-        MMU_Base = (uint32_t *)kmalloc((AllSize + 1)* sizeof(uint32_t), GFP_KERNEL);      \r
+        MMU_Base = (uint32_t *)kmalloc((AllSize + 1) * sizeof(uint32_t), GFP_KERNEL);      \r
         if(MMU_Base == NULL) {\r
             pr_err("RGA MMU malloc MMU_Base point failed\n");\r
             status = RGA_MALLOC_ERROR;\r
@@ -1400,6 +1397,7 @@ int rga_set_mmu_info(struct rga_reg *reg, struct rga_req *req)
             ret = rga_mmu_info_color_palette_mode(reg, req);\r
             break;\r
         case color_fill_mode :\r
+            //printk("color_fill_mode is enable\n");\r
             ret = rga_mmu_info_color_fill_mode(reg, req);\r
             break;\r
         case line_point_drawing_mode :\r
@@ -1409,6 +1407,7 @@ int rga_set_mmu_info(struct rga_reg *reg, struct rga_req *req)
             ret = rga_mmu_info_blur_sharp_filter_mode(reg, req);\r
             break;\r
         case pre_scaling_mode :\r
+            //printk("pre_scaleing_mode is enable\n");\r
             ret = rga_mmu_info_pre_scale_mode(reg, req);\r
             break;\r
         case update_palette_table_mode :\r
index 9386feb0b7b3df1aa8ee108f6db0645e0ecf8f35..b35c704a5e85296d18680b0da6186d2a42044bf3 100755 (executable)
@@ -1290,6 +1290,12 @@ RGA_set_pre_scale_reg_info(u8 *base, const struct rga_req *msg)
    dst_width = msg->dst.act_w;\r
    dst_height = msg->dst.act_h;\r
 \r
+   if((dst_width == 0) || (dst_height == 0))\r
+   {\r
+        printk("pre scale reg info error ratio is divide zero\n");\r
+        return -EINVAL;    \r
+   }\r
+\r
    h_ratio = (src_width <<16) / dst_width;\r
    v_ratio = (src_height<<16) / dst_height;\r
 \r
@@ -1438,7 +1444,7 @@ Author:
 Date:        \r
     20012-2-2 10:59:25 \r
 **************************************************************/\r
-unsigned int\r
+int\r
 RGA_gen_reg_info(const struct rga_req *msg, unsigned char *base)\r
 {\r
     TILE_INFO tile;\r
@@ -1467,6 +1473,7 @@ RGA_gen_reg_info(const struct rga_req *msg, unsigned char *base)
             RGA_set_color_palette_reg_info(base, msg);\r
             break;\r
         case color_fill_mode :\r
+            RGA_set_alpha_rop(base, msg);\r
             RGA_set_dst(base, msg);    \r
             RGA_set_color(base, msg);\r
             RGA_set_pat(base, msg);\r
@@ -1486,7 +1493,8 @@ RGA_gen_reg_info(const struct rga_req *msg, unsigned char *base)
         case pre_scaling_mode :\r
             RGA_set_src(base, msg);\r
             RGA_set_dst(base, msg); \r
-            RGA_set_pre_scale_reg_info(base, msg);\r
+            if(RGA_set_pre_scale_reg_info(base, msg) == -EINVAL)\r
+                return -1;\r
             break;\r
         case update_palette_table_mode :\r
             if (RGA_set_update_palette_table_reg_info(base, msg)) {\r
index 0ebf3d7701fdedf8fc654ec473773555866a9fa4..a7ca510a3d922cfc0113f67890c12b4dbecd7387 100755 (executable)
 void matrix_cal(const struct rga_req *msg, TILE_INFO *tile);\r
 \r
 \r
-unsigned int RGA_gen_reg_info(const struct rga_req *msg, unsigned char *base);\r
+int RGA_gen_reg_info(const struct rga_req *msg, unsigned char *base);\r
 uint8_t   RGA_pixel_width_init(uint32_t format);\r
 \r