modify rga driver fot rga test info
authorzsq <zsq@rock-chips.com>
Thu, 22 Mar 2012 06:13:03 +0000 (22:13 -0800)
committerzsq <zsq@rock-chips.com>
Thu, 22 Mar 2012 06:13:03 +0000 (22:13 -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 7c3b4be9d7b39059776531ecd7052c6601f0afe4..af89f973e9e071dccc5617af08b7800a981c21f8 100755 (executable)
@@ -78,176 +78,6 @@ matrix_cal(const struct rga_req *msg, TILE_INFO *tile)
 }\r
 \r
 \r
-\r
-\r
-u32\r
-RGA_dst_act_addr_temp(const struct rga_req *msg)\r
-{\r
-    uint32_t pw;\r
-    uint32_t x_off, y_off;\r
-    uint32_t stride;\r
-    uint32_t p;\r
-    \r
-    pw = RGA_pixel_width_init(msg->dst.format);\r
-    stride = (msg->dst.vir_w * pw + 3) & (~3);    \r
-    \r
-    x_off = msg->dst.x_offset;\r
-    y_off = msg->dst.y_offset;\r
-\r
-    p = (u32)((stride * y_off) + (x_off * pw));\r
-\r
-    return p;\r
-}\r
-\r
-void\r
-RGA_set_cmd_info(uint8_t cmd_mode, uint32_t cmd_addr)\r
-{\r
-    uint32_t reg = 0;\r
-    \r
-    reg |= ((cmd_mode & 1) << 1);\r
-    rRGA_SYS_CTRL = reg; \r
-    rRGA_CMD_ADDR = cmd_addr;\r
-}\r
-\r
-void\r
-RGA_start(void) \r
-{\r
-    uint32_t reg = 0;\r
-    uint8_t  cmd_mode;\r
-    \r
-    reg = rRGA_SYS_CTRL;\r
-    cmd_mode = (reg >> 2) & 1;\r
-    \r
-    if (cmd_mode == 0)\r
-    {\r
-        /* passive */\r
-        reg |= (1<<1);\r
-        rRGA_SYS_CTRL = reg;       \r
-    }\r
-    else\r
-    {\r
-        /* master */\r
-        reg = rRGA_CMD_CTRL;\r
-        reg |= 1;\r
-        rRGA_CMD_CTRL = reg;        \r
-    }    \r
-}\r
-\r
-\r
-void\r
-RGA_soft_reset(void)\r
-{\r
-    uint32_t reg = 0;\r
-\r
-    reg = rRGA_SYS_CTRL;\r
-    reg |= 1;\r
-    rRGA_SYS_CTRL = reg;       \r
-}\r
-\r
-\r
-#if 0\r
-/*****************************************/\r
-//hxx add,2011.6.24\r
-void rga_one_op_st_master(RGA_INFO *p_rga_info)\r
-{\r
-       rRGA_SYS_CTRL = 0x4;\r
-       \r
-       rRGA_INT = s_RGA_INT_ALL_CMD_DONE_INT_EN(p_rga_info->int_info.all_cmd_done_int_en)|\r
-                  s_RGA_INT_MMU_INT_EN(p_rga_info->int_info.mmu_int_en)|\r
-                  s_RGA_INT_ERROR_INT_EN(p_rga_info->int_info.error_int_en);\r
-       \r
-       rRGA_CMD_ADDR = (u32) p_rga_info->sys_info.p_cmd_mst;\r
-       \r
-       rRGA_CMD_CTRL = 0x3;\r
-}\r
-\r
-\r
-void rga_set_int_info(MSG *p_msg,RGA_INFO *p_rga_info)\r
-{\r
-       p_msg->CMD_fin_int_enable = p_rga_info->int_info.cur_cmd_done_int_en;\r
-}\r
-\r
-\r
-void rga_check_int_all_cmd_finish(RGA_INFO *p_rga_info)\r
-{\r
-       u8 int_flag;\r
-       \r
-       int_flag = 0;\r
-       while(!int_flag)\r
-       {\r
-               int_flag = rRGA_INT & m_RGA_INT_ALL_CMD_DONE_INT_FLAG;\r
-       }\r
-       rRGA_INT = rRGA_INT | s_RGA_INT_ALL_CMD_DONE_INT_CLEAR(0x1);\r
-       \r
-    //if(p_rga_info->sys_info.p_cmd_mst != NULL)\r
-    // free(p_rga_info->sys_info.p_cmd_mst);\r
-}\r
-#endif\r
-\r
-void rga_start_cmd_AXI(uint8_t *base, uint32_t num)\r
-{\r
-    rRGA_SYS_CTRL = 0x4;\r
-    rRGA_INT = s_RGA_INT_ALL_CMD_DONE_INT_EN(ENABLE)| s_RGA_INT_MMU_INT_EN(ENABLE)| s_RGA_INT_ERROR_INT_EN(ENABLE);\r
-    rRGA_CMD_ADDR = (u32)base;          \r
-    rRGA_CMD_CTRL |= (num<<3);                \r
-    rRGA_CMD_CTRL |= 0x3;\r
-}\r
-\r
-void rga_check_cmd_finish(void)\r
-{\r
-       uint8_t int_flag;\r
-    uint8_t error_flag;\r
-       \r
-       int_flag = 0;\r
-    error_flag = 0;\r
-    \r
-       while(!int_flag)\r
-       {\r
-               int_flag = rRGA_INT & m_RGA_INT_ALL_CMD_DONE_INT_FLAG;\r
-        error_flag = rRGA_INT & (m_RGA_INT_ERROR_INT_FLAG);\r
-\r
-        if(error_flag)\r
-        {            \r
-            printk("~~~~~ ERROR INTTUR OCCUR ~~~~~\n");\r
-        }\r
-        error_flag = rRGA_INT & m_RGA_INT_MMU_INT_FLAG;\r
-        if(error_flag)\r
-        {            \r
-            printk("~~~~~ MMU ERROR INTTUR OCCUR ~~~~~\n");\r
-        }\r
-       }\r
-       rRGA_INT = rRGA_INT | s_RGA_INT_ALL_CMD_DONE_INT_CLEAR(0x1);    \r
-}\r
-\r
-\r
-\r
-void rga_start_cmd_AHB(uint8_t *base)\r
-{\r
-    uint32_t *base_p32;\r
-    \r
-    base_p32 = (u32 *)base;\r
-    *base_p32 = (*base_p32 | (1<<29));\r
-\r
-    memcpy((u8 *)(RGA_BASE + 0x100), base, 28*4);\r
-   \r
-    rRGA_SYS_CTRL = 0x2;\r
-}\r
-\r
-\r
-void rga_check_cmd_AHB_finish(void)\r
-{\r
-       uint8_t int_flag;\r
-       \r
-       int_flag = 0;\r
-       while(!int_flag)\r
-       {\r
-               int_flag = rRGA_INT & m_RGA_INT_NOW_CMD_DONE_INT_FLAG;\r
-       }\r
-       rRGA_INT = rRGA_INT | s_RGA_INT_NOW_CMD_DONE_INT_CLEAR(0x1);\r
-}\r
-\r
-\r
-\r
 uint32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1)\r
 {\r
     \r
@@ -264,64 +94,64 @@ uint32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1)
     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
-    memcpy(&mp->src, &msg->src, sizeof(rga_img_info_t));\r
+    memcpy(&msg1, &msg, sizeof(struct rga_req));\r
 \r
-    mp->dst.format = msg->src.format;\r
+    msg->dst.format = msg->src.format;\r
 \r
     /*pre_scale_w cal*/\r
     if ((w_ratio >= (2<<16)) && (w_ratio < (4<<16))) {            \r
         daw = (msg->src.act_w + 1) >> 1;\r
-        if((IS_YUV_420(mp->dst.format)) && (daw & 1)) {\r
-            mp->src.act_w = (daw - 1) << 1;                                                    \r
+        if((IS_YUV_420(msg->dst.format)) && (daw & 1)) {\r
+            msg->src.act_w = (daw - 1) << 1;                                                    \r
         }        \r
     }\r
     else if ((w_ratio >= (4<<16)) && (w_ratio < (8<<16))) {\r
         daw = (msg->src.act_w + 3) >> 2;            \r
-        if((IS_YUV_420(mp->dst.format)) && (daw & 1)) {\r
-            mp->src.act_w = (daw - 1) << 2;                                                    \r
+        if((IS_YUV_420(msg->dst.format)) && (daw & 1)) {\r
+            msg->src.act_w = (daw - 1) << 2;                                                    \r
         }\r
     }\r
     else if ((w_ratio >= (8<<16)) && (w_ratio < (16<<16))) {\r
         daw = (msg->src.act_w + 7) >> 3;\r
-        if((IS_YUV_420(mp->dst.format)) && (daw & 1)) {\r
-            mp->src.act_w = (daw - 1) << 3;                                                    \r
+        if((IS_YUV_420(msg->dst.format)) && (daw & 1)) {\r
+            msg->src.act_w = (daw - 1) << 3;                                                    \r
         }\r
     }\r
 \r
     pl = (RGA_pixel_width_init(msg->src.format));\r
     stride = (pl * daw + 3) & (~3);\r
-    mp->dst.act_w = daw;\r
-    mp->dst.vir_w = stride / pl;\r
+    msg->dst.act_w = daw;\r
+    msg->dst.vir_w = stride / pl;\r
 \r
     /*pre_scale_h cal*/        \r
     if ((h_ratio >= (2<<16)) && (h_ratio < (4<<16))) {            \r
         dah = (msg->src.act_h + 1) >> 1;            \r
-        if((IS_YUV(mp->dst.format)) && (dah & 1)) {\r
-            mp->src.act_h = (dah - 1) << 1;                                                    \r
+        if((IS_YUV(msg->dst.format)) && (dah & 1)) {\r
+            msg->src.act_h = (dah - 1) << 1;                                                    \r
         }            \r
     }\r
     else if ((h_ratio >= (4<<16)) && (h_ratio < (8<<16))) {\r
         dah = (msg->src.act_h + 3) >> 2;            \r
-        if((IS_YUV(mp->dst.format)) && (dah & 1)) {\r
-            mp->src.act_h = (dah - 1) << 2;                                                    \r
+        if((IS_YUV(msg->dst.format)) && (dah & 1)) {\r
+            msg->src.act_h = (dah - 1) << 2;                                                    \r
         }\r
     }\r
     else if ((h_ratio >= (8<<16)) && (h_ratio < (16<<16))) {\r
         dah = (msg->src.act_h + 7) >> 3;\r
-        if((IS_YUV(mp->dst.format)) && (dah & 1)) {\r
-            mp->src.act_h = (dah - 1) << 3;                                                    \r
+        if((IS_YUV(msg->dst.format)) && (dah & 1)) {\r
+            msg->src.act_h = (dah - 1) << 3;                                                    \r
         }\r
     }\r
-    mp->dst.act_h = dah;\r
-    mp->dst.vir_h = dah;\r
+    msg->dst.act_h = dah;\r
+    msg->dst.vir_h = dah;\r
             \r
-    mp->dst.yrgb_addr = (u32)rga_service.pre_scale_buf;\r
-    mp->dst.uv_addr = mp->dst.yrgb_addr + stride * dah;\r
-    mp->dst.v_addr = mp->dst.uv_addr + ((stride * dah) >> 1);\r
+    msg->dst.yrgb_addr = (u32)rga_service.pre_scale_buf;\r
+    msg->dst.uv_addr = msg->dst.yrgb_addr + stride * dah;\r
+    msg->dst.v_addr = msg->dst.uv_addr + ((stride * dah) >> 1);\r
 \r
-    mp->render_mode = pre_scaling_mode;\r
+    msg->render_mode = pre_scaling_mode;\r
 \r
-    memcpy(&msg->src, &mp->dst, sizeof(rga_img_info_t));\r
+    memcpy(&msg1->src, &msg->dst, sizeof(rga_img_info_t));\r
         \r
     return 0;\r
 }\r
index 59879e25ae9d9e0f05afd70983235e7e50601cca..62a8aac4e1445f001ecd0d3a4e021b1ab77723bd 100755 (executable)
@@ -7,220 +7,6 @@
 #define ENABLE      1\r
 #define DISABLE     0\r
 \r
-#if 0\r
-int\r
-RGA_set_src_act_info(\r
-               msg_t *msg,\r
-               unsigned int   width,       /* act width  */\r
-               unsigned int   height,      /* act height */\r
-               unsigned int   x_off,       /* x_off      */\r
-               unsigned int   y_off        /* y_off      */\r
-               );\r
-\r
-int\r
-RGA_set_src_vir_info(\r
-               msg_t *msg,\r
-               unsigned int   yrgb_addr,       /* yrgb_addr  */\r
-               unsigned int   uv_addr,         /* uv_addr    */\r
-               unsigned int   v_addr,          /* v_addr     */\r
-               unsigned int   vir_w,           /* vir width  */\r
-               unsigned int   vir_h,           /* vir height */\r
-               unsigned char  format,          /* format     */\r
-               unsigned char  a_swap_en\r
-               );\r
-\r
-int\r
-RGA_set_dst_act_info(\r
-               msg_t *msg,\r
-               unsigned int   width,       /* act width  */\r
-               unsigned int   height,      /* act height */\r
-               unsigned int   x_off,       /* x_off      */\r
-               unsigned int   y_off        /* y_off      */\r
-               );\r
-\r
-int\r
-RGA_set_dst_vir_info(\r
-               msg_t *msg,\r
-               unsigned int   yrgb_addr,   /* yrgb_addr  */\r
-               unsigned int   uv_addr,     /* uv_addr    */\r
-               unsigned int   v_addr,      /* v_addr     */\r
-               unsigned int   vir_w,       /* vir width  */\r
-               unsigned int   vir_h,       /* vir height */\r
-               RECT           clip,        /* clip window*/\r
-               unsigned char  format,      /* format     */\r
-               unsigned char  a_swap_en );\r
-\r
-\r
-\r
-int\r
-RGA_set_rop_mask_info(\r
-    msg_t *msg, \r
-    u32 rop_mask_addr, \r
-    u32 rop_mask_endian_mode);\r
-\r
-int \r
-RGA_set_pat_info(\r
-    msg_t *msg,\r
-    u32 width,\r
-    u32 height,\r
-    u32 x_off,\r
-    u32 y_off,\r
-    u32 pat_format);    \r
-\r
-int\r
-RGA_set_alpha_en_info(\r
-               msg_t *msg,\r
-               unsigned int alpha_cal_mode,\r
-               unsigned int alpha_mode,\r
-               unsigned int global_a_value,\r
-               unsigned int PD_en,\r
-               unsigned int PD_mode\r
-               );\r
-\r
-int\r
-RGA_set_rop_en_info(\r
-               msg_t *msg,\r
-               unsigned int ROP_mode,\r
-               unsigned int ROP_code,\r
-               unsigned int color_mode,\r
-               unsigned int solid_color);\r
-\r
-/*\r
-int\r
-RGA_set_MMU_info(\r
-               MSG *msg,\r
-               unsigned int base_addr,\r
-               unsigned int src_flush,\r
-               unsigned int dst_flush,\r
-               unsigned int cmd_flush,\r
-               unsigned int page_size\r
-               );\r
-*/\r
-\r
-int\r
-RGA_set_MMU_info(\r
-               msg_t *msg,\r
-               u8  mmu_en,\r
-               u8  src_flush,\r
-               u8  dst_flush,\r
-               u8  cmd_flush,\r
-               u32 base_addr,\r
-               u8  page_size);\r
-\r
-\r
-int\r
-RGA_set_bitblt_mode(\r
-               msg_t *msg,\r
-               unsigned char scale_mode,    // 0/near  1/bilnear  2/bicubic  \r
-               unsigned char rotate_mode,   // 0/copy 1/rotate_scale 2/x_mirror 3/y_mirror \r
-               unsigned int  angle,         // rotate angle (0~359)    \r
-               unsigned int  dither_en,     // dither en flag   \r
-               unsigned int  AA_en,         // AA flag          \r
-               unsigned int  yuv2rgb_mode\r
-               );\r
-\r
-\r
-int\r
-RGA_set_color_palette_mode(\r
-               msg_t *msg,\r
-               u8  palette_mode,    /* 1bpp/2bpp/4bpp/8bpp */\r
-               u8  endian_mode,     /* src endian mode sel */\r
-               u32 bpp1_0_color,    /* BPP1 = 0 */\r
-               u32 bpp1_1_color     /* BPP1 = 1 */\r
-               );\r
-\r
-\r
-\r
-int\r
-RGA_set_color_fill_mode(\r
-               msg_t *msg,\r
-               CF_GR_COLOR  gr_color,      /* gradient color part*/\r
-               u8 gr_satur_mode,           /* saturation mode */\r
-               u8 cf_mode,                 /* patten fill or solid fill */\r
-               u32 color,                  /* solid color */\r
-               u16 pat_width,              /* pat_width */\r
-               u16 pat_height,             /* pat_height */\r
-               u8 pat_x_off,               /* patten x offset */\r
-               u8 pat_y_off,               /* patten y offset */\r
-               u8 aa_en                    /* alpha en */\r
-               );\r
-\r
-\r
-int\r
-RGA_set_line_point_drawing_mode(\r
-               msg_t *msg,\r
-               POINT sp,                   /* start point */\r
-               POINT ep,                   /* end   point */\r
-               unsigned int color,         /* line point drawing color */\r
-               unsigned int line_width,    /* line width */\r
-               unsigned char AA_en,        /* AA en */\r
-               unsigned char last_point_en /* last point en */\r
-               );\r
-\r
-\r
-\r
-int\r
-RGA_set_blur_sharp_filter_mode(\r
-               msg_t *msg,\r
-               unsigned char filter_mode,   /* blur/sharpness   */\r
-               unsigned char filter_type,   /* filter intensity */\r
-               unsigned char dither_en      /* dither_en flag   */\r
-               );\r
-\r
-int\r
-RGA_set_pre_scaling_mode(\r
-               msg_t *msg,\r
-               unsigned char dither_en\r
-               );\r
-\r
-\r
-int\r
-RGA_update_palette_table_mode(\r
-               msg_t *msg,\r
-               unsigned int LUT_addr,      /* LUT table addr      */\r
-               unsigned int palette_mode   /* 1bpp/2bpp/4bpp/8bpp */\r
-               );\r
-\r
-\r
-int\r
-RGA_set_update_patten_buff_mode(\r
-               msg_t *msg,\r
-               unsigned int pat_addr, /* patten addr    */\r
-               unsigned int w,        /* patten width   */\r
-               unsigned int h,        /* patten height  */\r
-               unsigned int format    /* patten format  */\r
-               );\r
-/*\r
-int\r
-RGA_set_MMU_info(\r
-               MSG *msg,\r
-               unsigned int base_addr,\r
-               unsigned int src_flush,\r
-               unsigned int dst_flush,\r
-               unsigned int cmd_flush,\r
-               unsigned int page_size\r
-               );\r
-*/\r
-\r
-int\r
-RGA_set_mmu_info(\r
-               msg_t *msg,\r
-               u8  mmu_en,\r
-               u8  src_flush,\r
-               u8  dst_flush,\r
-               u8  cmd_flush,\r
-               u32 base_addr,\r
-               u8  page_size);\r
-\r
-msg_t * RGA_init_msg(void);\r
-int RGA_free_msg(msg_t *msg);\r
-void matrix_cal(msg_t *msg, TILE_INFO *tile);\r
-unsigned char * RGA_set_reg_info(msg_t *msg, u8 *base);\r
-void RGA_set_cmd_info(u8 cmd_mode, u32 cmd_addr);\r
-void RGA_start(void);\r
-void RGA_soft_reset(void);\r
-#endif\r
-\r
 uint32_t RGA_gen_two_pro(struct rga_req *msg, struct rga_req *msg1);\r
 \r
 \r
index 6a82646c11d48af53c0caa2644bbae558d068df6..eb1d93408869d9922a8cc2f44a7257e1d2aab073 100755 (executable)
@@ -290,12 +290,7 @@ struct rga_req {
                                     /* ([4]   zero  mode en)    */\r
                                     /* ([5]   dst   alpha mode) */\r
 \r
-    uint8_t  src_trans_mode;\r
-\r
-    uint8_t CMD_fin_int_enable;                        \r
-\r
-    /* completion is reported through a callback */\r
-       void (*complete)(int retval);\r
+    uint8_t  src_trans_mode;                           \r
 };\r
 \r
     \r
index 755c6ece3c6f7c824a89a1f6a6cc53fd6010c213..03d559a746d4d4adc92404d987b07de7e0bb0314 100755 (executable)
 #include <linux/fb.h>\r
 \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
+extern struct fb_info * rk_get_fb(int fb_id);\r
+extern void rk_direct_fb_show(struct fb_info * fbi);\r
+\r
 \r
-#define RGA_TEST 1\r
+#define RGA_TEST 0\r
 \r
 #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
 \r
+uint32_t dst_buf[800*480*4];\r
+uint32_t src_buf[1024*768*2];\r
+\r
 struct rga_drvdata {\r
        struct miscdevice miscdev;\r
        struct device dev;\r
@@ -522,7 +527,10 @@ static void rga_try_set_reg(uint32_t num)
 \r
     if (!num)\r
     {\r
+        #ifdef RGA_TEST        \r
         printk("rga try set reg cmd num is 0\n");\r
+        #endif\r
+        \r
         return;\r
     }\r
     \r
@@ -541,6 +549,15 @@ static void rga_try_set_reg(uint32_t num)
                     rga_reg_from_wait_to_run(reg);\r
                     \r
                     rga_write(0x1<<10, RGA_INT);\r
+\r
+                    #ifdef RGA_TEST\r
+                    {\r
+                        uint32_t i;\r
+                        printk("CMD_REG\n");\r
+                        for(i=0; i<28; i++)                        \r
+                            printk("%.8x\n", rga_service.cmd_buff[i + 28*atomic_read(&rga_service.cmd_num)]);                                                                                    \r
+                    }\r
+                    #endif\r
                     \r
                     atomic_set(&reg->session->done, 0);\r
                     \r
@@ -560,7 +577,7 @@ static void rga_try_set_reg(uint32_t num)
 \r
                 /*  \r
                  *  if cmd buf must use mmu\r
-                 *  it should be writed before cmd start  \r
+                 *  it should be configured before cmd start  \r
                  */\r
                 rga_write((2<<4)|0x1, RGA_MMU_CTRL);\r
                 rga_write(virt_to_phys(reg->MMU_base)>>2, RGA_MMU_TBL);\r
@@ -571,6 +588,16 @@ static void rga_try_set_reg(uint32_t num)
                 /* master mode */\r
                 rga_write(0x1<<2, RGA_SYS_CTRL);\r
 \r
+                #ifdef RGA_TEST\r
+                {\r
+                    uint32_t i;\r
+                    printk("CMD_REG\n");\r
+                    for (i=0; i<28; i++)                    \r
+                        printk("%.8x\n", rga_service.cmd_buff[i]);                        \r
+                                                        \r
+                }\r
+                #endif\r
+\r
                 /* All CMD finish int */\r
                 rga_write(0x1<<10, RGA_INT);\r
 \r
@@ -578,6 +605,15 @@ static void rga_try_set_reg(uint32_t num)
                 atomic_set(&reg->session->done, 0);\r
                 rga_write(0x1, RGA_CMD_CTRL);\r
 \r
+                #ifdef RGA_TEST\r
+                {\r
+                    uint32_t i;\r
+                    printk("CMD_READ_BACK_REG\n");\r
+                    for (i=0; i<28; i++)                        \r
+                        printk("%.8x\n", rga_read(0x100 + i*4));                                                                                \r
+                }\r
+                #endif\r
+\r
             }\r
             num--;\r
         }\r
@@ -595,51 +631,56 @@ static int rga_blit_async(rga_session *session, struct rga_req *req)
     struct rga_req *req2;\r
 \r
     uint32_t saw, sah, daw, dah;\r
+\r
+    req2 = NULL;\r
             \r
     saw = req->src.act_w;\r
     sah = req->src.act_h;\r
     daw = req->dst.act_w;\r
     dah = req->dst.act_h;\r
 \r
-    if((req->render_mode == bitblt_mode) && (((saw>>1) >= daw) || ((sah>>1) >= dah))) \r
+    do\r
     {\r
-        /* generate 2 cmd for pre scale */\r
-        \r
-        req2 = kmalloc(sizeof(struct rga_req), GFP_KERNEL);\r
-        if(NULL == req2) {\r
-            return -EINVAL;            \r
-        }\r
-\r
-        RGA_gen_two_pro(req, req2);\r
-\r
-        reg = rga_reg_init_2(session, req2, req);\r
-        if(reg == NULL) {\r
-            return -EFAULT;\r
-        }\r
-        \r
-        atomic_set(&reg->int_enable, 1);\r
+        if((req->render_mode == bitblt_mode) && (((saw>>1) >= daw) || ((sah>>1) >= dah))) \r
+        {                                   \r
+            /* generate 2 cmd for pre scale */        \r
+            req2 = kmalloc(sizeof(struct rga_req), GFP_KERNEL);\r
+            if(NULL == req2) {\r
+                return -EINVAL;            \r
+            }\r
+            \r
+            RGA_gen_two_pro(req, req2);\r
 \r
-        rga_try_set_reg(2);\r
+            reg = rga_reg_init_2(session, req, req2);\r
+            if(reg == NULL) {\r
+                break;\r
+            }\r
+            \r
+            atomic_set(&reg->int_enable, 1);\r
 \r
-        if(req2 != NULL)\r
-        {\r
-            kfree(req2);\r
+            rga_try_set_reg(2);\r
+            \r
         }\r
-\r
+        else {\r
+            /* check value if legal */\r
+            ret = rga_check_param(req);\r
+               if(ret == -EINVAL) {\r
+                return -EINVAL;\r
+               }\r
+            \r
+            reg = rga_reg_init(session, req);\r
+            if(reg == NULL) {\r
+                return -EFAULT;\r
+            }\r
+            \r
+            rga_try_set_reg(1);        \r
+        }        \r
     }\r
-    else {\r
-        /* check value if legal */\r
-        ret = rga_check_param(req);\r
-       if(ret == -EINVAL) {\r
-            return -EINVAL;\r
-       }\r
-        \r
-        reg = rga_reg_init(session, req);\r
-        if(reg == NULL) {\r
-            return -EFAULT;\r
-        }\r
-        \r
-        rga_try_set_reg(1);        \r
+    while(0);\r
+\r
+    if(NULL != req2)\r
+    {\r
+        kfree(req2);\r
     }\r
    \r
        //printk("rga_blit_async done******************\n");\r
@@ -658,6 +699,7 @@ error_scale:
 static int rga_blit_sync(rga_session *session, struct rga_req *req)\r
 {\r
     int ret = 0;\r
+    int ret_timeout = 0;\r
     struct rga_reg *reg;\r
     struct rga_req *req2;\r
 \r
@@ -673,45 +715,49 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req)
         /* generate 2 cmd for pre scale */\r
         \r
         req2 = kmalloc(sizeof(struct rga_req), GFP_KERNEL);\r
-        if(NULL == req2) {\r
+        if (NULL == req2) \r
+        {\r
             return -EINVAL;            \r
         }\r
-\r
+        \r
         RGA_gen_two_pro(req, req2);\r
 \r
         reg = rga_reg_init_2(session, req2, req);\r
-        if(reg == NULL) {\r
+        if (NULL == reg) \r
+        {\r
             return -EFAULT;\r
         }\r
-        \r
+                \r
         atomic_set(&reg->int_enable, 1);\r
 \r
         rga_try_set_reg(2);        \r
 \r
     }\r
-    else {\r
+    else \r
+    {\r
         /* check value if legal */        \r
         ret = rga_check_param(req);\r
-       if(ret == -EINVAL) {\r
+       if(ret == -EINVAL) \r
+        {\r
                return -EFAULT;\r
        }\r
         \r
         reg = rga_reg_init(session, req);\r
-        if(reg == NULL) {\r
+        if(reg == NULL) \r
+        {            \r
             return -EFAULT;\r
         }\r
-\r
-        atomic_set(&reg->int_enable, 1);\r
         \r
+        atomic_set(&reg->int_enable, 1);        \r
         rga_try_set_reg(1);\r
     }    \r
 \r
-    ret = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
-    if (unlikely(ret < 0)) \r
+    ret_timeout = wait_event_interruptible_timeout(session->wait, atomic_read(&session->done), RGA_TIMEOUT_DELAY);\r
+    if (unlikely(ret_timeout< 0)) \r
     {\r
-               pr_err("pid %d wait task ret %d\n", session->pid, ret);\r
+               pr_err("pid %d wait task ret %d\n", session->pid, ret_timeout);\r
        } \r
-    else if (0 == ret) \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
                ret = -ETIMEDOUT;\r
@@ -722,6 +768,7 @@ static int rga_blit_sync(rga_session *session, struct rga_req *req)
        //printk("rga_blit_sync done******************\n");\r
 }\r
 \r
+\r
 static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)\r
 {\r
     struct rga_req *req;\r
@@ -740,7 +787,7 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
         ret = -EINVAL;\r
     }\r
         \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
@@ -767,8 +814,7 @@ static long rga_ioctl(struct file *file, uint32_t cmd, unsigned long arg)
 \r
     if(req != NULL) {\r
         kfree(req);\r
-    }\r
-    \r
+    }    \r
        return ret;\r
 }\r
 \r
@@ -850,12 +896,10 @@ static irqreturn_t rga_irq(int irq,  void *dev_id)
     {\r
         reg = list_entry(rga_service.running.next, struct rga_reg, status_link);\r
 \r
-        #if 0\r
         if(reg->MMU_base != NULL)\r
         {\r
             kfree(reg->MMU_base);\r
         }\r
-        #endif\r
                 \r
         atomic_sub(1, &reg->session->task_running);\r
            atomic_sub(1, &rga_service.total_running);\r
@@ -884,7 +928,7 @@ static irqreturn_t rga_irq(int irq,  void *dev_id)
         reg = list_entry(next->next, struct rga_reg, status_link);\r
         int_enable = atomic_read(&reg->int_enable);        \r
         next = next->next;\r
-    }\r
+    }   \r
 \r
     rga_try_set_reg(num);\r
                        \r
@@ -1151,6 +1195,8 @@ static struct platform_driver rga_driver = {
        },\r
 };\r
 \r
+extern void rga_test_0();\r
+\r
 static int __init rga_init(void)\r
 {\r
        int ret;\r
@@ -1210,11 +1256,9 @@ static void __exit rga_exit(void)
        platform_driver_unregister(&rga_driver); \r
 }\r
 \r
-\r
 module_init(rga_init);\r
 module_exit(rga_exit);\r
 \r
-\r
 /* Module information */\r
 MODULE_AUTHOR("zsq@rock-chips.com");\r
 MODULE_DESCRIPTION("Driver for rga device");\r
index d4e21b0dfd43be1e1eb907fa3fbafe597fbc7b58..dcbd781a51d6bec9660340b5f29959ae1ccb7a8e 100755 (executable)
@@ -218,6 +218,8 @@ static int rga_MapUserMemory(struct page **pages,
     uint32_t i;\r
     uint32_t status;\r
 \r
+    status = 0;\r
+\r
     do\r
     {    \r
         down_read(&current->mm->mmap_sem);\r
@@ -369,7 +371,7 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
     MMU_Base = NULL;\r
 \r
     do\r
-    {\r
+    {               \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.vir_h,\r
@@ -377,6 +379,7 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
         if(SrcMemSize == 0) {\r
             return -EINVAL;                \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
@@ -392,6 +395,8 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
             return -EINVAL; \r
         }\r
 \r
+        \r
+        /* Cal out the needed mem size */\r
         AllSize = SrcMemSize + DstMemSize + CMDMemSize;\r
                    \r
         pages = (struct page **)kmalloc(AllSize * sizeof(struct page *), GFP_KERNEL);\r
@@ -425,10 +430,23 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
         {\r
             MMU_p = MMU_Base + CMDMemSize;\r
             \r
-            for(i=0; i<SrcMemSize; i++)\r
+            if(req->src.yrgb_addr == (uint32_t)rga_service.pre_scale_buf)\r
             {\r
-                MMU_p[i] = (uint32_t)virt_to_phys((uint32_t *)((SrcStart + i) << PAGE_SHIFT));\r
+                /* Down scale ratio over 2, Last prc    */\r
+                /* MMU table copy from pre scale table  */\r
+                \r
+                for(i=0; i<SrcMemSize; i++)\r
+                {\r
+                    MMU_p[i] = rga_service.pre_scale_buf[i];\r
+                }                \r
             }\r
+            else\r
+            {                           \r
+                for(i=0; i<SrcMemSize; i++)\r
+                {\r
+                    MMU_p[i] = (uint32_t)virt_to_phys((uint32_t *)((SrcStart + i) << PAGE_SHIFT));\r
+                }\r
+            }            \r
         }\r
         \r
         if (req->dst.yrgb_addr < KERNEL_SPACE_VALID)\r
@@ -451,8 +469,7 @@ static int rga_mmu_info_BitBlt_mode(struct rga_reg *reg, struct rga_req *req)
         }\r
 \r
         /* zsq \r
-         * change the buf address in req struct\r
-         * for the reason of lie to MMU          \r
+         * change the buf address in req struct     \r
          */\r
         \r
         req->mmu_info.base_addr = (virt_to_phys(MMU_Base)>>2);        \r
@@ -699,13 +716,12 @@ static int rga_mmu_info_color_fill_mode(struct rga_reg *reg, struct rga_req *req
         \r
                             \r
         /* zsq \r
-         * change the buf address in req struct\r
-         * for the reason of lie to MMU \r
+         * change the buf address in req struct \r
          */\r
+         \r
         req->mmu_info.base_addr = virt_to_phys(MMU_Base);    \r
         req->dst.yrgb_addr = (req->dst.yrgb_addr & (~PAGE_MASK)) | ((CMDMemSize) << PAGE_SHIFT);\r
-       \r
-        \r
+               \r
         /*record the malloc buf for the cmd end to release*/\r
         reg->MMU_base = MMU_Base;\r
 \r
@@ -1043,10 +1059,21 @@ static int rga_mmu_info_pre_scale_mode(struct rga_reg *reg, struct rga_req *req)
         {   \r
             /* kernel space */\r
             MMU_p = MMU_Base + CMDMemSize + SrcMemSize;\r
-            for(i=0; i<DstMemSize; i++) \r
+\r
+            if(req->dst.yrgb_addr == (uint32_t)rga_service.pre_scale_buf)\r
             {\r
-                MMU_p[i] = virt_to_phys((uint32_t *)((DstStart + i)<< PAGE_SHIFT));        \r
+                for(i=0; i<DstMemSize; i++)\r
+                {\r
+                    MMU_p[i] = rga_service.pre_scale_buf[i];\r
+                }\r
             }\r
+            else\r
+            {\r
+                for(i=0; i<DstMemSize; i++) \r
+                {\r
+                    MMU_p[i] = virt_to_phys((uint32_t *)((DstStart + i)<< PAGE_SHIFT));        \r
+                }    \r
+            }                                    \r
         }\r
         else \r
         {\r
@@ -1066,21 +1093,11 @@ static int rga_mmu_info_pre_scale_mode(struct rga_reg *reg, struct rga_req *req)
          */\r
         req->mmu_info.base_addr = virt_to_phys(MMU_Base)>>2;\r
 \r
-        #if 0\r
         req->src.yrgb_addr = (req->src.yrgb_addr & (~PAGE_MASK)) | (CMDMemSize << PAGE_SHIFT);\r
         req->src.uv_addr = (req->src.uv_addr & (~PAGE_MASK)) | (CMDMemSize << PAGE_SHIFT);\r
         req->src.v_addr = (req->src.v_addr & (~PAGE_MASK)) | (CMDMemSize << PAGE_SHIFT);\r
 \r
         req->dst.yrgb_addr = (req->dst.yrgb_addr & (~PAGE_MASK)) | ((CMDMemSize + SrcMemSize) << PAGE_SHIFT);\r
-        #else\r
-\r
-        req->src.yrgb_addr &= 0xffffff;\r
-        req->src.uv_addr &= 0xfffffff;\r
-        req->src.v_addr &= 0xfffffff;\r
-\r
-        req->dst.yrgb_addr &= 0xfffffff;\r
-        \r
-        #endif\r
         \r
         /*record the malloc buf for the cmd end to release*/\r
         reg->MMU_base = MMU_Base;\r
index 7b6df14c2b73a1fc1227f056a4a0f3df5bcdc2b6..15a298dbc313fdb47de00b77994867dfabdeb796 100755 (executable)
@@ -100,8 +100,8 @@ dst_ctrl_cal(const struct rga_req *msg, TILE_INFO *tile)
         \r
         ymax = MIN(MAX(MAX(MAX(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymax);\r
         ymin = MAX(MIN(MIN(MIN(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymin);\r
-\r
-        printk("xmax = %d, xmin = %d, ymin = %d, ymax = %d\n", xmax, xmin, ymin, ymax);\r
+        \r
+        //printk("xmax = %d, xmin = %d, ymin = %d, ymax = %d\n", xmax, xmin, ymin, ymax);\r
     }\r
     else if(msg->rotate_mode == 1)\r
     {\r
@@ -213,6 +213,8 @@ dst_ctrl_cal(const struct rga_req *msg, TILE_INFO *tile)
 \r
             ymax = MIN(ymax, msg->clip.ymax);\r
             ymin = MAX(ymin, msg->clip.ymin);\r
+\r
+            //printk("xmin = %d, xmax = %d, ymin = %d, ymax = %d\n", xmin, xmax, ymin, ymax);\r
         }\r
     }    \r
    \r
@@ -224,13 +226,15 @@ dst_ctrl_cal(const struct rga_req *msg, TILE_INFO *tile)
     if ((xmin >= msg->dst.vir_w)||(xmax < 0)||(ymin >= msg->dst.vir_h)||(ymax < 0)) {       \r
         xmin = xmax = ymin = ymax = 0;\r
     }\r
+\r
+    //printk("xmin = %d, xmax = %d, ymin = %d, ymax = %d\n", xmin, xmax, ymin, ymax);\r
     \r
     tile->dst_ctrl.w = (xmax - xmin);\r
     tile->dst_ctrl.h = (ymax - ymin);\r
     tile->dst_ctrl.x_off = xmin;\r
     tile->dst_ctrl.y_off = ymin;\r
 \r
-    printk("tile->dst_ctrl.w = %x, tile->dst_ctrl.h = %x\n", tile->dst_ctrl.w, tile->dst_ctrl.h);\r
+    //printk("tile->dst_ctrl.w = %x, tile->dst_ctrl.h = %x\n", tile->dst_ctrl.w, tile->dst_ctrl.h);\r
 \r
     tile->tile_x_num = (xmax - xmin + 1 + 7)>>3;\r
     tile->tile_y_num = (ymax - ymin + 1 + 7)>>3;\r
@@ -505,8 +509,7 @@ RGA_set_mode_ctrl(u8 *base, const struct rga_req *msg)
     reg = ((reg & (~m_RGA_MODE_CTRL_DST_RGB_PACK))     | (s_RGA_MODE_CTRL_DST_RGB_PACK(dst_rgb_pack)));\r
     reg = ((reg & (~m_RGA_MODE_CTRL_DST_RB_SWAP))      | (s_RGA_MODE_CTRL_DST_RB_SWAP(dst_rb_swp)));\r
     reg = ((reg & (~m_RGA_MODE_CTRL_DST_ALPHA_SWAP))   | (s_RGA_MODE_CTRL_DST_ALPHA_SWAP(dst_a_swp)));\r
-    reg = ((reg & (~m_RGA_MODE_CTRL_LUT_ENDIAN_MODE))  | (s_RGA_MODE_CTRL_LUT_ENDIAN_MODE(msg->endian_mode & 1)));    \r
-    reg = ((reg & (~m_RGA_MODE_CTRL_CMD_INT_ENABLE))   | (s_RGA_MODE_CTRL_CMD_INT_ENABLE(msg->CMD_fin_int_enable)));    \r
+    reg = ((reg & (~m_RGA_MODE_CTRL_LUT_ENDIAN_MODE))  | (s_RGA_MODE_CTRL_LUT_ENDIAN_MODE(msg->endian_mode & 1)));       \r
     reg = ((reg & (~m_RGA_MODE_CTRL_SRC_TRANS_MODE))   | (s_RGA_MODE_CTRL_SRC_TRANS_MODE(msg->src_trans_mode)));\r
     reg = ((reg & (~m_RGA_MODE_CTRL_ZERO_MODE_ENABLE)) | (s_RGA_MODE_CTRL_ZERO_MODE_ENABLE(msg->alpha_rop_mode >> 4)));\r
     reg = ((reg & (~m_RGA_MODE_CTRL_DST_ALPHA_ENABLE)) | (s_RGA_MODE_CTRL_DST_ALPHA_ENABLE(msg->alpha_rop_mode >> 5)));\r
@@ -997,8 +1000,8 @@ RGA_set_bitblt_reg_info(u8 *base, const struct rga_req * msg, TILE_INFO *tile)
 \r
         if (!((xmax < 0)||(xmin > msg->src.act_w - 1)||(ymax < 0)||(ymin > msg->src.act_h - 1)))\r
         {\r
-            xp = CLIP(xp, 0, msg->src.vir_w - 1);\r
-            yp = CLIP(yp, 0, msg->src.vir_h - 1);\r
+            xp = CLIP(xp, msg->src.x_offset, msg->src.x_offset + msg->src.act_w - 1);\r
+            yp = CLIP(yp, msg->src.y_offset, msg->src.y_offset + msg->src.act_h - 1);\r
         }\r
         \r
         switch(msg->src.format)\r
@@ -1419,7 +1422,7 @@ RGA_set_mmu_ctrl_reg_info(u8 *base, const struct rga_req *msg)
     reg = ((reg & (~m_RGA_MMU_CTRL_DST_FLUSH)) | s_RGA_MMU_CTRL_DST_FLUSH(dst_flag));\r
     reg = ((reg & (~m_RGA_MMU_CTRL_CMD_CHAN_FLUSH)) | s_RGA_MMU_CTRL_CMD_CHAN_FLUSH(CMD_flag));\r
     *RGA_MMU_CTRL_ADDR = reg;\r
-   \r
+\r
     return 0;\r
 }\r
 \r
@@ -1451,7 +1454,7 @@ RGA_gen_reg_info(const struct rga_req *msg, unsigned char *base)
             RGA_set_dst(base, msg);    \r
             RGA_set_color(base, msg);\r
             RGA_set_fading(base, msg);\r
-            RGA_set_pat(base, msg);\r
+            RGA_set_pat(base, msg);            \r
             matrix_cal(msg, &tile);\r
             dst_ctrl_cal(msg, &tile);\r
             src_tile_info_cal(msg, &tile);\r
index 07e79fe67467c51e51b81fdb32acdd2d1ea0ddcc..0ebf3d7701fdedf8fc654ec473773555866a9fa4 100755 (executable)
@@ -460,26 +460,3 @@ void matrix_cal(const struct rga_req *msg, TILE_INFO *tile);
 unsigned 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
-\r
-\r
-/*\r
-u8   RGA_pixel_width_init(u32 format);\r
-void dst_ctrl_cal(msg_t *msg, TILE_INFO *tile);\r
-void src_tile_info_cal(msg_t *msg, TILE_INFO *tile);\r
-void RGA_set_mode_ctrl(u8 *base, msg_t *msg);\r
-void RGA_set_src(u8 *base, msg_t *msg, TILE_INFO *tile);\r
-s32  RGA_set_dst(u8 *base, msg_t *msg);\r
-void RGA_set_alpha_rop(u8 *base, msg_t *msg);\r
-void RGA_set_color(u8 *base, msg_t *msg);\r
-s32  RGA_set_fading(u8 *base, msg_t *msg);\r
-s32  RGA_set_pat(u8 *base, msg_t *msg);\r
-void RGA_set_bitblt_reg_info(u8 *base, msg_t * msg, TILE_INFO *tile);\r
-void RGA_set_color_palette_reg_info(u8 *base, msg_t *msg);\r
-void RGA_set_color_fill_reg_info(u8 *base, msg_t *msg);\r
-s32  RGA_set_line_drawing_reg_info(u8 *base, msg_t *msg);\r
-s32  RGA_set_filter_reg_info(u8 *base, msg_t *msg);\r
-s32  RGA_set_pre_scale_reg_info(u8 *base, msg_t *msg);\r
-s32 RGA_set_update_palette_table_reg_info(u8 *base, msg_t *msg);\r
-s32 RGA_set_update_patten_buff_reg_info(u8 *base, msg_t *msg);\r
-s32  RGA_set_mmu_ctrl_reg_info(u8 *base, msg_t *msg);\r
-*/\r