From 9370bb92b2d16684ee45cf24e879c93c509162da Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Thu, 19 Dec 2024 01:47:39 +0000 Subject: [PATCH] add wifi6 8852be driver --- kernel/drivers/video/rockchip/rga/rga_reg_info.c | 3058 +++++++++++++++++++++++++++++----------------------------- 1 files changed, 1,529 insertions(+), 1,529 deletions(-) diff --git a/kernel/drivers/video/rockchip/rga/rga_reg_info.c b/kernel/drivers/video/rockchip/rga/rga_reg_info.c index 94a6305..563eaab 100644 --- a/kernel/drivers/video/rockchip/rga/rga_reg_info.c +++ b/kernel/drivers/video/rockchip/rga/rga_reg_info.c @@ -1,708 +1,708 @@ /* SPDX-License-Identifier: GPL-2.0 */ - -//#include <linux/kernel.h> -#include <linux/memory.h> -#include <linux/kernel.h> -#include <linux/init.h> -#include <linux/module.h> -#include <linux/platform_device.h> -#include <linux/sched.h> -#include <linux/mutex.h> -#include <linux/err.h> -#include <linux/clk.h> -#include <asm/delay.h> -#include <linux/dma-mapping.h> -#include <linux/delay.h> -#include <asm/io.h> -#include <linux/irq.h> -#include <linux/interrupt.h> -//#include <mach/io.h> -//#include <mach/irqs.h> -#include <linux/fs.h> -#include <linux/uaccess.h> -#include <linux/miscdevice.h> -#include <linux/poll.h> -#include <linux/delay.h> -#include <linux/wait.h> -#include <linux/syscalls.h> -#include <linux/timer.h> -#include <linux/time.h> -#include <asm/cacheflush.h> -#include <linux/slab.h> -#include <linux/fb.h> -#include <linux/wakelock.h> + +//#include <linux/kernel.h> +#include <linux/memory.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/module.h> +#include <linux/platform_device.h> +#include <linux/sched.h> +#include <linux/mutex.h> +#include <linux/err.h> +#include <linux/clk.h> +#include <asm/delay.h> +#include <linux/dma-mapping.h> +#include <linux/delay.h> +#include <asm/io.h> +#include <linux/irq.h> +#include <linux/interrupt.h> +//#include <mach/io.h> +//#include <mach/irqs.h> +#include <linux/fs.h> +#include <linux/uaccess.h> +#include <linux/miscdevice.h> +#include <linux/poll.h> +#include <linux/delay.h> +#include <linux/wait.h> +#include <linux/syscalls.h> +#include <linux/timer.h> +#include <linux/time.h> +#include <asm/cacheflush.h> +#include <linux/slab.h> +#include <linux/fb.h> +#include <linux/wakelock.h> #include <linux/version.h> - -#include "rga_reg_info.h" -#include "rga_rop.h" -#include "rga.h" - - -/************************************************************* -Func: - RGA_pixel_width_init -Description: - select pixel_width form data format -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ -unsigned char -RGA_pixel_width_init(unsigned int format) -{ - unsigned char pixel_width; - - pixel_width = 0; - - switch(format) - { - /* RGB FORMAT */ - case RK_FORMAT_RGBA_8888 : pixel_width = 4; break; - case RK_FORMAT_RGBX_8888 : pixel_width = 4; break; - case RK_FORMAT_RGB_888 : pixel_width = 3; break; - case RK_FORMAT_BGRA_8888 : pixel_width = 4; break; - case RK_FORMAT_RGB_565 : pixel_width = 2; break; - case RK_FORMAT_RGBA_5551 : pixel_width = 2; break; - case RK_FORMAT_RGBA_4444 : pixel_width = 2; break; - case RK_FORMAT_BGR_888 : pixel_width = 3; break; - - /* YUV FORMAT */ - case RK_FORMAT_YCbCr_422_SP : pixel_width = 1; break; - case RK_FORMAT_YCbCr_422_P : pixel_width = 1; break; - case RK_FORMAT_YCbCr_420_SP : pixel_width = 1; break; - case RK_FORMAT_YCbCr_420_P : pixel_width = 1; break; - case RK_FORMAT_YCrCb_422_SP : pixel_width = 1; break; - case RK_FORMAT_YCrCb_422_P : pixel_width = 1; break; - case RK_FORMAT_YCrCb_420_SP : pixel_width = 1; break; - case RK_FORMAT_YCrCb_420_P : pixel_width = 1; break; - //case default : pixel_width = 0; break; - } - - return pixel_width; -} - -/************************************************************* -Func: - dst_ctrl_cal -Description: - calculate dst act window position / width / height - and set the tile struct -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ + +#include "rga_reg_info.h" +#include "rga_rop.h" +#include "rga.h" + + +/************************************************************* +Func: + RGA_pixel_width_init +Description: + select pixel_width form data format +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ +unsigned char +RGA_pixel_width_init(unsigned int format) +{ + unsigned char pixel_width; + + pixel_width = 0; + + switch(format) + { + /* RGB FORMAT */ + case RK_FORMAT_RGBA_8888 : pixel_width = 4; break; + case RK_FORMAT_RGBX_8888 : pixel_width = 4; break; + case RK_FORMAT_RGB_888 : pixel_width = 3; break; + case RK_FORMAT_BGRA_8888 : pixel_width = 4; break; + case RK_FORMAT_RGB_565 : pixel_width = 2; break; + case RK_FORMAT_RGBA_5551 : pixel_width = 2; break; + case RK_FORMAT_RGBA_4444 : pixel_width = 2; break; + case RK_FORMAT_BGR_888 : pixel_width = 3; break; + + /* YUV FORMAT */ + case RK_FORMAT_YCbCr_422_SP : pixel_width = 1; break; + case RK_FORMAT_YCbCr_422_P : pixel_width = 1; break; + case RK_FORMAT_YCbCr_420_SP : pixel_width = 1; break; + case RK_FORMAT_YCbCr_420_P : pixel_width = 1; break; + case RK_FORMAT_YCrCb_422_SP : pixel_width = 1; break; + case RK_FORMAT_YCrCb_422_P : pixel_width = 1; break; + case RK_FORMAT_YCrCb_420_SP : pixel_width = 1; break; + case RK_FORMAT_YCrCb_420_P : pixel_width = 1; break; + //case default : pixel_width = 0; break; + } + + return pixel_width; +} + +/************************************************************* +Func: + dst_ctrl_cal +Description: + calculate dst act window position / width / height + and set the tile struct +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static void -dst_ctrl_cal(const struct rga_req *msg, TILE_INFO *tile) -{ - u32 width = msg->dst.act_w; - u32 height = msg->dst.act_h; - s32 xoff = msg->dst.x_offset; - s32 yoff = msg->dst.y_offset; - - s32 x0, y0, x1, y1, x2, y2; - s32 x00,y00,x10,y10,x20,y20; - s32 xx, xy, yx, yy; - s32 pos[8]; - - s32 xmax, xmin, ymax, ymin; - - s32 sina = msg->sina; /* 16.16 */ - s32 cosa = msg->cosa; /* 16.16 */ - - xmax = xmin = ymax = ymin = 0; - - if((msg->rotate_mode == 0)||(msg->rotate_mode == 2)||(msg->rotate_mode == 3)) - { - pos[0] = xoff; - pos[1] = yoff; - - pos[2] = xoff; - pos[3] = yoff + height - 1; - - pos[4] = xoff + width - 1; - pos[5] = yoff + height - 1; - - pos[6] = xoff + width - 1; - pos[7] = yoff; - - xmax = MIN(MAX(MAX(MAX(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmax); - xmin = MAX(MIN(MIN(MIN(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmin); - - ymax = MIN(MAX(MAX(MAX(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymax); - ymin = MAX(MIN(MIN(MIN(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymin); - - //printk("xmax = %d, xmin = %d, ymin = %d, ymax = %d\n", xmax, xmin, ymin, ymax); - } - else if(msg->rotate_mode == 1) - { - if((sina == 0) || (cosa == 0)) - { - if((sina == 0) && (cosa == -65536)) - { - /* 180 */ - pos[0] = xoff - width + 1; - pos[1] = yoff - height + 1; - - pos[2] = xoff - width + 1; - pos[3] = yoff; - - pos[4] = xoff; - pos[5] = yoff; - - pos[6] = xoff; - pos[7] = yoff - height + 1; - } - else if((cosa == 0)&&(sina == 65536)) - { - /* 90 */ - pos[0] = xoff - height + 1; - pos[1] = yoff; - - pos[2] = xoff - height + 1; - pos[3] = yoff + width - 1; - - pos[4] = xoff; - pos[5] = yoff + width - 1; - - pos[6] = xoff; - pos[7] = yoff; - } - else if((cosa == 0)&&(sina == -65536)) - { - /* 270 */ - pos[0] = xoff; - pos[1] = yoff - width + 1; - - pos[2] = xoff; - pos[3] = yoff; - - pos[4] = xoff + height - 1; - pos[5] = yoff; - - pos[6] = xoff + height - 1; - pos[7] = yoff - width + 1; - } - else - { - /* 0 */ - pos[0] = xoff; - pos[1] = yoff; - - pos[2] = xoff; - pos[3] = yoff + height - 1; - - pos[4] = xoff + width - 1; - pos[5] = yoff + height - 1; - - pos[6] = xoff + width - 1; - pos[7] = yoff; - } - - xmax = MIN(MAX(MAX(MAX(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmax); - xmin = MAX(MIN(MIN(MIN(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmin); - - ymax = MIN(MAX(MAX(MAX(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymax); - ymin = MAX(MIN(MIN(MIN(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymin); - } - else - { - xx = msg->cosa; - xy = msg->sina; - yx = xy; - yy = xx; - - x0 = width + xoff; - y0 = yoff; - - x1 = xoff; - y1 = height + yoff; - - x2 = width + xoff; - y2 = height + yoff; - - pos[0] = xoff; - pos[1] = yoff; - - pos[2] = x00 = (((x0 - xoff)*xx - (y0 - yoff)*xy)>>16) + xoff; - pos[3] = y00 = (((x0 - xoff)*yx + (y0 - yoff)*yy)>>16) + yoff; - - pos[4] = x10 = (((x1 - xoff)*xx - (y1 - yoff)*xy)>>16) + xoff; - pos[5] = y10 = (((x1 - xoff)*yx + (y1 - yoff)*yy)>>16) + yoff; - - pos[6] = x20 = (((x2 - xoff)*xx - (y2 - yoff)*xy)>>16) + xoff; - pos[7] = y20 = (((x2 - xoff)*yx + (y2 - yoff)*yy)>>16) + yoff; - - xmax = MAX(MAX(MAX(x00, xoff), x10), x20) + 2; - xmin = MIN(MIN(MIN(x00, xoff), x10), x20) - 1; - - ymax = MAX(MAX(MAX(y00, yoff), y10), y20) + 2; - ymin = MIN(MIN(MIN(y00, yoff), y10), y20) - 1; - - xmax = MIN(xmax, msg->clip.xmax); - xmin = MAX(xmin, msg->clip.xmin); - - ymax = MIN(ymax, msg->clip.ymax); - ymin = MAX(ymin, msg->clip.ymin); - - //printk("xmin = %d, xmax = %d, ymin = %d, ymax = %d\n", xmin, xmax, ymin, ymax); - } - } - - if ((xmax < xmin) || (ymax < ymin)) { - xmin = xmax; - ymin = ymax; - } - - if ((xmin >= msg->dst.vir_w)||(xmax < 0)||(ymin >= msg->dst.vir_h)||(ymax < 0)) { - xmin = xmax = ymin = ymax = 0; - } - - //printk("xmin = %d, xmax = %d, ymin = %d, ymax = %d\n", xmin, xmax, ymin, ymax); - - tile->dst_ctrl.w = (xmax - xmin); - tile->dst_ctrl.h = (ymax - ymin); - tile->dst_ctrl.x_off = xmin; - tile->dst_ctrl.y_off = ymin; - - //printk("tile->dst_ctrl.w = %x, tile->dst_ctrl.h = %x\n", tile->dst_ctrl.w, tile->dst_ctrl.h); - - tile->tile_x_num = (xmax - xmin + 1 + 7)>>3; - tile->tile_y_num = (ymax - ymin + 1 + 7)>>3; - - tile->dst_x_tmp = xmin - msg->dst.x_offset; - tile->dst_y_tmp = ymin - msg->dst.y_offset; -} - -/************************************************************* -Func: - src_tile_info_cal -Description: - calculate src remap window position / width / height - and set the tile struct -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ - +dst_ctrl_cal(const struct rga_req *msg, TILE_INFO *tile) +{ + u32 width = msg->dst.act_w; + u32 height = msg->dst.act_h; + s32 xoff = msg->dst.x_offset; + s32 yoff = msg->dst.y_offset; + + s32 x0, y0, x1, y1, x2, y2; + s32 x00,y00,x10,y10,x20,y20; + s32 xx, xy, yx, yy; + s32 pos[8]; + + s32 xmax, xmin, ymax, ymin; + + s32 sina = msg->sina; /* 16.16 */ + s32 cosa = msg->cosa; /* 16.16 */ + + xmax = xmin = ymax = ymin = 0; + + if((msg->rotate_mode == 0)||(msg->rotate_mode == 2)||(msg->rotate_mode == 3)) + { + pos[0] = xoff; + pos[1] = yoff; + + pos[2] = xoff; + pos[3] = yoff + height - 1; + + pos[4] = xoff + width - 1; + pos[5] = yoff + height - 1; + + pos[6] = xoff + width - 1; + pos[7] = yoff; + + xmax = MIN(MAX(MAX(MAX(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmax); + xmin = MAX(MIN(MIN(MIN(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmin); + + ymax = MIN(MAX(MAX(MAX(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymax); + ymin = MAX(MIN(MIN(MIN(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymin); + + //printk("xmax = %d, xmin = %d, ymin = %d, ymax = %d\n", xmax, xmin, ymin, ymax); + } + else if(msg->rotate_mode == 1) + { + if((sina == 0) || (cosa == 0)) + { + if((sina == 0) && (cosa == -65536)) + { + /* 180 */ + pos[0] = xoff - width + 1; + pos[1] = yoff - height + 1; + + pos[2] = xoff - width + 1; + pos[3] = yoff; + + pos[4] = xoff; + pos[5] = yoff; + + pos[6] = xoff; + pos[7] = yoff - height + 1; + } + else if((cosa == 0)&&(sina == 65536)) + { + /* 90 */ + pos[0] = xoff - height + 1; + pos[1] = yoff; + + pos[2] = xoff - height + 1; + pos[3] = yoff + width - 1; + + pos[4] = xoff; + pos[5] = yoff + width - 1; + + pos[6] = xoff; + pos[7] = yoff; + } + else if((cosa == 0)&&(sina == -65536)) + { + /* 270 */ + pos[0] = xoff; + pos[1] = yoff - width + 1; + + pos[2] = xoff; + pos[3] = yoff; + + pos[4] = xoff + height - 1; + pos[5] = yoff; + + pos[6] = xoff + height - 1; + pos[7] = yoff - width + 1; + } + else + { + /* 0 */ + pos[0] = xoff; + pos[1] = yoff; + + pos[2] = xoff; + pos[3] = yoff + height - 1; + + pos[4] = xoff + width - 1; + pos[5] = yoff + height - 1; + + pos[6] = xoff + width - 1; + pos[7] = yoff; + } + + xmax = MIN(MAX(MAX(MAX(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmax); + xmin = MAX(MIN(MIN(MIN(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmin); + + ymax = MIN(MAX(MAX(MAX(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymax); + ymin = MAX(MIN(MIN(MIN(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymin); + } + else + { + xx = msg->cosa; + xy = msg->sina; + yx = xy; + yy = xx; + + x0 = width + xoff; + y0 = yoff; + + x1 = xoff; + y1 = height + yoff; + + x2 = width + xoff; + y2 = height + yoff; + + pos[0] = xoff; + pos[1] = yoff; + + pos[2] = x00 = (((x0 - xoff)*xx - (y0 - yoff)*xy)>>16) + xoff; + pos[3] = y00 = (((x0 - xoff)*yx + (y0 - yoff)*yy)>>16) + yoff; + + pos[4] = x10 = (((x1 - xoff)*xx - (y1 - yoff)*xy)>>16) + xoff; + pos[5] = y10 = (((x1 - xoff)*yx + (y1 - yoff)*yy)>>16) + yoff; + + pos[6] = x20 = (((x2 - xoff)*xx - (y2 - yoff)*xy)>>16) + xoff; + pos[7] = y20 = (((x2 - xoff)*yx + (y2 - yoff)*yy)>>16) + yoff; + + xmax = MAX(MAX(MAX(x00, xoff), x10), x20) + 2; + xmin = MIN(MIN(MIN(x00, xoff), x10), x20) - 1; + + ymax = MAX(MAX(MAX(y00, yoff), y10), y20) + 2; + ymin = MIN(MIN(MIN(y00, yoff), y10), y20) - 1; + + xmax = MIN(xmax, msg->clip.xmax); + xmin = MAX(xmin, msg->clip.xmin); + + ymax = MIN(ymax, msg->clip.ymax); + ymin = MAX(ymin, msg->clip.ymin); + + //printk("xmin = %d, xmax = %d, ymin = %d, ymax = %d\n", xmin, xmax, ymin, ymax); + } + } + + if ((xmax < xmin) || (ymax < ymin)) { + xmin = xmax; + ymin = ymax; + } + + if ((xmin >= msg->dst.vir_w)||(xmax < 0)||(ymin >= msg->dst.vir_h)||(ymax < 0)) { + xmin = xmax = ymin = ymax = 0; + } + + //printk("xmin = %d, xmax = %d, ymin = %d, ymax = %d\n", xmin, xmax, ymin, ymax); + + tile->dst_ctrl.w = (xmax - xmin); + tile->dst_ctrl.h = (ymax - ymin); + tile->dst_ctrl.x_off = xmin; + tile->dst_ctrl.y_off = ymin; + + //printk("tile->dst_ctrl.w = %x, tile->dst_ctrl.h = %x\n", tile->dst_ctrl.w, tile->dst_ctrl.h); + + tile->tile_x_num = (xmax - xmin + 1 + 7)>>3; + tile->tile_y_num = (ymax - ymin + 1 + 7)>>3; + + tile->dst_x_tmp = xmin - msg->dst.x_offset; + tile->dst_y_tmp = ymin - msg->dst.y_offset; +} + +/************************************************************* +Func: + src_tile_info_cal +Description: + calculate src remap window position / width / height + and set the tile struct +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ + static void -src_tile_info_cal(const struct rga_req *msg, TILE_INFO *tile) -{ - s32 x0, x1, x2, x3, y0, y1, y2, y3; - - int64_t xx, xy, yx, yy; - - int64_t pos[8]; - int64_t epos[8]; - - int64_t x_dx, x_dy, y_dx, y_dy; - int64_t x_temp_start, y_temp_start; - int64_t xmax, xmin, ymax, ymin; - - int64_t t_xoff, t_yoff; - - xx = tile->matrix[0]; /* 32.32 */ - xy = tile->matrix[1]; /* 32.32 */ - yx = tile->matrix[2]; /* 32.32 */ - yy = tile->matrix[3]; /* 32.32 */ - - if(msg->rotate_mode == 1) - { - x0 = tile->dst_x_tmp; - y0 = tile->dst_y_tmp; - - x1 = x0; - y1 = y0 + 8; - - x2 = x0 + 8; - y2 = y0 + 8; - - x3 = x0 + 8; - y3 = y0; - - pos[0] = (x0*xx + y0*yx); - pos[1] = (x0*xy + y0*yy); - - pos[2] = (x1*xx + y1*yx); - pos[3] = (x1*xy + y1*yy); - - pos[4] = (x2*xx + y2*yx); - pos[5] = (x2*xy + y2*yy); - - pos[6] = (x3*xx + y3*yx); - pos[7] = (x3*xy + y3*yy); - - y1 = y0 + 7; - x2 = x0 + 7; - y2 = y0 + 7; - x3 = x0 + 7; - - epos[0] = pos[0]; - epos[1] = pos[1]; - - epos[2] = (x1*xx + y1*yx); - epos[3] = (x1*xy + y1*yy); - - epos[4] = (x2*xx + y2*yx); - epos[5] = (x2*xy + y2*yy); - - epos[6] = (x3*xx + y3*yx); - epos[7] = (x3*xy + y3*yy); - - x_dx = pos[6] - pos[0]; - x_dy = pos[7] - pos[1]; - - y_dx = pos[2] - pos[0]; - y_dy = pos[3] - pos[1]; - - tile->x_dx = (s32)(x_dx >> 22 ); - tile->x_dy = (s32)(x_dy >> 22 ); - tile->y_dx = (s32)(y_dx >> 22 ); - tile->y_dy = (s32)(y_dy >> 22 ); - - x_temp_start = x0*xx + y0*yx; - y_temp_start = x0*xy + y0*yy; - - xmax = (MAX(MAX(MAX(epos[0], epos[2]), epos[4]), epos[6])); - xmin = (MIN(MIN(MIN(epos[0], epos[2]), epos[4]), epos[6])); - - ymax = (MAX(MAX(MAX(epos[1], epos[3]), epos[5]), epos[7])); - ymin = (MIN(MIN(MIN(epos[1], epos[3]), epos[5]), epos[7])); - - t_xoff = (x_temp_start - xmin)>>18; - t_yoff = (y_temp_start - ymin)>>18; - - tile->tile_xoff = (s32)t_xoff; - tile->tile_yoff = (s32)t_yoff; - - tile->tile_w = (u16)((xmax - xmin)>>21); //.11 - tile->tile_h = (u16)((ymax - ymin)>>21); //.11 - - tile->tile_start_x_coor = (s16)(xmin>>29); //.3 - tile->tile_start_y_coor = (s16)(ymin>>29); //.3 - } - else if (msg->rotate_mode == 2) - { - tile->x_dx = (s32)((8*xx)>>22); - tile->x_dy = 0; - tile->y_dx = 0; - tile->y_dy = (s32)((8*yy)>>22); - - tile->tile_w = ABS((s32)((7*xx)>>21)); - tile->tile_h = ABS((s32)((7*yy)>>21)); - - tile->tile_xoff = ABS((s32)((7*xx)>>18)); - tile->tile_yoff = 0; - - tile->tile_start_x_coor = (((msg->src.act_w - 1)<<11) - (tile->tile_w))>>8; - tile->tile_start_y_coor = 0; - } - else if (msg->rotate_mode == 3) - { - tile->x_dx = (s32)((8*xx)>>22); - tile->x_dy = 0; - tile->y_dx = 0; - tile->y_dy = (s32)((8*yy)>>22); - - tile->tile_w = ABS((s32)((7*xx)>>21)); - tile->tile_h = ABS((s32)((7*yy)>>21)); - - tile->tile_xoff = 0; - tile->tile_yoff = ABS((s32)((7*yy)>>18)); - - tile->tile_start_x_coor = 0; - tile->tile_start_y_coor = (((msg->src.act_h - 1)<<11) - (tile->tile_h))>>8; - } - - if ((msg->scale_mode == 2)||(msg->alpha_rop_flag >> 7)) - { - tile->tile_start_x_coor -= (1<<3); - tile->tile_start_y_coor -= (1<<3); - tile->tile_w += (2 << 11); - tile->tile_h += (2 << 11); - tile->tile_xoff += (1<<14); - tile->tile_yoff += (1<<14); - } -} - - -/************************************************************* -Func: - RGA_set_mode_ctrl -Description: - fill mode ctrl reg info -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ - +src_tile_info_cal(const struct rga_req *msg, TILE_INFO *tile) +{ + s32 x0, x1, x2, x3, y0, y1, y2, y3; + + int64_t xx, xy, yx, yy; + + int64_t pos[8]; + int64_t epos[8]; + + int64_t x_dx, x_dy, y_dx, y_dy; + int64_t x_temp_start, y_temp_start; + int64_t xmax, xmin, ymax, ymin; + + int64_t t_xoff, t_yoff; + + xx = tile->matrix[0]; /* 32.32 */ + xy = tile->matrix[1]; /* 32.32 */ + yx = tile->matrix[2]; /* 32.32 */ + yy = tile->matrix[3]; /* 32.32 */ + + if(msg->rotate_mode == 1) + { + x0 = tile->dst_x_tmp; + y0 = tile->dst_y_tmp; + + x1 = x0; + y1 = y0 + 8; + + x2 = x0 + 8; + y2 = y0 + 8; + + x3 = x0 + 8; + y3 = y0; + + pos[0] = (x0*xx + y0*yx); + pos[1] = (x0*xy + y0*yy); + + pos[2] = (x1*xx + y1*yx); + pos[3] = (x1*xy + y1*yy); + + pos[4] = (x2*xx + y2*yx); + pos[5] = (x2*xy + y2*yy); + + pos[6] = (x3*xx + y3*yx); + pos[7] = (x3*xy + y3*yy); + + y1 = y0 + 7; + x2 = x0 + 7; + y2 = y0 + 7; + x3 = x0 + 7; + + epos[0] = pos[0]; + epos[1] = pos[1]; + + epos[2] = (x1*xx + y1*yx); + epos[3] = (x1*xy + y1*yy); + + epos[4] = (x2*xx + y2*yx); + epos[5] = (x2*xy + y2*yy); + + epos[6] = (x3*xx + y3*yx); + epos[7] = (x3*xy + y3*yy); + + x_dx = pos[6] - pos[0]; + x_dy = pos[7] - pos[1]; + + y_dx = pos[2] - pos[0]; + y_dy = pos[3] - pos[1]; + + tile->x_dx = (s32)(x_dx >> 22 ); + tile->x_dy = (s32)(x_dy >> 22 ); + tile->y_dx = (s32)(y_dx >> 22 ); + tile->y_dy = (s32)(y_dy >> 22 ); + + x_temp_start = x0*xx + y0*yx; + y_temp_start = x0*xy + y0*yy; + + xmax = (MAX(MAX(MAX(epos[0], epos[2]), epos[4]), epos[6])); + xmin = (MIN(MIN(MIN(epos[0], epos[2]), epos[4]), epos[6])); + + ymax = (MAX(MAX(MAX(epos[1], epos[3]), epos[5]), epos[7])); + ymin = (MIN(MIN(MIN(epos[1], epos[3]), epos[5]), epos[7])); + + t_xoff = (x_temp_start - xmin)>>18; + t_yoff = (y_temp_start - ymin)>>18; + + tile->tile_xoff = (s32)t_xoff; + tile->tile_yoff = (s32)t_yoff; + + tile->tile_w = (u16)((xmax - xmin)>>21); //.11 + tile->tile_h = (u16)((ymax - ymin)>>21); //.11 + + tile->tile_start_x_coor = (s16)(xmin>>29); //.3 + tile->tile_start_y_coor = (s16)(ymin>>29); //.3 + } + else if (msg->rotate_mode == 2) + { + tile->x_dx = (s32)((8*xx)>>22); + tile->x_dy = 0; + tile->y_dx = 0; + tile->y_dy = (s32)((8*yy)>>22); + + tile->tile_w = ABS((s32)((7*xx)>>21)); + tile->tile_h = ABS((s32)((7*yy)>>21)); + + tile->tile_xoff = ABS((s32)((7*xx)>>18)); + tile->tile_yoff = 0; + + tile->tile_start_x_coor = (((msg->src.act_w - 1)<<11) - (tile->tile_w))>>8; + tile->tile_start_y_coor = 0; + } + else if (msg->rotate_mode == 3) + { + tile->x_dx = (s32)((8*xx)>>22); + tile->x_dy = 0; + tile->y_dx = 0; + tile->y_dy = (s32)((8*yy)>>22); + + tile->tile_w = ABS((s32)((7*xx)>>21)); + tile->tile_h = ABS((s32)((7*yy)>>21)); + + tile->tile_xoff = 0; + tile->tile_yoff = ABS((s32)((7*yy)>>18)); + + tile->tile_start_x_coor = 0; + tile->tile_start_y_coor = (((msg->src.act_h - 1)<<11) - (tile->tile_h))>>8; + } + + if ((msg->scale_mode == 2)||(msg->alpha_rop_flag >> 7)) + { + tile->tile_start_x_coor -= (1<<3); + tile->tile_start_y_coor -= (1<<3); + tile->tile_w += (2 << 11); + tile->tile_h += (2 << 11); + tile->tile_xoff += (1<<14); + tile->tile_yoff += (1<<14); + } +} + + +/************************************************************* +Func: + RGA_set_mode_ctrl +Description: + fill mode ctrl reg info +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ + static void -RGA_set_mode_ctrl(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_MODE_CTL; - u32 reg = 0; - - u8 src_rgb_pack = 0; - u8 src_format = 0; - u8 src_rb_swp = 0; - u8 src_a_swp = 0; - u8 src_cbcr_swp = 0; - - u8 dst_rgb_pack = 0; - u8 dst_format = 0; - u8 dst_rb_swp = 0; - u8 dst_a_swp = 0; - - bRGA_MODE_CTL = (u32 *)(base + RGA_MODE_CTRL_OFFSET); - - reg = ((reg & (~m_RGA_MODE_CTRL_2D_RENDER_MODE)) | (s_RGA_MODE_CTRL_2D_RENDER_MODE(msg->render_mode))); - - /* src info set */ - - if (msg->render_mode == color_palette_mode || msg->render_mode == update_palette_table_mode) - { - src_format = 0x10 | (msg->palette_mode & 3); - } - else - { - switch (msg->src.format) - { - case RK_FORMAT_RGBA_8888 : src_format = 0x0; break; - case RK_FORMAT_RGBA_4444 : src_format = 0x3; break; - case RK_FORMAT_RGBA_5551 : src_format = 0x2; break; - case RK_FORMAT_BGRA_8888 : src_format = 0x0; src_rb_swp = 0x1; break; - case RK_FORMAT_RGBX_8888 : src_format = 0x0; break; - case RK_FORMAT_RGB_565 : src_format = 0x1; break; - case RK_FORMAT_RGB_888 : src_format = 0x0; src_rgb_pack = 1; break; - case RK_FORMAT_BGR_888 : src_format = 0x0; src_rgb_pack = 1; src_rb_swp = 1; break; - - case RK_FORMAT_YCbCr_422_SP : src_format = 0x4; break; - case RK_FORMAT_YCbCr_422_P : src_format = 0x5; break; - case RK_FORMAT_YCbCr_420_SP : src_format = 0x6; break; - case RK_FORMAT_YCbCr_420_P : src_format = 0x7; break; - - case RK_FORMAT_YCrCb_422_SP : src_format = 0x4; src_cbcr_swp = 1; break; - case RK_FORMAT_YCrCb_422_P : src_format = 0x5; src_cbcr_swp = 1; break; - case RK_FORMAT_YCrCb_420_SP : src_format = 0x6; src_cbcr_swp = 1; break; - case RK_FORMAT_YCrCb_420_P : src_format = 0x7; src_cbcr_swp = 1; break; - } - } - - src_a_swp = msg->src.alpha_swap & 1; - - reg = ((reg & (~m_RGA_MODE_CTRL_SRC_RGB_PACK)) | (s_RGA_MODE_CTRL_SRC_RGB_PACK(src_rgb_pack))); - reg = ((reg & (~m_RGA_MODE_CTRL_SRC_FORMAT)) | (s_RGA_MODE_CTRL_SRC_FORMAT(src_format))); - reg = ((reg & (~m_RGA_MODE_CTRL_SRC_RB_SWAP)) | (s_RGA_MODE_CTRL_SRC_RB_SWAP(src_rb_swp))); - reg = ((reg & (~m_RGA_MODE_CTRL_SRC_ALPHA_SWAP)) | (s_RGA_MODE_CTRL_SRC_ALPHA_SWAP(src_a_swp))); - reg = ((reg & (~m_RGA_MODE_CTRL_SRC_UV_SWAP_MODE )) | (s_RGA_MODE_CTRL_SRC_UV_SWAP_MODE (src_cbcr_swp))); - - - /* YUV2RGB MODE */ - reg = ((reg & (~m_RGA_MODE_CTRL_YUV2RGB_CON_MODE)) | (s_RGA_MODE_CTRL_YUV2RGB_CON_MODE(msg->yuv2rgb_mode))); - - /* ROTATE MODE */ - reg = ((reg & (~m_RGA_MODE_CTRL_ROTATE_MODE)) | (s_RGA_MODE_CTRL_ROTATE_MODE(msg->rotate_mode))); - - /* SCALE MODE */ - reg = ((reg & (~m_RGA_MODE_CTRL_SCALE_MODE)) | (s_RGA_MODE_CTRL_SCALE_MODE(msg->scale_mode))); - - /* COLOR FILL MODE */ - reg = ((reg & (~m_RGA_MODE_CTRL_PAT_SEL)) | (s_RGA_MODE_CTRL_PAT_SEL(msg->color_fill_mode))); - - - if ((msg->render_mode == update_palette_table_mode)||(msg->render_mode == update_patten_buff_mode)) - { - dst_format = msg->pat.format; - } - else - { - dst_format = (u8)msg->dst.format; - } - - /* dst info set */ - switch (dst_format) - { - case RK_FORMAT_BGRA_8888 : dst_format = 0x0; dst_rb_swp = 0x1; break; - case RK_FORMAT_RGBA_4444 : dst_format = 0x3; break; - case RK_FORMAT_RGBA_5551 : dst_format = 0x2; break; - case RK_FORMAT_RGBA_8888 : dst_format = 0x0; break; - case RK_FORMAT_RGB_565 : dst_format = 0x1; break; - case RK_FORMAT_RGB_888 : dst_format = 0x0; dst_rgb_pack = 0x1; break; - case RK_FORMAT_BGR_888 : dst_format = 0x0; dst_rgb_pack = 0x1; dst_rb_swp = 1; break; - case RK_FORMAT_RGBX_8888 : dst_format = 0x0; break; - } - - dst_a_swp = msg->dst.alpha_swap & 1; - - reg = ((reg & (~m_RGA_MODE_CTRL_DST_FORMAT)) | (s_RGA_MODE_CTRL_DST_FORMAT(dst_format))); - reg = ((reg & (~m_RGA_MODE_CTRL_DST_RGB_PACK)) | (s_RGA_MODE_CTRL_DST_RGB_PACK(dst_rgb_pack))); - reg = ((reg & (~m_RGA_MODE_CTRL_DST_RB_SWAP)) | (s_RGA_MODE_CTRL_DST_RB_SWAP(dst_rb_swp))); - reg = ((reg & (~m_RGA_MODE_CTRL_DST_ALPHA_SWAP)) | (s_RGA_MODE_CTRL_DST_ALPHA_SWAP(dst_a_swp))); - reg = ((reg & (~m_RGA_MODE_CTRL_LUT_ENDIAN_MODE)) | (s_RGA_MODE_CTRL_LUT_ENDIAN_MODE(msg->endian_mode & 1))); - reg = ((reg & (~m_RGA_MODE_CTRL_SRC_TRANS_MODE)) | (s_RGA_MODE_CTRL_SRC_TRANS_MODE(msg->src_trans_mode))); - reg = ((reg & (~m_RGA_MODE_CTRL_ZERO_MODE_ENABLE)) | (s_RGA_MODE_CTRL_ZERO_MODE_ENABLE(msg->alpha_rop_mode >> 4))); - reg = ((reg & (~m_RGA_MODE_CTRL_DST_ALPHA_ENABLE)) | (s_RGA_MODE_CTRL_DST_ALPHA_ENABLE(msg->alpha_rop_mode >> 5))); - - *bRGA_MODE_CTL = reg; - -} - - - -/************************************************************* -Func: - RGA_set_src -Description: - fill src relate reg info -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ - +RGA_set_mode_ctrl(u8 *base, const struct rga_req *msg) +{ + u32 *bRGA_MODE_CTL; + u32 reg = 0; + + u8 src_rgb_pack = 0; + u8 src_format = 0; + u8 src_rb_swp = 0; + u8 src_a_swp = 0; + u8 src_cbcr_swp = 0; + + u8 dst_rgb_pack = 0; + u8 dst_format = 0; + u8 dst_rb_swp = 0; + u8 dst_a_swp = 0; + + bRGA_MODE_CTL = (u32 *)(base + RGA_MODE_CTRL_OFFSET); + + reg = ((reg & (~m_RGA_MODE_CTRL_2D_RENDER_MODE)) | (s_RGA_MODE_CTRL_2D_RENDER_MODE(msg->render_mode))); + + /* src info set */ + + if (msg->render_mode == color_palette_mode || msg->render_mode == update_palette_table_mode) + { + src_format = 0x10 | (msg->palette_mode & 3); + } + else + { + switch (msg->src.format) + { + case RK_FORMAT_RGBA_8888 : src_format = 0x0; break; + case RK_FORMAT_RGBA_4444 : src_format = 0x3; break; + case RK_FORMAT_RGBA_5551 : src_format = 0x2; break; + case RK_FORMAT_BGRA_8888 : src_format = 0x0; src_rb_swp = 0x1; break; + case RK_FORMAT_RGBX_8888 : src_format = 0x0; break; + case RK_FORMAT_RGB_565 : src_format = 0x1; break; + case RK_FORMAT_RGB_888 : src_format = 0x0; src_rgb_pack = 1; break; + case RK_FORMAT_BGR_888 : src_format = 0x0; src_rgb_pack = 1; src_rb_swp = 1; break; + + case RK_FORMAT_YCbCr_422_SP : src_format = 0x4; break; + case RK_FORMAT_YCbCr_422_P : src_format = 0x5; break; + case RK_FORMAT_YCbCr_420_SP : src_format = 0x6; break; + case RK_FORMAT_YCbCr_420_P : src_format = 0x7; break; + + case RK_FORMAT_YCrCb_422_SP : src_format = 0x4; src_cbcr_swp = 1; break; + case RK_FORMAT_YCrCb_422_P : src_format = 0x5; src_cbcr_swp = 1; break; + case RK_FORMAT_YCrCb_420_SP : src_format = 0x6; src_cbcr_swp = 1; break; + case RK_FORMAT_YCrCb_420_P : src_format = 0x7; src_cbcr_swp = 1; break; + } + } + + src_a_swp = msg->src.alpha_swap & 1; + + reg = ((reg & (~m_RGA_MODE_CTRL_SRC_RGB_PACK)) | (s_RGA_MODE_CTRL_SRC_RGB_PACK(src_rgb_pack))); + reg = ((reg & (~m_RGA_MODE_CTRL_SRC_FORMAT)) | (s_RGA_MODE_CTRL_SRC_FORMAT(src_format))); + reg = ((reg & (~m_RGA_MODE_CTRL_SRC_RB_SWAP)) | (s_RGA_MODE_CTRL_SRC_RB_SWAP(src_rb_swp))); + reg = ((reg & (~m_RGA_MODE_CTRL_SRC_ALPHA_SWAP)) | (s_RGA_MODE_CTRL_SRC_ALPHA_SWAP(src_a_swp))); + reg = ((reg & (~m_RGA_MODE_CTRL_SRC_UV_SWAP_MODE )) | (s_RGA_MODE_CTRL_SRC_UV_SWAP_MODE (src_cbcr_swp))); + + + /* YUV2RGB MODE */ + reg = ((reg & (~m_RGA_MODE_CTRL_YUV2RGB_CON_MODE)) | (s_RGA_MODE_CTRL_YUV2RGB_CON_MODE(msg->yuv2rgb_mode))); + + /* ROTATE MODE */ + reg = ((reg & (~m_RGA_MODE_CTRL_ROTATE_MODE)) | (s_RGA_MODE_CTRL_ROTATE_MODE(msg->rotate_mode))); + + /* SCALE MODE */ + reg = ((reg & (~m_RGA_MODE_CTRL_SCALE_MODE)) | (s_RGA_MODE_CTRL_SCALE_MODE(msg->scale_mode))); + + /* COLOR FILL MODE */ + reg = ((reg & (~m_RGA_MODE_CTRL_PAT_SEL)) | (s_RGA_MODE_CTRL_PAT_SEL(msg->color_fill_mode))); + + + if ((msg->render_mode == update_palette_table_mode)||(msg->render_mode == update_patten_buff_mode)) + { + dst_format = msg->pat.format; + } + else + { + dst_format = (u8)msg->dst.format; + } + + /* dst info set */ + switch (dst_format) + { + case RK_FORMAT_BGRA_8888 : dst_format = 0x0; dst_rb_swp = 0x1; break; + case RK_FORMAT_RGBA_4444 : dst_format = 0x3; break; + case RK_FORMAT_RGBA_5551 : dst_format = 0x2; break; + case RK_FORMAT_RGBA_8888 : dst_format = 0x0; break; + case RK_FORMAT_RGB_565 : dst_format = 0x1; break; + case RK_FORMAT_RGB_888 : dst_format = 0x0; dst_rgb_pack = 0x1; break; + case RK_FORMAT_BGR_888 : dst_format = 0x0; dst_rgb_pack = 0x1; dst_rb_swp = 1; break; + case RK_FORMAT_RGBX_8888 : dst_format = 0x0; break; + } + + dst_a_swp = msg->dst.alpha_swap & 1; + + reg = ((reg & (~m_RGA_MODE_CTRL_DST_FORMAT)) | (s_RGA_MODE_CTRL_DST_FORMAT(dst_format))); + reg = ((reg & (~m_RGA_MODE_CTRL_DST_RGB_PACK)) | (s_RGA_MODE_CTRL_DST_RGB_PACK(dst_rgb_pack))); + reg = ((reg & (~m_RGA_MODE_CTRL_DST_RB_SWAP)) | (s_RGA_MODE_CTRL_DST_RB_SWAP(dst_rb_swp))); + reg = ((reg & (~m_RGA_MODE_CTRL_DST_ALPHA_SWAP)) | (s_RGA_MODE_CTRL_DST_ALPHA_SWAP(dst_a_swp))); + reg = ((reg & (~m_RGA_MODE_CTRL_LUT_ENDIAN_MODE)) | (s_RGA_MODE_CTRL_LUT_ENDIAN_MODE(msg->endian_mode & 1))); + reg = ((reg & (~m_RGA_MODE_CTRL_SRC_TRANS_MODE)) | (s_RGA_MODE_CTRL_SRC_TRANS_MODE(msg->src_trans_mode))); + reg = ((reg & (~m_RGA_MODE_CTRL_ZERO_MODE_ENABLE)) | (s_RGA_MODE_CTRL_ZERO_MODE_ENABLE(msg->alpha_rop_mode >> 4))); + reg = ((reg & (~m_RGA_MODE_CTRL_DST_ALPHA_ENABLE)) | (s_RGA_MODE_CTRL_DST_ALPHA_ENABLE(msg->alpha_rop_mode >> 5))); + + *bRGA_MODE_CTL = reg; + +} + + + +/************************************************************* +Func: + RGA_set_src +Description: + fill src relate reg info +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ + static void -RGA_set_src(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_SRC_VIR_INFO; - u32 *bRGA_SRC_ACT_INFO; - u32 *bRGA_SRC_Y_MST; - u32 *bRGA_SRC_CB_MST; - u32 *bRGA_SRC_CR_MST; - - s16 x_off, y_off, stride; - s16 uv_x_off, uv_y_off, uv_stride; - u32 pixel_width; - - uv_x_off = uv_y_off = uv_stride = 0; - - bRGA_SRC_Y_MST = (u32 *)(base + RGA_SRC_Y_MST_OFFSET); - bRGA_SRC_CB_MST = (u32 *)(base + RGA_SRC_CB_MST_OFFSET); - bRGA_SRC_CR_MST = (u32 *)(base + RGA_SRC_CR_MST_OFFSET); - bRGA_SRC_VIR_INFO = (u32 *)(base + RGA_SRC_VIR_INFO_OFFSET); - bRGA_SRC_ACT_INFO = (u32 *)(base + RGA_SRC_ACT_INFO_OFFSET); - - x_off = msg->src.x_offset; - y_off = msg->src.y_offset; - - pixel_width = RGA_pixel_width_init(msg->src.format); - - stride = ((msg->src.vir_w * pixel_width) + 3) & (~3); - - switch(msg->src.format) - { - case RK_FORMAT_YCbCr_422_SP : - uv_stride = stride; - uv_x_off = x_off; - uv_y_off = y_off; - break; - case RK_FORMAT_YCbCr_422_P : - uv_stride = stride >> 1; - uv_x_off = x_off >> 1; - uv_y_off = y_off; - break; - case RK_FORMAT_YCbCr_420_SP : - uv_stride = stride; - uv_x_off = x_off; - uv_y_off = y_off >> 1; - break; - case RK_FORMAT_YCbCr_420_P : - uv_stride = stride >> 1; - uv_x_off = x_off >> 1; - uv_y_off = y_off >> 1; - break; - case RK_FORMAT_YCrCb_422_SP : - uv_stride = stride; - uv_x_off = x_off; - uv_y_off = y_off; - break; - case RK_FORMAT_YCrCb_422_P : - uv_stride = stride >> 1; - uv_x_off = x_off >> 1; - uv_y_off = y_off; - break; - case RK_FORMAT_YCrCb_420_SP : - uv_stride = stride; - uv_x_off = x_off; - uv_y_off = y_off >> 1; - break; - case RK_FORMAT_YCrCb_420_P : - uv_stride = stride >> 1; - uv_x_off = x_off >> 1; - uv_y_off = y_off >> 1; - break; - } - - - /* src addr set */ - *bRGA_SRC_Y_MST = msg->src.yrgb_addr + (y_off * stride) + (x_off * pixel_width); - *bRGA_SRC_CB_MST = msg->src.uv_addr + uv_y_off * uv_stride + uv_x_off; - *bRGA_SRC_CR_MST = msg->src.v_addr + uv_y_off * uv_stride + uv_x_off; - - if((msg->alpha_rop_flag >> 1) & 1) - *bRGA_SRC_CB_MST = (u32)msg->rop_mask_addr; - - if (msg->render_mode == color_palette_mode) - { - u8 shift; - u16 sw, byte_num; - shift = 3 - (msg->palette_mode & 3); - sw = msg->src.vir_w; - - byte_num = sw >> shift; - stride = (byte_num + 3) & (~3); - } - - /* src act window / vir window set */ - *bRGA_SRC_VIR_INFO = ((stride >> 2) | (msg->src.vir_h)<<16); - *bRGA_SRC_ACT_INFO = ((msg->src.act_w-1) | (msg->src.act_h-1)<<16); -} - - -/************************************************************* -Func: - RGA_set_dst -Description: - fill dst relate reg info -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ +RGA_set_src(u8 *base, const struct rga_req *msg) +{ + u32 *bRGA_SRC_VIR_INFO; + u32 *bRGA_SRC_ACT_INFO; + u32 *bRGA_SRC_Y_MST; + u32 *bRGA_SRC_CB_MST; + u32 *bRGA_SRC_CR_MST; + + s16 x_off, y_off, stride; + s16 uv_x_off, uv_y_off, uv_stride; + u32 pixel_width; + + uv_x_off = uv_y_off = uv_stride = 0; + + bRGA_SRC_Y_MST = (u32 *)(base + RGA_SRC_Y_MST_OFFSET); + bRGA_SRC_CB_MST = (u32 *)(base + RGA_SRC_CB_MST_OFFSET); + bRGA_SRC_CR_MST = (u32 *)(base + RGA_SRC_CR_MST_OFFSET); + bRGA_SRC_VIR_INFO = (u32 *)(base + RGA_SRC_VIR_INFO_OFFSET); + bRGA_SRC_ACT_INFO = (u32 *)(base + RGA_SRC_ACT_INFO_OFFSET); + + x_off = msg->src.x_offset; + y_off = msg->src.y_offset; + + pixel_width = RGA_pixel_width_init(msg->src.format); + + stride = ((msg->src.vir_w * pixel_width) + 3) & (~3); + + switch(msg->src.format) + { + case RK_FORMAT_YCbCr_422_SP : + uv_stride = stride; + uv_x_off = x_off; + uv_y_off = y_off; + break; + case RK_FORMAT_YCbCr_422_P : + uv_stride = stride >> 1; + uv_x_off = x_off >> 1; + uv_y_off = y_off; + break; + case RK_FORMAT_YCbCr_420_SP : + uv_stride = stride; + uv_x_off = x_off; + uv_y_off = y_off >> 1; + break; + case RK_FORMAT_YCbCr_420_P : + uv_stride = stride >> 1; + uv_x_off = x_off >> 1; + uv_y_off = y_off >> 1; + break; + case RK_FORMAT_YCrCb_422_SP : + uv_stride = stride; + uv_x_off = x_off; + uv_y_off = y_off; + break; + case RK_FORMAT_YCrCb_422_P : + uv_stride = stride >> 1; + uv_x_off = x_off >> 1; + uv_y_off = y_off; + break; + case RK_FORMAT_YCrCb_420_SP : + uv_stride = stride; + uv_x_off = x_off; + uv_y_off = y_off >> 1; + break; + case RK_FORMAT_YCrCb_420_P : + uv_stride = stride >> 1; + uv_x_off = x_off >> 1; + uv_y_off = y_off >> 1; + break; + } + + + /* src addr set */ + *bRGA_SRC_Y_MST = msg->src.yrgb_addr + (y_off * stride) + (x_off * pixel_width); + *bRGA_SRC_CB_MST = msg->src.uv_addr + uv_y_off * uv_stride + uv_x_off; + *bRGA_SRC_CR_MST = msg->src.v_addr + uv_y_off * uv_stride + uv_x_off; + + if((msg->alpha_rop_flag >> 1) & 1) + *bRGA_SRC_CB_MST = (u32)msg->rop_mask_addr; + + if (msg->render_mode == color_palette_mode) + { + u8 shift; + u16 sw, byte_num; + shift = 3 - (msg->palette_mode & 3); + sw = msg->src.vir_w; + + byte_num = sw >> shift; + stride = (byte_num + 3) & (~3); + } + + /* src act window / vir window set */ + *bRGA_SRC_VIR_INFO = ((stride >> 2) | (msg->src.vir_h)<<16); + *bRGA_SRC_ACT_INFO = ((msg->src.act_w-1) | (msg->src.act_h-1)<<16); +} + + +/************************************************************* +Func: + RGA_set_dst +Description: + fill dst relate reg info +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static s32 RGA_set_dst(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_DST_MST; - u32 *bRGA_DST_UV_MST; - u32 *bRGA_DST_VIR_INFO; - u32 *bRGA_DST_CTR_INFO; - u32 *bRGA_PRESCL_CB_MST; - u32 *bRGA_PRESCL_CR_MST; - u32 *bRGA_YUV_OUT_CFG; - - u32 reg = 0; - - u8 pw; - s16 x_off = msg->dst.x_offset; - s16 y_off = msg->dst.y_offset; - u16 stride, rop_mask_stride; - - bRGA_DST_MST = (u32 *)(base + RGA_DST_MST_OFFSET); - bRGA_DST_UV_MST = (u32 *)(base + RGA_DST_UV_MST_OFFSET); - bRGA_DST_VIR_INFO = (u32 *)(base + RGA_DST_VIR_INFO_OFFSET); - bRGA_DST_CTR_INFO = (u32 *)(base + RGA_DST_CTR_INFO_OFFSET); - bRGA_PRESCL_CB_MST = (u32 *)(base + RGA_PRESCL_CB_MST_OFFSET); - bRGA_PRESCL_CR_MST = (u32 *)(base + RGA_PRESCL_CR_MST_OFFSET); - bRGA_YUV_OUT_CFG = (u32 *)(base + RGA_YUV_OUT_CFG_OFFSET); - - pw = RGA_pixel_width_init(msg->dst.format); - - stride = (msg->dst.vir_w * pw + 3) & (~3); - - *bRGA_DST_MST = (u32)msg->dst.yrgb_addr + (y_off * stride) + (x_off * pw); - +{ + u32 *bRGA_DST_MST; + u32 *bRGA_DST_UV_MST; + u32 *bRGA_DST_VIR_INFO; + u32 *bRGA_DST_CTR_INFO; + u32 *bRGA_PRESCL_CB_MST; + u32 *bRGA_PRESCL_CR_MST; + u32 *bRGA_YUV_OUT_CFG; + + u32 reg = 0; + + u8 pw; + s16 x_off = msg->dst.x_offset; + s16 y_off = msg->dst.y_offset; + u16 stride, rop_mask_stride; + + bRGA_DST_MST = (u32 *)(base + RGA_DST_MST_OFFSET); + bRGA_DST_UV_MST = (u32 *)(base + RGA_DST_UV_MST_OFFSET); + bRGA_DST_VIR_INFO = (u32 *)(base + RGA_DST_VIR_INFO_OFFSET); + bRGA_DST_CTR_INFO = (u32 *)(base + RGA_DST_CTR_INFO_OFFSET); + bRGA_PRESCL_CB_MST = (u32 *)(base + RGA_PRESCL_CB_MST_OFFSET); + bRGA_PRESCL_CR_MST = (u32 *)(base + RGA_PRESCL_CR_MST_OFFSET); + bRGA_YUV_OUT_CFG = (u32 *)(base + RGA_YUV_OUT_CFG_OFFSET); + + pw = RGA_pixel_width_init(msg->dst.format); + + stride = (msg->dst.vir_w * pw + 3) & (~3); + + *bRGA_DST_MST = (u32)msg->dst.yrgb_addr + (y_off * stride) + (x_off * pw); + *bRGA_DST_UV_MST = 0; *bRGA_YUV_OUT_CFG = 0; if (msg->rotate_mode == 1) { @@ -719,869 +719,869 @@ } } - switch(msg->dst.format) - { - case RK_FORMAT_YCbCr_422_SP : - *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off) * pw); + switch(msg->dst.format) + { + case RK_FORMAT_YCbCr_422_SP : + *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off) * pw); *bRGA_DST_UV_MST = (u32)msg->dst.uv_addr + (y_off * stride) + x_off; *bRGA_YUV_OUT_CFG |= (((msg->yuv2rgb_mode >> 2) & 3) << 4) | (0 << 3) | (0 << 1) | 1; - break; - case RK_FORMAT_YCbCr_422_P : - *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off>>1) * pw); - *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr + ((y_off) * stride) + ((x_off>>1) * pw); - break; - case RK_FORMAT_YCbCr_420_SP : - *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off) * pw); + break; + case RK_FORMAT_YCbCr_422_P : + *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off>>1) * pw); + *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr + ((y_off) * stride) + ((x_off>>1) * pw); + break; + case RK_FORMAT_YCbCr_420_SP : + *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off) * pw); *bRGA_DST_UV_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + x_off; *bRGA_YUV_OUT_CFG |= (((msg->yuv2rgb_mode >> 2) & 3) << 4) | (0 << 3) | (1 << 1) | 1; - break; - case RK_FORMAT_YCbCr_420_P : - *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off>>1) * pw); - *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr + ((y_off>>1) * stride) + ((x_off>>1) * pw); - break; - case RK_FORMAT_YCrCb_422_SP : - *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off) * pw); + break; + case RK_FORMAT_YCbCr_420_P : + *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off>>1) * pw); + *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr + ((y_off>>1) * stride) + ((x_off>>1) * pw); + break; + case RK_FORMAT_YCrCb_422_SP : + *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off) * pw); *bRGA_DST_UV_MST = (u32)msg->dst.uv_addr + (y_off * stride) + x_off; *bRGA_YUV_OUT_CFG |= (((msg->yuv2rgb_mode >> 2) & 3) << 4) | (1 << 3) | (0 << 1) | 1; - break; - case RK_FORMAT_YCrCb_422_P : - *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off>>1) * pw); - *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr + ((y_off) * stride) + ((x_off>>1) * pw); - break; - case RK_FORMAT_YCrCb_420_SP : - *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off) * pw); + break; + case RK_FORMAT_YCrCb_422_P : + *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off>>1) * pw); + *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr + ((y_off) * stride) + ((x_off>>1) * pw); + break; + case RK_FORMAT_YCrCb_420_SP : + *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off) * pw); *bRGA_DST_UV_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + x_off; *bRGA_YUV_OUT_CFG |= (((msg->yuv2rgb_mode >> 2) & 3) << 4) | (1 << 3) | (1 << 1) | 1; - break; - case RK_FORMAT_YCrCb_420_P : - *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off>>1) * pw); - *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr + ((y_off>>1) * stride) + ((x_off>>1) * pw); - break; - } - - rop_mask_stride = (((msg->src.vir_w + 7)>>3) + 3) & (~3);//not dst_vir.w,hxx,2011.7.21 - - reg = (stride >> 2) & 0xffff; - reg = reg | ((rop_mask_stride>>2) << 16); - - #if defined(CONFIG_ARCH_RK2928) || defined(CONFIG_ARCH_RK3188) - //reg = reg | ((msg->alpha_rop_mode & 3) << 28); - reg = reg | (1 << 28); - #endif - - if (msg->render_mode == line_point_drawing_mode) - { - reg &= 0xffff; - reg = reg | (msg->dst.vir_h << 16); - } - - *bRGA_DST_VIR_INFO = reg; - *bRGA_DST_CTR_INFO = (msg->dst.act_w - 1) | ((msg->dst.act_h - 1) << 16); + break; + case RK_FORMAT_YCrCb_420_P : + *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off>>1) * pw); + *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr + ((y_off>>1) * stride) + ((x_off>>1) * pw); + break; + } + + rop_mask_stride = (((msg->src.vir_w + 7)>>3) + 3) & (~3);//not dst_vir.w,hxx,2011.7.21 + + reg = (stride >> 2) & 0xffff; + reg = reg | ((rop_mask_stride>>2) << 16); + + #if defined(CONFIG_ARCH_RK2928) || defined(CONFIG_ARCH_RK3188) + //reg = reg | ((msg->alpha_rop_mode & 3) << 28); + reg = reg | (1 << 28); + #endif + + if (msg->render_mode == line_point_drawing_mode) + { + reg &= 0xffff; + reg = reg | (msg->dst.vir_h << 16); + } + + *bRGA_DST_VIR_INFO = reg; + *bRGA_DST_CTR_INFO = (msg->dst.act_w - 1) | ((msg->dst.act_h - 1) << 16); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)) - if (msg->render_mode == pre_scaling_mode) { - *bRGA_YUV_OUT_CFG &= 0xfffffffe; - } + if (msg->render_mode == pre_scaling_mode) { + *bRGA_YUV_OUT_CFG &= 0xfffffffe; + } #endif - return 0; -} - - -/************************************************************* -Func: - RGA_set_alpha_rop -Description: - fill alpha rop some relate reg bit -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ + return 0; +} + + +/************************************************************* +Func: + RGA_set_alpha_rop +Description: + fill alpha rop some relate reg bit +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static void -RGA_set_alpha_rop(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_ALPHA_CON; - u32 *bRGA_ROP_CON0; - u32 *bRGA_ROP_CON1; - u32 reg = 0; - u32 rop_con0, rop_con1; - - u8 rop_mode = (msg->alpha_rop_mode) & 3; - u8 alpha_mode = msg->alpha_rop_mode & 3; - - rop_con0 = rop_con1 = 0; - - bRGA_ALPHA_CON = (u32 *)(base + RGA_ALPHA_CON_OFFSET); - - reg = ((reg & (~m_RGA_ALPHA_CON_ENABLE) )| (s_RGA_ALPHA_CON_ENABLE(msg->alpha_rop_flag & 1))); - reg = ((reg & (~m_RGA_ALPHA_CON_A_OR_R_SEL)) | (s_RGA_ALPHA_CON_A_OR_R_SEL((msg->alpha_rop_flag >> 1) & 1))); - reg = ((reg & (~m_RGA_ALPHA_CON_ALPHA_MODE)) | (s_RGA_ALPHA_CON_ALPHA_MODE(alpha_mode))); - reg = ((reg & (~m_RGA_ALPHA_CON_PD_MODE)) | (s_RGA_ALPHA_CON_PD_MODE(msg->PD_mode))); - reg = ((reg & (~m_RGA_ALPHA_CON_SET_CONSTANT_VALUE)) | (s_RGA_ALPHA_CON_SET_CONSTANT_VALUE(msg->alpha_global_value))); - reg = ((reg & (~m_RGA_ALPHA_CON_PD_M_SEL)) | (s_RGA_ALPHA_CON_PD_M_SEL(msg->alpha_rop_flag >> 3))); - reg = ((reg & (~m_RGA_ALPHA_CON_FADING_ENABLE)) | (s_RGA_ALPHA_CON_FADING_ENABLE(msg->alpha_rop_flag >> 2))); - reg = ((reg & (~m_RGA_ALPHA_CON_ROP_MODE_SEL)) | (s_RGA_ALPHA_CON_ROP_MODE_SEL(rop_mode))); - reg = ((reg & (~m_RGA_ALPHA_CON_CAL_MODE_SEL)) | (s_RGA_ALPHA_CON_CAL_MODE_SEL(msg->alpha_rop_flag >> 4))); - reg = ((reg & (~m_RGA_ALPHA_CON_DITHER_ENABLE)) | (s_RGA_ALPHA_CON_DITHER_ENABLE(msg->alpha_rop_flag >> 5))); - reg = ((reg & (~m_RGA_ALPHA_CON_GRADIENT_CAL_MODE)) | (s_RGA_ALPHA_CON_GRADIENT_CAL_MODE(msg->alpha_rop_flag >> 6))); - reg = ((reg & (~m_RGA_ALPHA_CON_AA_SEL)) | (s_RGA_ALPHA_CON_AA_SEL(msg->alpha_rop_flag >> 7))); - - *bRGA_ALPHA_CON = reg; - - if(rop_mode == 0) { - rop_con0 = ROP3_code[(msg->rop_code & 0xff)]; - } - else if(rop_mode == 1) { - rop_con0 = ROP3_code[(msg->rop_code & 0xff)]; - } - else if(rop_mode == 2) { - rop_con0 = ROP3_code[(msg->rop_code & 0xff)]; - rop_con1 = ROP3_code[(msg->rop_code & 0xff00)>>8]; - } - - bRGA_ROP_CON0 = (u32 *)(base + RGA_ROP_CON0_OFFSET); - bRGA_ROP_CON1 = (u32 *)(base + RGA_ROP_CON1_OFFSET); - - *bRGA_ROP_CON0 = (u32)rop_con0; - *bRGA_ROP_CON1 = (u32)rop_con1; -} - - -/************************************************************* -Func: - RGA_set_color -Description: - fill color some relate reg bit - bg_color/fg_color -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ +RGA_set_alpha_rop(u8 *base, const struct rga_req *msg) +{ + u32 *bRGA_ALPHA_CON; + u32 *bRGA_ROP_CON0; + u32 *bRGA_ROP_CON1; + u32 reg = 0; + u32 rop_con0, rop_con1; + + u8 rop_mode = (msg->alpha_rop_mode) & 3; + u8 alpha_mode = msg->alpha_rop_mode & 3; + + rop_con0 = rop_con1 = 0; + + bRGA_ALPHA_CON = (u32 *)(base + RGA_ALPHA_CON_OFFSET); + + reg = ((reg & (~m_RGA_ALPHA_CON_ENABLE) )| (s_RGA_ALPHA_CON_ENABLE(msg->alpha_rop_flag & 1))); + reg = ((reg & (~m_RGA_ALPHA_CON_A_OR_R_SEL)) | (s_RGA_ALPHA_CON_A_OR_R_SEL((msg->alpha_rop_flag >> 1) & 1))); + reg = ((reg & (~m_RGA_ALPHA_CON_ALPHA_MODE)) | (s_RGA_ALPHA_CON_ALPHA_MODE(alpha_mode))); + reg = ((reg & (~m_RGA_ALPHA_CON_PD_MODE)) | (s_RGA_ALPHA_CON_PD_MODE(msg->PD_mode))); + reg = ((reg & (~m_RGA_ALPHA_CON_SET_CONSTANT_VALUE)) | (s_RGA_ALPHA_CON_SET_CONSTANT_VALUE(msg->alpha_global_value))); + reg = ((reg & (~m_RGA_ALPHA_CON_PD_M_SEL)) | (s_RGA_ALPHA_CON_PD_M_SEL(msg->alpha_rop_flag >> 3))); + reg = ((reg & (~m_RGA_ALPHA_CON_FADING_ENABLE)) | (s_RGA_ALPHA_CON_FADING_ENABLE(msg->alpha_rop_flag >> 2))); + reg = ((reg & (~m_RGA_ALPHA_CON_ROP_MODE_SEL)) | (s_RGA_ALPHA_CON_ROP_MODE_SEL(rop_mode))); + reg = ((reg & (~m_RGA_ALPHA_CON_CAL_MODE_SEL)) | (s_RGA_ALPHA_CON_CAL_MODE_SEL(msg->alpha_rop_flag >> 4))); + reg = ((reg & (~m_RGA_ALPHA_CON_DITHER_ENABLE)) | (s_RGA_ALPHA_CON_DITHER_ENABLE(msg->alpha_rop_flag >> 5))); + reg = ((reg & (~m_RGA_ALPHA_CON_GRADIENT_CAL_MODE)) | (s_RGA_ALPHA_CON_GRADIENT_CAL_MODE(msg->alpha_rop_flag >> 6))); + reg = ((reg & (~m_RGA_ALPHA_CON_AA_SEL)) | (s_RGA_ALPHA_CON_AA_SEL(msg->alpha_rop_flag >> 7))); + + *bRGA_ALPHA_CON = reg; + + if(rop_mode == 0) { + rop_con0 = ROP3_code[(msg->rop_code & 0xff)]; + } + else if(rop_mode == 1) { + rop_con0 = ROP3_code[(msg->rop_code & 0xff)]; + } + else if(rop_mode == 2) { + rop_con0 = ROP3_code[(msg->rop_code & 0xff)]; + rop_con1 = ROP3_code[(msg->rop_code & 0xff00)>>8]; + } + + bRGA_ROP_CON0 = (u32 *)(base + RGA_ROP_CON0_OFFSET); + bRGA_ROP_CON1 = (u32 *)(base + RGA_ROP_CON1_OFFSET); + + *bRGA_ROP_CON0 = (u32)rop_con0; + *bRGA_ROP_CON1 = (u32)rop_con1; +} + + +/************************************************************* +Func: + RGA_set_color +Description: + fill color some relate reg bit + bg_color/fg_color +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static void -RGA_set_color(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_SRC_TR_COLOR0; - u32 *bRGA_SRC_TR_COLOR1; - u32 *bRGA_SRC_BG_COLOR; - u32 *bRGA_SRC_FG_COLOR; - - - bRGA_SRC_BG_COLOR = (u32 *)(base + RGA_SRC_BG_COLOR_OFFSET); - bRGA_SRC_FG_COLOR = (u32 *)(base + RGA_SRC_FG_COLOR_OFFSET); - - *bRGA_SRC_BG_COLOR = msg->bg_color; /* 1bpp 0 */ - *bRGA_SRC_FG_COLOR = msg->fg_color; /* 1bpp 1 */ - - bRGA_SRC_TR_COLOR0 = (u32 *)(base + RGA_SRC_TR_COLOR0_OFFSET); - bRGA_SRC_TR_COLOR1 = (u32 *)(base + RGA_SRC_TR_COLOR1_OFFSET); - - *bRGA_SRC_TR_COLOR0 = msg->color_key_min; - *bRGA_SRC_TR_COLOR1 = msg->color_key_max; -} - - -/************************************************************* -Func: - RGA_set_fading -Description: - fill fading some relate reg bit -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ +RGA_set_color(u8 *base, const struct rga_req *msg) +{ + u32 *bRGA_SRC_TR_COLOR0; + u32 *bRGA_SRC_TR_COLOR1; + u32 *bRGA_SRC_BG_COLOR; + u32 *bRGA_SRC_FG_COLOR; + + + bRGA_SRC_BG_COLOR = (u32 *)(base + RGA_SRC_BG_COLOR_OFFSET); + bRGA_SRC_FG_COLOR = (u32 *)(base + RGA_SRC_FG_COLOR_OFFSET); + + *bRGA_SRC_BG_COLOR = msg->bg_color; /* 1bpp 0 */ + *bRGA_SRC_FG_COLOR = msg->fg_color; /* 1bpp 1 */ + + bRGA_SRC_TR_COLOR0 = (u32 *)(base + RGA_SRC_TR_COLOR0_OFFSET); + bRGA_SRC_TR_COLOR1 = (u32 *)(base + RGA_SRC_TR_COLOR1_OFFSET); + + *bRGA_SRC_TR_COLOR0 = msg->color_key_min; + *bRGA_SRC_TR_COLOR1 = msg->color_key_max; +} + + +/************************************************************* +Func: + RGA_set_fading +Description: + fill fading some relate reg bit +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static s32 -RGA_set_fading(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_FADING_CON; - u8 r, g, b; - u32 reg = 0; - - bRGA_FADING_CON = (u32 *)(base + RGA_FADING_CON_OFFSET); - - b = msg->fading.b; - g = msg->fading.g; - r = msg->fading.r; - - reg = (r<<8) | (g<<16) | (b<<24) | reg; - - *bRGA_FADING_CON = reg; - - return 0; -} - - -/************************************************************* -Func: - RGA_set_pat -Description: - fill patten some relate reg bit -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ +RGA_set_fading(u8 *base, const struct rga_req *msg) +{ + u32 *bRGA_FADING_CON; + u8 r, g, b; + u32 reg = 0; + + bRGA_FADING_CON = (u32 *)(base + RGA_FADING_CON_OFFSET); + + b = msg->fading.b; + g = msg->fading.g; + r = msg->fading.r; + + reg = (r<<8) | (g<<16) | (b<<24) | reg; + + *bRGA_FADING_CON = reg; + + return 0; +} + + +/************************************************************* +Func: + RGA_set_pat +Description: + fill patten some relate reg bit +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static s32 -RGA_set_pat(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_PAT_CON; - u32 *bRGA_PAT_START_POINT; - u32 reg = 0; - - bRGA_PAT_START_POINT = (u32 *)(base + RGA_PAT_START_POINT_OFFSET); - - bRGA_PAT_CON = (u32 *)(base + RGA_PAT_CON_OFFSET); - - *bRGA_PAT_START_POINT = (msg->pat.act_w * msg->pat.y_offset) + msg->pat.x_offset; - - reg = (msg->pat.act_w - 1) | ((msg->pat.act_h - 1) << 8) | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24); - *bRGA_PAT_CON = reg; - - return 0; -} - - - - -/************************************************************* -Func: - RGA_set_bitblt_reg_info -Description: - fill bitblt mode relate ren info -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ +RGA_set_pat(u8 *base, const struct rga_req *msg) +{ + u32 *bRGA_PAT_CON; + u32 *bRGA_PAT_START_POINT; + u32 reg = 0; + + bRGA_PAT_START_POINT = (u32 *)(base + RGA_PAT_START_POINT_OFFSET); + + bRGA_PAT_CON = (u32 *)(base + RGA_PAT_CON_OFFSET); + + *bRGA_PAT_START_POINT = (msg->pat.act_w * msg->pat.y_offset) + msg->pat.x_offset; + + reg = (msg->pat.act_w - 1) | ((msg->pat.act_h - 1) << 8) | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24); + *bRGA_PAT_CON = reg; + + return 0; +} + + + + +/************************************************************* +Func: + RGA_set_bitblt_reg_info +Description: + fill bitblt mode relate ren info +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static void -RGA_set_bitblt_reg_info(u8 *base, const struct rga_req * msg, TILE_INFO *tile) -{ - u32 *bRGA_SRC_Y_MST; - u32 *bRGA_SRC_CB_MST; - u32 *bRGA_SRC_CR_MST; - u32 *bRGA_SRC_X_PARA; - u32 *bRGA_SRC_Y_PARA; - u32 *bRGA_SRC_TILE_XINFO; - u32 *bRGA_SRC_TILE_YINFO; - u32 *bRGA_SRC_TILE_H_INCR; - u32 *bRGA_SRC_TILE_V_INCR; - u32 *bRGA_SRC_TILE_OFFSETX; - u32 *bRGA_SRC_TILE_OFFSETY; - - u32 *bRGA_DST_MST; - u32 *bRGA_DST_CTR_INFO; - - s32 m0, m1, m2, m3; - s32 pos[8]; - //s32 x_dx, x_dy, y_dx, y_dy; - s32 xmin, xmax, ymin, ymax; - s32 xp, yp; - u32 y_addr, u_addr, v_addr; - u32 pixel_width, stride; - - u_addr = v_addr = 0; - - /* src info */ - - bRGA_SRC_Y_MST = (u32 *)(base + RGA_SRC_Y_MST_OFFSET); - bRGA_SRC_CB_MST = (u32 *)(base + RGA_SRC_CB_MST_OFFSET); - bRGA_SRC_CR_MST = (u32 *)(base + RGA_SRC_CR_MST_OFFSET); - - bRGA_SRC_X_PARA = (u32 *)(base + RGA_SRC_X_PARA_OFFSET); - bRGA_SRC_Y_PARA = (u32 *)(base + RGA_SRC_Y_PARA_OFFSET); - - bRGA_SRC_TILE_XINFO = (u32 *)(base + RGA_SRC_TILE_XINFO_OFFSET); - bRGA_SRC_TILE_YINFO = (u32 *)(base + RGA_SRC_TILE_YINFO_OFFSET); - bRGA_SRC_TILE_H_INCR = (u32 *)(base + RGA_SRC_TILE_H_INCR_OFFSET); - bRGA_SRC_TILE_V_INCR = (u32 *)(base + RGA_SRC_TILE_V_INCR_OFFSET); - bRGA_SRC_TILE_OFFSETX = (u32 *)(base + RGA_SRC_TILE_OFFSETX_OFFSET); - bRGA_SRC_TILE_OFFSETY = (u32 *)(base + RGA_SRC_TILE_OFFSETY_OFFSET); - - bRGA_DST_MST = (u32 *)(base + RGA_DST_MST_OFFSET); - bRGA_DST_CTR_INFO = (u32 *)(base + RGA_DST_CTR_INFO_OFFSET); - - /* Matrix reg fill */ - m0 = (s32)(tile->matrix[0] >> 18); - m1 = (s32)(tile->matrix[1] >> 18); - m2 = (s32)(tile->matrix[2] >> 18); - m3 = (s32)(tile->matrix[3] >> 18); - - *bRGA_SRC_X_PARA = (m0 & 0xffff) | (m2 << 16); - *bRGA_SRC_Y_PARA = (m1 & 0xffff) | (m3 << 16); - - /* src tile information setting */ - if(msg->rotate_mode != 0)//add by hxx,2011.7.12,for rtl0707,when line scanning ,do not calc src tile info - { - *bRGA_SRC_TILE_XINFO = (tile->tile_start_x_coor & 0xffff) | (tile->tile_w << 16); - *bRGA_SRC_TILE_YINFO = (tile->tile_start_y_coor & 0xffff) | (tile->tile_h << 16); - - *bRGA_SRC_TILE_H_INCR = ((tile->x_dx) & 0xffff) | ((tile->x_dy) << 16); - *bRGA_SRC_TILE_V_INCR = ((tile->y_dx) & 0xffff) | ((tile->y_dy) << 16); - - *bRGA_SRC_TILE_OFFSETX = tile->tile_xoff; - *bRGA_SRC_TILE_OFFSETY = tile->tile_yoff; - } - - pixel_width = RGA_pixel_width_init(msg->src.format); - - stride = ((msg->src.vir_w * pixel_width) + 3) & (~3); - - if ((msg->rotate_mode == 1)||(msg->rotate_mode == 2)||(msg->rotate_mode == 3)) - { - pos[0] = tile->tile_start_x_coor<<8; - pos[1] = tile->tile_start_y_coor<<8; - - pos[2] = pos[0]; - pos[3] = pos[1] + tile->tile_h; - - pos[4] = pos[0] + tile->tile_w; - pos[5] = pos[1] + tile->tile_h; - - pos[6] = pos[0] + tile->tile_w; - pos[7] = pos[1]; - - pos[0] >>= 11; - pos[1] >>= 11; - - pos[2] >>= 11; - pos[3] >>= 11; - - pos[4] >>= 11; - pos[5] >>= 11; - - pos[6] >>= 11; - pos[7] >>= 11; - - xmax = (MAX(MAX(MAX(pos[0], pos[2]), pos[4]), pos[6]) + 1); - xmin = (MIN(MIN(MIN(pos[0], pos[2]), pos[4]), pos[6])); - - ymax = (MAX(MAX(MAX(pos[1], pos[3]), pos[5]), pos[7]) + 1); - ymin = (MIN(MIN(MIN(pos[1], pos[3]), pos[5]), pos[7])); - - xp = xmin + msg->src.x_offset; - yp = ymin + msg->src.y_offset; - - if (!((xmax < 0)||(xmin > msg->src.act_w - 1)||(ymax < 0)||(ymin > msg->src.act_h - 1))) - { - xp = CLIP(xp, msg->src.x_offset, msg->src.x_offset + msg->src.act_w - 1); - yp = CLIP(yp, msg->src.y_offset, msg->src.y_offset + msg->src.act_h - 1); - } - - switch(msg->src.format) - { - case RK_FORMAT_YCbCr_420_P : - y_addr = msg->src.yrgb_addr + yp*stride + xp; - u_addr = msg->src.uv_addr + (yp>>1)*(stride>>1) + (xp>>1); - v_addr = msg->src.v_addr + (yp>>1)*(stride>>1) + (xp>>1); - break; - case RK_FORMAT_YCbCr_420_SP : - y_addr = msg->src.yrgb_addr + yp*stride + xp; - u_addr = msg->src.uv_addr + (yp>>1)*stride + ((xp>>1)<<1); - break; - case RK_FORMAT_YCbCr_422_P : - y_addr = msg->src.yrgb_addr + yp*stride + xp; - u_addr = msg->src.uv_addr + (yp)*(stride>>1) + (xp>>1); - v_addr = msg->src.v_addr + (yp)*(stride>>1) + (xp>>1); - break; - case RK_FORMAT_YCbCr_422_SP: - y_addr = msg->src.yrgb_addr + yp*stride + xp; - u_addr = msg->src.uv_addr + yp*stride + ((xp>>1)<<1); - break; - case RK_FORMAT_YCrCb_420_P : - y_addr = msg->src.yrgb_addr + yp*stride + xp; - u_addr = msg->src.uv_addr + (yp>>1)*(stride>>1) + (xp>>1); - v_addr = msg->src.v_addr + (yp>>1)*(stride>>1) + (xp>>1); - break; - case RK_FORMAT_YCrCb_420_SP : - y_addr = msg->src.yrgb_addr + yp*stride + xp; - u_addr = msg->src.uv_addr + (yp>>1)*stride + ((xp>>1)<<1); - break; - case RK_FORMAT_YCrCb_422_P : - y_addr = msg->src.yrgb_addr + yp*stride + xp; - u_addr = msg->src.uv_addr + (yp)*(stride>>1) + (xp>>1); - v_addr = msg->src.v_addr + (yp)*(stride>>1) + (xp>>1); - break; - case RK_FORMAT_YCrCb_422_SP: - y_addr = msg->src.yrgb_addr + yp*stride + xp; - u_addr = msg->src.uv_addr + yp*stride + ((xp>>1)<<1); - break; - default : - y_addr = msg->src.yrgb_addr + yp*stride + xp*pixel_width; - break; - } - - *bRGA_SRC_Y_MST = y_addr; - *bRGA_SRC_CB_MST = u_addr; - *bRGA_SRC_CR_MST = v_addr; - } - - /*dst info*/ - pixel_width = RGA_pixel_width_init(msg->dst.format); - stride = (msg->dst.vir_w * pixel_width + 3) & (~3); - *bRGA_DST_MST = (u32)msg->dst.yrgb_addr + (tile->dst_ctrl.y_off * stride) + (tile->dst_ctrl.x_off * pixel_width); - *bRGA_DST_CTR_INFO = (tile->dst_ctrl.w) | ((tile->dst_ctrl.h) << 16); - - *bRGA_DST_CTR_INFO |= ((1<<29) | (1<<28)); -} - - - - -/************************************************************* -Func: - RGA_set_color_palette_reg_info -Description: - fill color palette process some relate reg bit -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ +RGA_set_bitblt_reg_info(u8 *base, const struct rga_req * msg, TILE_INFO *tile) +{ + u32 *bRGA_SRC_Y_MST; + u32 *bRGA_SRC_CB_MST; + u32 *bRGA_SRC_CR_MST; + u32 *bRGA_SRC_X_PARA; + u32 *bRGA_SRC_Y_PARA; + u32 *bRGA_SRC_TILE_XINFO; + u32 *bRGA_SRC_TILE_YINFO; + u32 *bRGA_SRC_TILE_H_INCR; + u32 *bRGA_SRC_TILE_V_INCR; + u32 *bRGA_SRC_TILE_OFFSETX; + u32 *bRGA_SRC_TILE_OFFSETY; + + u32 *bRGA_DST_MST; + u32 *bRGA_DST_CTR_INFO; + + s32 m0, m1, m2, m3; + s32 pos[8]; + //s32 x_dx, x_dy, y_dx, y_dy; + s32 xmin, xmax, ymin, ymax; + s32 xp, yp; + u32 y_addr, u_addr, v_addr; + u32 pixel_width, stride; + + u_addr = v_addr = 0; + + /* src info */ + + bRGA_SRC_Y_MST = (u32 *)(base + RGA_SRC_Y_MST_OFFSET); + bRGA_SRC_CB_MST = (u32 *)(base + RGA_SRC_CB_MST_OFFSET); + bRGA_SRC_CR_MST = (u32 *)(base + RGA_SRC_CR_MST_OFFSET); + + bRGA_SRC_X_PARA = (u32 *)(base + RGA_SRC_X_PARA_OFFSET); + bRGA_SRC_Y_PARA = (u32 *)(base + RGA_SRC_Y_PARA_OFFSET); + + bRGA_SRC_TILE_XINFO = (u32 *)(base + RGA_SRC_TILE_XINFO_OFFSET); + bRGA_SRC_TILE_YINFO = (u32 *)(base + RGA_SRC_TILE_YINFO_OFFSET); + bRGA_SRC_TILE_H_INCR = (u32 *)(base + RGA_SRC_TILE_H_INCR_OFFSET); + bRGA_SRC_TILE_V_INCR = (u32 *)(base + RGA_SRC_TILE_V_INCR_OFFSET); + bRGA_SRC_TILE_OFFSETX = (u32 *)(base + RGA_SRC_TILE_OFFSETX_OFFSET); + bRGA_SRC_TILE_OFFSETY = (u32 *)(base + RGA_SRC_TILE_OFFSETY_OFFSET); + + bRGA_DST_MST = (u32 *)(base + RGA_DST_MST_OFFSET); + bRGA_DST_CTR_INFO = (u32 *)(base + RGA_DST_CTR_INFO_OFFSET); + + /* Matrix reg fill */ + m0 = (s32)(tile->matrix[0] >> 18); + m1 = (s32)(tile->matrix[1] >> 18); + m2 = (s32)(tile->matrix[2] >> 18); + m3 = (s32)(tile->matrix[3] >> 18); + + *bRGA_SRC_X_PARA = (m0 & 0xffff) | (m2 << 16); + *bRGA_SRC_Y_PARA = (m1 & 0xffff) | (m3 << 16); + + /* src tile information setting */ + if(msg->rotate_mode != 0)//add by hxx,2011.7.12,for rtl0707,when line scanning ,do not calc src tile info + { + *bRGA_SRC_TILE_XINFO = (tile->tile_start_x_coor & 0xffff) | (tile->tile_w << 16); + *bRGA_SRC_TILE_YINFO = (tile->tile_start_y_coor & 0xffff) | (tile->tile_h << 16); + + *bRGA_SRC_TILE_H_INCR = ((tile->x_dx) & 0xffff) | ((tile->x_dy) << 16); + *bRGA_SRC_TILE_V_INCR = ((tile->y_dx) & 0xffff) | ((tile->y_dy) << 16); + + *bRGA_SRC_TILE_OFFSETX = tile->tile_xoff; + *bRGA_SRC_TILE_OFFSETY = tile->tile_yoff; + } + + pixel_width = RGA_pixel_width_init(msg->src.format); + + stride = ((msg->src.vir_w * pixel_width) + 3) & (~3); + + if ((msg->rotate_mode == 1)||(msg->rotate_mode == 2)||(msg->rotate_mode == 3)) + { + pos[0] = tile->tile_start_x_coor<<8; + pos[1] = tile->tile_start_y_coor<<8; + + pos[2] = pos[0]; + pos[3] = pos[1] + tile->tile_h; + + pos[4] = pos[0] + tile->tile_w; + pos[5] = pos[1] + tile->tile_h; + + pos[6] = pos[0] + tile->tile_w; + pos[7] = pos[1]; + + pos[0] >>= 11; + pos[1] >>= 11; + + pos[2] >>= 11; + pos[3] >>= 11; + + pos[4] >>= 11; + pos[5] >>= 11; + + pos[6] >>= 11; + pos[7] >>= 11; + + xmax = (MAX(MAX(MAX(pos[0], pos[2]), pos[4]), pos[6]) + 1); + xmin = (MIN(MIN(MIN(pos[0], pos[2]), pos[4]), pos[6])); + + ymax = (MAX(MAX(MAX(pos[1], pos[3]), pos[5]), pos[7]) + 1); + ymin = (MIN(MIN(MIN(pos[1], pos[3]), pos[5]), pos[7])); + + xp = xmin + msg->src.x_offset; + yp = ymin + msg->src.y_offset; + + if (!((xmax < 0)||(xmin > msg->src.act_w - 1)||(ymax < 0)||(ymin > msg->src.act_h - 1))) + { + xp = CLIP(xp, msg->src.x_offset, msg->src.x_offset + msg->src.act_w - 1); + yp = CLIP(yp, msg->src.y_offset, msg->src.y_offset + msg->src.act_h - 1); + } + + switch(msg->src.format) + { + case RK_FORMAT_YCbCr_420_P : + y_addr = msg->src.yrgb_addr + yp*stride + xp; + u_addr = msg->src.uv_addr + (yp>>1)*(stride>>1) + (xp>>1); + v_addr = msg->src.v_addr + (yp>>1)*(stride>>1) + (xp>>1); + break; + case RK_FORMAT_YCbCr_420_SP : + y_addr = msg->src.yrgb_addr + yp*stride + xp; + u_addr = msg->src.uv_addr + (yp>>1)*stride + ((xp>>1)<<1); + break; + case RK_FORMAT_YCbCr_422_P : + y_addr = msg->src.yrgb_addr + yp*stride + xp; + u_addr = msg->src.uv_addr + (yp)*(stride>>1) + (xp>>1); + v_addr = msg->src.v_addr + (yp)*(stride>>1) + (xp>>1); + break; + case RK_FORMAT_YCbCr_422_SP: + y_addr = msg->src.yrgb_addr + yp*stride + xp; + u_addr = msg->src.uv_addr + yp*stride + ((xp>>1)<<1); + break; + case RK_FORMAT_YCrCb_420_P : + y_addr = msg->src.yrgb_addr + yp*stride + xp; + u_addr = msg->src.uv_addr + (yp>>1)*(stride>>1) + (xp>>1); + v_addr = msg->src.v_addr + (yp>>1)*(stride>>1) + (xp>>1); + break; + case RK_FORMAT_YCrCb_420_SP : + y_addr = msg->src.yrgb_addr + yp*stride + xp; + u_addr = msg->src.uv_addr + (yp>>1)*stride + ((xp>>1)<<1); + break; + case RK_FORMAT_YCrCb_422_P : + y_addr = msg->src.yrgb_addr + yp*stride + xp; + u_addr = msg->src.uv_addr + (yp)*(stride>>1) + (xp>>1); + v_addr = msg->src.v_addr + (yp)*(stride>>1) + (xp>>1); + break; + case RK_FORMAT_YCrCb_422_SP: + y_addr = msg->src.yrgb_addr + yp*stride + xp; + u_addr = msg->src.uv_addr + yp*stride + ((xp>>1)<<1); + break; + default : + y_addr = msg->src.yrgb_addr + yp*stride + xp*pixel_width; + break; + } + + *bRGA_SRC_Y_MST = y_addr; + *bRGA_SRC_CB_MST = u_addr; + *bRGA_SRC_CR_MST = v_addr; + } + + /*dst info*/ + pixel_width = RGA_pixel_width_init(msg->dst.format); + stride = (msg->dst.vir_w * pixel_width + 3) & (~3); + *bRGA_DST_MST = (u32)msg->dst.yrgb_addr + (tile->dst_ctrl.y_off * stride) + (tile->dst_ctrl.x_off * pixel_width); + *bRGA_DST_CTR_INFO = (tile->dst_ctrl.w) | ((tile->dst_ctrl.h) << 16); + + *bRGA_DST_CTR_INFO |= ((1<<29) | (1<<28)); +} + + + + +/************************************************************* +Func: + RGA_set_color_palette_reg_info +Description: + fill color palette process some relate reg bit +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static void -RGA_set_color_palette_reg_info(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_SRC_Y_MST; - u32 p; - s16 x_off, y_off; - u16 src_stride; - u8 shift; - u16 sw, byte_num; - - x_off = msg->src.x_offset; - y_off = msg->src.y_offset; - - sw = msg->src.vir_w; - shift = 3 - (msg->palette_mode & 3); - byte_num = sw >> shift; - src_stride = (byte_num + 3) & (~3); - - p = msg->src.yrgb_addr; - p = p + (x_off>>shift) + y_off*src_stride; - - bRGA_SRC_Y_MST = (u32 *)(base + RGA_SRC_Y_MST_OFFSET); - *bRGA_SRC_Y_MST = (u32)p; -} - - -/************************************************************* -Func: - RGA_set_color_fill_reg_info -Description: - fill color fill process some relate reg bit -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ +RGA_set_color_palette_reg_info(u8 *base, const struct rga_req *msg) +{ + u32 *bRGA_SRC_Y_MST; + u32 p; + s16 x_off, y_off; + u16 src_stride; + u8 shift; + u16 sw, byte_num; + + x_off = msg->src.x_offset; + y_off = msg->src.y_offset; + + sw = msg->src.vir_w; + shift = 3 - (msg->palette_mode & 3); + byte_num = sw >> shift; + src_stride = (byte_num + 3) & (~3); + + p = msg->src.yrgb_addr; + p = p + (x_off>>shift) + y_off*src_stride; + + bRGA_SRC_Y_MST = (u32 *)(base + RGA_SRC_Y_MST_OFFSET); + *bRGA_SRC_Y_MST = (u32)p; +} + + +/************************************************************* +Func: + RGA_set_color_fill_reg_info +Description: + fill color fill process some relate reg bit +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static void -RGA_set_color_fill_reg_info(u8 *base, const struct rga_req *msg) -{ - - u32 *bRGA_CP_GR_A; - u32 *bRGA_CP_GR_B; - u32 *bRGA_CP_GR_G; - u32 *bRGA_CP_GR_R; - - u32 *bRGA_PAT_CON; - - bRGA_CP_GR_A = (u32 *)(base + RGA_CP_GR_A_OFFSET); - bRGA_CP_GR_B = (u32 *)(base + RGA_CP_GR_B_OFFSET); - bRGA_CP_GR_G = (u32 *)(base + RGA_CP_GR_G_OFFSET); - bRGA_CP_GR_R = (u32 *)(base + RGA_CP_GR_R_OFFSET); - - bRGA_PAT_CON = (u32 *)(base + RGA_PAT_CON_OFFSET); - - *bRGA_CP_GR_A = (msg->gr_color.gr_x_a & 0xffff) | (msg->gr_color.gr_y_a << 16); - *bRGA_CP_GR_B = (msg->gr_color.gr_x_b & 0xffff) | (msg->gr_color.gr_y_b << 16); - *bRGA_CP_GR_G = (msg->gr_color.gr_x_g & 0xffff) | (msg->gr_color.gr_y_g << 16); - *bRGA_CP_GR_R = (msg->gr_color.gr_x_r & 0xffff) | (msg->gr_color.gr_y_r << 16); - - *bRGA_PAT_CON = (msg->pat.vir_w-1) | ((msg->pat.vir_h-1) << 8) | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24); - -} - - -/************************************************************* -Func: - RGA_set_line_drawing_reg_info -Description: - fill line drawing process some relate reg bit -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ +RGA_set_color_fill_reg_info(u8 *base, const struct rga_req *msg) +{ + + u32 *bRGA_CP_GR_A; + u32 *bRGA_CP_GR_B; + u32 *bRGA_CP_GR_G; + u32 *bRGA_CP_GR_R; + + u32 *bRGA_PAT_CON; + + bRGA_CP_GR_A = (u32 *)(base + RGA_CP_GR_A_OFFSET); + bRGA_CP_GR_B = (u32 *)(base + RGA_CP_GR_B_OFFSET); + bRGA_CP_GR_G = (u32 *)(base + RGA_CP_GR_G_OFFSET); + bRGA_CP_GR_R = (u32 *)(base + RGA_CP_GR_R_OFFSET); + + bRGA_PAT_CON = (u32 *)(base + RGA_PAT_CON_OFFSET); + + *bRGA_CP_GR_A = (msg->gr_color.gr_x_a & 0xffff) | (msg->gr_color.gr_y_a << 16); + *bRGA_CP_GR_B = (msg->gr_color.gr_x_b & 0xffff) | (msg->gr_color.gr_y_b << 16); + *bRGA_CP_GR_G = (msg->gr_color.gr_x_g & 0xffff) | (msg->gr_color.gr_y_g << 16); + *bRGA_CP_GR_R = (msg->gr_color.gr_x_r & 0xffff) | (msg->gr_color.gr_y_r << 16); + + *bRGA_PAT_CON = (msg->pat.vir_w-1) | ((msg->pat.vir_h-1) << 8) | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24); + +} + + +/************************************************************* +Func: + RGA_set_line_drawing_reg_info +Description: + fill line drawing process some relate reg bit +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static s32 RGA_set_line_drawing_reg_info(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_LINE_DRAW; - u32 *bRGA_DST_VIR_INFO; - u32 *bRGA_LINE_DRAW_XY_INFO; - u32 *bRGA_LINE_DRAW_WIDTH; - u32 *bRGA_LINE_DRAWING_COLOR; - u32 *bRGA_LINE_DRAWING_MST; - - u32 reg = 0; - - s16 x_width, y_width; - u16 abs_x, abs_y, delta; - u16 stride; - u8 pw; - u32 start_addr; - u8 line_dir, dir_major, dir_semi_major; - u16 major_width; - - bRGA_LINE_DRAW = (u32 *)(base + RGA_LINE_DRAW_OFFSET); - bRGA_DST_VIR_INFO = (u32 *)(base + RGA_DST_VIR_INFO_OFFSET); - bRGA_LINE_DRAW_XY_INFO = (u32 *)(base + RGA_LINE_DRAW_XY_INFO_OFFSET); - bRGA_LINE_DRAW_WIDTH = (u32 *)(base + RGA_LINE_DRAWING_WIDTH_OFFSET); - bRGA_LINE_DRAWING_COLOR = (u32 *)(base + RGA_LINE_DRAWING_COLOR_OFFSET); - bRGA_LINE_DRAWING_MST = (u32 *)(base + RGA_LINE_DRAWING_MST_OFFSET); - - pw = RGA_pixel_width_init(msg->dst.format); - - stride = (msg->dst.vir_w * pw + 3) & (~3); - - start_addr = msg->dst.yrgb_addr - + (msg->line_draw_info.start_point.y * stride) - + (msg->line_draw_info.start_point.x * pw); - - x_width = msg->line_draw_info.start_point.x - msg->line_draw_info.end_point.x; - y_width = msg->line_draw_info.start_point.y - msg->line_draw_info.end_point.y; - - abs_x = abs(x_width); - abs_y = abs(y_width); - - if (abs_x >= abs_y) - { - if (y_width > 0) - dir_semi_major = 1; - else - dir_semi_major = 0; - - if (x_width > 0) - dir_major = 1; - else - dir_major = 0; - - if((abs_x == 0)||(abs_y == 0)) - delta = 0; - else - delta = (abs_y<<12)/abs_x; - - if (delta >> 12) - delta -= 1; - - major_width = abs_x; - line_dir = 0; - } - else - { - if (x_width > 0) - dir_semi_major = 1; - else - dir_semi_major = 0; - - if (y_width > 0) - dir_major = 1; - else - dir_major = 0; - - delta = (abs_x<<12)/abs_y; - major_width = abs_y; - line_dir = 1; - } - - reg = (reg & (~m_RGA_LINE_DRAW_MAJOR_WIDTH)) | (s_RGA_LINE_DRAW_MAJOR_WIDTH(major_width)); - reg = (reg & (~m_RGA_LINE_DRAW_LINE_DIRECTION)) | (s_RGA_LINE_DRAW_LINE_DIRECTION(line_dir)); - reg = (reg & (~m_RGA_LINE_DRAW_LINE_WIDTH)) | (s_RGA_LINE_DRAW_LINE_WIDTH(msg->line_draw_info.line_width - 1)); - reg = (reg & (~m_RGA_LINE_DRAW_INCR_VALUE)) | (s_RGA_LINE_DRAW_INCR_VALUE(delta)); - reg = (reg & (~m_RGA_LINE_DRAW_DIR_SEMI_MAJOR)) | (s_RGA_LINE_DRAW_DIR_SEMI_MAJOR(dir_semi_major)); - reg = (reg & (~m_RGA_LINE_DRAW_DIR_MAJOR)) | (s_RGA_LINE_DRAW_DIR_MAJOR(dir_major)); - reg = (reg & (~m_RGA_LINE_DRAW_LAST_POINT)) | (s_RGA_LINE_DRAW_LAST_POINT(msg->line_draw_info.flag >> 1)); - reg = (reg & (~m_RGA_LINE_DRAW_ANTI_ALISING)) | (s_RGA_LINE_DRAW_ANTI_ALISING(msg->line_draw_info.flag)); - - *bRGA_LINE_DRAW = reg; - - reg = (msg->line_draw_info.start_point.x & 0xfff) | ((msg->line_draw_info.start_point.y & 0xfff) << 16); - *bRGA_LINE_DRAW_XY_INFO = reg; - - *bRGA_LINE_DRAW_WIDTH = msg->dst.vir_w; - - *bRGA_LINE_DRAWING_COLOR = msg->line_draw_info.color; - - *bRGA_LINE_DRAWING_MST = (u32)start_addr; - - return 0; -} - - +{ + u32 *bRGA_LINE_DRAW; + u32 *bRGA_DST_VIR_INFO; + u32 *bRGA_LINE_DRAW_XY_INFO; + u32 *bRGA_LINE_DRAW_WIDTH; + u32 *bRGA_LINE_DRAWING_COLOR; + u32 *bRGA_LINE_DRAWING_MST; + + u32 reg = 0; + + s16 x_width, y_width; + u16 abs_x, abs_y, delta; + u16 stride; + u8 pw; + u32 start_addr; + u8 line_dir, dir_major, dir_semi_major; + u16 major_width; + + bRGA_LINE_DRAW = (u32 *)(base + RGA_LINE_DRAW_OFFSET); + bRGA_DST_VIR_INFO = (u32 *)(base + RGA_DST_VIR_INFO_OFFSET); + bRGA_LINE_DRAW_XY_INFO = (u32 *)(base + RGA_LINE_DRAW_XY_INFO_OFFSET); + bRGA_LINE_DRAW_WIDTH = (u32 *)(base + RGA_LINE_DRAWING_WIDTH_OFFSET); + bRGA_LINE_DRAWING_COLOR = (u32 *)(base + RGA_LINE_DRAWING_COLOR_OFFSET); + bRGA_LINE_DRAWING_MST = (u32 *)(base + RGA_LINE_DRAWING_MST_OFFSET); + + pw = RGA_pixel_width_init(msg->dst.format); + + stride = (msg->dst.vir_w * pw + 3) & (~3); + + start_addr = msg->dst.yrgb_addr + + (msg->line_draw_info.start_point.y * stride) + + (msg->line_draw_info.start_point.x * pw); + + x_width = msg->line_draw_info.start_point.x - msg->line_draw_info.end_point.x; + y_width = msg->line_draw_info.start_point.y - msg->line_draw_info.end_point.y; + + abs_x = abs(x_width); + abs_y = abs(y_width); + + if (abs_x >= abs_y) + { + if (y_width > 0) + dir_semi_major = 1; + else + dir_semi_major = 0; + + if (x_width > 0) + dir_major = 1; + else + dir_major = 0; + + if((abs_x == 0)||(abs_y == 0)) + delta = 0; + else + delta = (abs_y<<12)/abs_x; + + if (delta >> 12) + delta -= 1; + + major_width = abs_x; + line_dir = 0; + } + else + { + if (x_width > 0) + dir_semi_major = 1; + else + dir_semi_major = 0; + + if (y_width > 0) + dir_major = 1; + else + dir_major = 0; + + delta = (abs_x<<12)/abs_y; + major_width = abs_y; + line_dir = 1; + } + + reg = (reg & (~m_RGA_LINE_DRAW_MAJOR_WIDTH)) | (s_RGA_LINE_DRAW_MAJOR_WIDTH(major_width)); + reg = (reg & (~m_RGA_LINE_DRAW_LINE_DIRECTION)) | (s_RGA_LINE_DRAW_LINE_DIRECTION(line_dir)); + reg = (reg & (~m_RGA_LINE_DRAW_LINE_WIDTH)) | (s_RGA_LINE_DRAW_LINE_WIDTH(msg->line_draw_info.line_width - 1)); + reg = (reg & (~m_RGA_LINE_DRAW_INCR_VALUE)) | (s_RGA_LINE_DRAW_INCR_VALUE(delta)); + reg = (reg & (~m_RGA_LINE_DRAW_DIR_SEMI_MAJOR)) | (s_RGA_LINE_DRAW_DIR_SEMI_MAJOR(dir_semi_major)); + reg = (reg & (~m_RGA_LINE_DRAW_DIR_MAJOR)) | (s_RGA_LINE_DRAW_DIR_MAJOR(dir_major)); + reg = (reg & (~m_RGA_LINE_DRAW_LAST_POINT)) | (s_RGA_LINE_DRAW_LAST_POINT(msg->line_draw_info.flag >> 1)); + reg = (reg & (~m_RGA_LINE_DRAW_ANTI_ALISING)) | (s_RGA_LINE_DRAW_ANTI_ALISING(msg->line_draw_info.flag)); + + *bRGA_LINE_DRAW = reg; + + reg = (msg->line_draw_info.start_point.x & 0xfff) | ((msg->line_draw_info.start_point.y & 0xfff) << 16); + *bRGA_LINE_DRAW_XY_INFO = reg; + + *bRGA_LINE_DRAW_WIDTH = msg->dst.vir_w; + + *bRGA_LINE_DRAWING_COLOR = msg->line_draw_info.color; + + *bRGA_LINE_DRAWING_MST = (u32)start_addr; + + return 0; +} + + /*full*/ static s32 RGA_set_filter_reg_info(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_BLUR_SHARP_INFO; - u32 reg = 0; - - bRGA_BLUR_SHARP_INFO = (u32 *)(base + RGA_ALPHA_CON_OFFSET); - - reg = *bRGA_BLUR_SHARP_INFO; - - reg = ((reg & (~m_RGA_BLUR_SHARP_FILTER_TYPE)) | (s_RGA_BLUR_SHARP_FILTER_TYPE(msg->bsfilter_flag & 3))); - reg = ((reg & (~m_RGA_BLUR_SHARP_FILTER_MODE)) | (s_RGA_BLUR_SHARP_FILTER_MODE(msg->bsfilter_flag >>2))); - - *bRGA_BLUR_SHARP_INFO = reg; - - return 0; -} - - -/*full*/ +{ + u32 *bRGA_BLUR_SHARP_INFO; + u32 reg = 0; + + bRGA_BLUR_SHARP_INFO = (u32 *)(base + RGA_ALPHA_CON_OFFSET); + + reg = *bRGA_BLUR_SHARP_INFO; + + reg = ((reg & (~m_RGA_BLUR_SHARP_FILTER_TYPE)) | (s_RGA_BLUR_SHARP_FILTER_TYPE(msg->bsfilter_flag & 3))); + reg = ((reg & (~m_RGA_BLUR_SHARP_FILTER_MODE)) | (s_RGA_BLUR_SHARP_FILTER_MODE(msg->bsfilter_flag >>2))); + + *bRGA_BLUR_SHARP_INFO = reg; + + return 0; +} + + +/*full*/ static s32 -RGA_set_pre_scale_reg_info(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_PRE_SCALE_INFO; - u32 reg = 0; - u32 h_ratio = 0; - u32 v_ratio = 0; - u32 ps_yuv_flag = 0; - u32 src_width, src_height; - u32 dst_width, dst_height; - - src_width = msg->src.act_w; - src_height = msg->src.act_h; - - dst_width = msg->dst.act_w; - dst_height = msg->dst.act_h; - - if((dst_width == 0) || (dst_height == 0)) - { - printk("pre scale reg info error ratio is divide zero\n"); - return -EINVAL; - } - - h_ratio = (src_width <<16) / dst_width; - v_ratio = (src_height<<16) / dst_height; - - if (h_ratio <= (1<<16)) - h_ratio = 0; - else if (h_ratio <= (2<<16)) - h_ratio = 1; - else if (h_ratio <= (4<<16)) - h_ratio = 2; - else if (h_ratio <= (8<<16)) - h_ratio = 3; - - if (v_ratio <= (1<<16)) - v_ratio = 0; - else if (v_ratio <= (2<<16)) - v_ratio = 1; - else if (v_ratio <= (4<<16)) - v_ratio = 2; - else if (v_ratio <= (8<<16)) - v_ratio = 3; - - if(msg->src.format == msg->dst.format) - ps_yuv_flag = 0; - else - ps_yuv_flag = 1; - - bRGA_PRE_SCALE_INFO = (u32 *)(base + RGA_ALPHA_CON_OFFSET); - - reg = *bRGA_PRE_SCALE_INFO; - reg = ((reg & (~m_RGA_PRE_SCALE_HOR_RATIO)) | (s_RGA_PRE_SCALE_HOR_RATIO((u8)h_ratio))); - reg = ((reg & (~m_RGA_PRE_SCALE_VER_RATIO)) | (s_RGA_PRE_SCALE_VER_RATIO((u8)v_ratio))); - reg = ((reg & (~m_RGA_PRE_SCALE_OUTPUT_FORMAT)) | (s_RGA_PRE_SCALE_OUTPUT_FORMAT(ps_yuv_flag))); - - *bRGA_PRE_SCALE_INFO = reg; - - return 0; -} - - - +RGA_set_pre_scale_reg_info(u8 *base, const struct rga_req *msg) +{ + u32 *bRGA_PRE_SCALE_INFO; + u32 reg = 0; + u32 h_ratio = 0; + u32 v_ratio = 0; + u32 ps_yuv_flag = 0; + u32 src_width, src_height; + u32 dst_width, dst_height; + + src_width = msg->src.act_w; + src_height = msg->src.act_h; + + dst_width = msg->dst.act_w; + dst_height = msg->dst.act_h; + + if((dst_width == 0) || (dst_height == 0)) + { + printk("pre scale reg info error ratio is divide zero\n"); + return -EINVAL; + } + + h_ratio = (src_width <<16) / dst_width; + v_ratio = (src_height<<16) / dst_height; + + if (h_ratio <= (1<<16)) + h_ratio = 0; + else if (h_ratio <= (2<<16)) + h_ratio = 1; + else if (h_ratio <= (4<<16)) + h_ratio = 2; + else if (h_ratio <= (8<<16)) + h_ratio = 3; + + if (v_ratio <= (1<<16)) + v_ratio = 0; + else if (v_ratio <= (2<<16)) + v_ratio = 1; + else if (v_ratio <= (4<<16)) + v_ratio = 2; + else if (v_ratio <= (8<<16)) + v_ratio = 3; + + if(msg->src.format == msg->dst.format) + ps_yuv_flag = 0; + else + ps_yuv_flag = 1; + + bRGA_PRE_SCALE_INFO = (u32 *)(base + RGA_ALPHA_CON_OFFSET); + + reg = *bRGA_PRE_SCALE_INFO; + reg = ((reg & (~m_RGA_PRE_SCALE_HOR_RATIO)) | (s_RGA_PRE_SCALE_HOR_RATIO((u8)h_ratio))); + reg = ((reg & (~m_RGA_PRE_SCALE_VER_RATIO)) | (s_RGA_PRE_SCALE_VER_RATIO((u8)v_ratio))); + reg = ((reg & (~m_RGA_PRE_SCALE_OUTPUT_FORMAT)) | (s_RGA_PRE_SCALE_OUTPUT_FORMAT(ps_yuv_flag))); + + *bRGA_PRE_SCALE_INFO = reg; + + return 0; +} + + + /*full*/ static int -RGA_set_update_palette_table_reg_info(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_LUT_MST; - - if (!msg->LUT_addr) { - return -1; - } - - bRGA_LUT_MST = (u32 *)(base + RGA_LUT_MST_OFFSET); - - *bRGA_LUT_MST = (u32)msg->LUT_addr; - - return 0; -} - - - +RGA_set_update_palette_table_reg_info(u8 *base, const struct rga_req *msg) +{ + u32 *bRGA_LUT_MST; + + if (!msg->LUT_addr) { + return -1; + } + + bRGA_LUT_MST = (u32 *)(base + RGA_LUT_MST_OFFSET); + + *bRGA_LUT_MST = (u32)msg->LUT_addr; + + return 0; +} + + + /*full*/ static int -RGA_set_update_patten_buff_reg_info(u8 *base, const struct rga_req *msg) -{ - u32 *bRGA_PAT_MST; - u32 *bRGA_PAT_CON; - u32 *bRGA_PAT_START_POINT; - u32 reg = 0; - rga_img_info_t *pat; - - pat = (rga_img_info_t *)&msg->pat; - - bRGA_PAT_START_POINT = (u32 *)(base + RGA_PAT_START_POINT_OFFSET); - bRGA_PAT_MST = (u32 *)(base + RGA_PAT_MST_OFFSET); - bRGA_PAT_CON = (u32 *)(base + RGA_PAT_CON_OFFSET); - - if ( !pat->yrgb_addr ) { - return -1; - } - *bRGA_PAT_MST = (u32)pat->yrgb_addr; - - if ((pat->vir_w > 256)||(pat->x_offset > 256)||(pat->y_offset > 256)) { - return -1; - } - *bRGA_PAT_START_POINT = (pat->vir_w * pat->y_offset) + pat->x_offset; - - reg = (pat->vir_w-1) | ((pat->vir_h-1) << 8) | (pat->x_offset << 16) | (pat->y_offset << 24); - *bRGA_PAT_CON = reg; - - return 0; -} - - -/************************************************************* -Func: - RGA_set_mmu_ctrl_reg_info -Description: - fill mmu relate some reg info -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ +RGA_set_update_patten_buff_reg_info(u8 *base, const struct rga_req *msg) +{ + u32 *bRGA_PAT_MST; + u32 *bRGA_PAT_CON; + u32 *bRGA_PAT_START_POINT; + u32 reg = 0; + rga_img_info_t *pat; + + pat = (rga_img_info_t *)&msg->pat; + + bRGA_PAT_START_POINT = (u32 *)(base + RGA_PAT_START_POINT_OFFSET); + bRGA_PAT_MST = (u32 *)(base + RGA_PAT_MST_OFFSET); + bRGA_PAT_CON = (u32 *)(base + RGA_PAT_CON_OFFSET); + + if ( !pat->yrgb_addr ) { + return -1; + } + *bRGA_PAT_MST = (u32)pat->yrgb_addr; + + if ((pat->vir_w > 256)||(pat->x_offset > 256)||(pat->y_offset > 256)) { + return -1; + } + *bRGA_PAT_START_POINT = (pat->vir_w * pat->y_offset) + pat->x_offset; + + reg = (pat->vir_w-1) | ((pat->vir_h-1) << 8) | (pat->x_offset << 16) | (pat->y_offset << 24); + *bRGA_PAT_CON = reg; + + return 0; +} + + +/************************************************************* +Func: + RGA_set_mmu_ctrl_reg_info +Description: + fill mmu relate some reg info +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ static s32 -RGA_set_mmu_ctrl_reg_info(u8 *base, const struct rga_req *msg) -{ - u32 *RGA_MMU_TLB, *RGA_MMU_CTRL_ADDR; - u32 mmu_addr; - u8 TLB_size, mmu_enable, src_flag, dst_flag, CMD_flag; - u32 reg = 0; - - mmu_addr = (u32)msg->mmu_info.base_addr; - TLB_size = (msg->mmu_info.mmu_flag >> 4) & 0x3; - mmu_enable = msg->mmu_info.mmu_flag & 0x1; - - src_flag = (msg->mmu_info.mmu_flag >> 1) & 0x1; - dst_flag = (msg->mmu_info.mmu_flag >> 2) & 0x1; - CMD_flag = (msg->mmu_info.mmu_flag >> 3) & 0x1; - - RGA_MMU_TLB = (u32 *)(base + RGA_MMU_TLB_OFFSET); - RGA_MMU_CTRL_ADDR = (u32 *)(base + RGA_FADING_CON_OFFSET); - - reg = ((reg & (~m_RGA_MMU_CTRL_TLB_ADDR)) | s_RGA_MMU_CTRL_TLB_ADDR(mmu_addr)); - *RGA_MMU_TLB = reg; - - reg = *RGA_MMU_CTRL_ADDR; - reg = ((reg & (~m_RGA_MMU_CTRL_PAGE_TABLE_SIZE)) | s_RGA_MMU_CTRL_PAGE_TABLE_SIZE(TLB_size)); - reg = ((reg & (~m_RGA_MMU_CTRL_MMU_ENABLE)) | s_RGA_MMU_CTRL_MMU_ENABLE(mmu_enable)); - reg = ((reg & (~m_RGA_MMU_CTRL_SRC_FLUSH)) | s_RGA_MMU_CTRL_SRC_FLUSH(1)); - reg = ((reg & (~m_RGA_MMU_CTRL_DST_FLUSH)) | s_RGA_MMU_CTRL_DST_FLUSH(1)); - reg = ((reg & (~m_RGA_MMU_CTRL_CMD_CHAN_FLUSH)) | s_RGA_MMU_CTRL_CMD_CHAN_FLUSH(1)); - *RGA_MMU_CTRL_ADDR = reg; - - return 0; -} - - - -/************************************************************* -Func: - RGA_gen_reg_info -Description: - Generate RGA command reg list from rga_req struct. -Author: - ZhangShengqin -Date: - 20012-2-2 10:59:25 -**************************************************************/ -int -RGA_gen_reg_info(const struct rga_req *msg, unsigned char *base) -{ - TILE_INFO tile; - - memset(base, 0x0, 28*4); - RGA_set_mode_ctrl(base, msg); - - switch(msg->render_mode) - { - case bitblt_mode : - RGA_set_alpha_rop(base, msg); - RGA_set_src(base, msg); - RGA_set_dst(base, msg); - RGA_set_color(base, msg); - RGA_set_fading(base, msg); - RGA_set_pat(base, msg); - matrix_cal(msg, &tile); - dst_ctrl_cal(msg, &tile); - src_tile_info_cal(msg, &tile); - RGA_set_bitblt_reg_info(base, msg, &tile); - break; - case color_palette_mode : - RGA_set_src(base, msg); - RGA_set_dst(base, msg); - RGA_set_color(base, msg); - RGA_set_color_palette_reg_info(base, msg); - break; - case color_fill_mode : - RGA_set_alpha_rop(base, msg); - RGA_set_dst(base, msg); - RGA_set_color(base, msg); - RGA_set_pat(base, msg); - RGA_set_color_fill_reg_info(base, msg); - break; - case line_point_drawing_mode : - RGA_set_alpha_rop(base, msg); - RGA_set_dst(base, msg); - RGA_set_color(base, msg); - RGA_set_line_drawing_reg_info(base, msg); - break; - case blur_sharp_filter_mode : - RGA_set_src(base, msg); - RGA_set_dst(base, msg); - RGA_set_filter_reg_info(base, msg); - break; - case pre_scaling_mode : - RGA_set_src(base, msg); - RGA_set_dst(base, msg); - if(RGA_set_pre_scale_reg_info(base, msg) == -EINVAL) - return -1; - break; - case update_palette_table_mode : - if (RGA_set_update_palette_table_reg_info(base, msg)) { - return -1; - } - break; - case update_patten_buff_mode: - if (RGA_set_update_patten_buff_reg_info(base, msg)){ - return -1; - } - - break; - } - - RGA_set_mmu_ctrl_reg_info(base, msg); - - return 0; -} - - - +RGA_set_mmu_ctrl_reg_info(u8 *base, const struct rga_req *msg) +{ + u32 *RGA_MMU_TLB, *RGA_MMU_CTRL_ADDR; + u32 mmu_addr; + u8 TLB_size, mmu_enable, src_flag, dst_flag, CMD_flag; + u32 reg = 0; + + mmu_addr = (u32)msg->mmu_info.base_addr; + TLB_size = (msg->mmu_info.mmu_flag >> 4) & 0x3; + mmu_enable = msg->mmu_info.mmu_flag & 0x1; + + src_flag = (msg->mmu_info.mmu_flag >> 1) & 0x1; + dst_flag = (msg->mmu_info.mmu_flag >> 2) & 0x1; + CMD_flag = (msg->mmu_info.mmu_flag >> 3) & 0x1; + + RGA_MMU_TLB = (u32 *)(base + RGA_MMU_TLB_OFFSET); + RGA_MMU_CTRL_ADDR = (u32 *)(base + RGA_FADING_CON_OFFSET); + + reg = ((reg & (~m_RGA_MMU_CTRL_TLB_ADDR)) | s_RGA_MMU_CTRL_TLB_ADDR(mmu_addr)); + *RGA_MMU_TLB = reg; + + reg = *RGA_MMU_CTRL_ADDR; + reg = ((reg & (~m_RGA_MMU_CTRL_PAGE_TABLE_SIZE)) | s_RGA_MMU_CTRL_PAGE_TABLE_SIZE(TLB_size)); + reg = ((reg & (~m_RGA_MMU_CTRL_MMU_ENABLE)) | s_RGA_MMU_CTRL_MMU_ENABLE(mmu_enable)); + reg = ((reg & (~m_RGA_MMU_CTRL_SRC_FLUSH)) | s_RGA_MMU_CTRL_SRC_FLUSH(1)); + reg = ((reg & (~m_RGA_MMU_CTRL_DST_FLUSH)) | s_RGA_MMU_CTRL_DST_FLUSH(1)); + reg = ((reg & (~m_RGA_MMU_CTRL_CMD_CHAN_FLUSH)) | s_RGA_MMU_CTRL_CMD_CHAN_FLUSH(1)); + *RGA_MMU_CTRL_ADDR = reg; + + return 0; +} + + + +/************************************************************* +Func: + RGA_gen_reg_info +Description: + Generate RGA command reg list from rga_req struct. +Author: + ZhangShengqin +Date: + 20012-2-2 10:59:25 +**************************************************************/ +int +RGA_gen_reg_info(const struct rga_req *msg, unsigned char *base) +{ + TILE_INFO tile; + + memset(base, 0x0, 28*4); + RGA_set_mode_ctrl(base, msg); + + switch(msg->render_mode) + { + case bitblt_mode : + RGA_set_alpha_rop(base, msg); + RGA_set_src(base, msg); + RGA_set_dst(base, msg); + RGA_set_color(base, msg); + RGA_set_fading(base, msg); + RGA_set_pat(base, msg); + matrix_cal(msg, &tile); + dst_ctrl_cal(msg, &tile); + src_tile_info_cal(msg, &tile); + RGA_set_bitblt_reg_info(base, msg, &tile); + break; + case color_palette_mode : + RGA_set_src(base, msg); + RGA_set_dst(base, msg); + RGA_set_color(base, msg); + RGA_set_color_palette_reg_info(base, msg); + break; + case color_fill_mode : + RGA_set_alpha_rop(base, msg); + RGA_set_dst(base, msg); + RGA_set_color(base, msg); + RGA_set_pat(base, msg); + RGA_set_color_fill_reg_info(base, msg); + break; + case line_point_drawing_mode : + RGA_set_alpha_rop(base, msg); + RGA_set_dst(base, msg); + RGA_set_color(base, msg); + RGA_set_line_drawing_reg_info(base, msg); + break; + case blur_sharp_filter_mode : + RGA_set_src(base, msg); + RGA_set_dst(base, msg); + RGA_set_filter_reg_info(base, msg); + break; + case pre_scaling_mode : + RGA_set_src(base, msg); + RGA_set_dst(base, msg); + if(RGA_set_pre_scale_reg_info(base, msg) == -EINVAL) + return -1; + break; + case update_palette_table_mode : + if (RGA_set_update_palette_table_reg_info(base, msg)) { + return -1; + } + break; + case update_patten_buff_mode: + if (RGA_set_update_patten_buff_reg_info(base, msg)){ + return -1; + } + + break; + } + + RGA_set_mmu_ctrl_reg_info(base, msg); + + return 0; +} + + + -- Gitblit v1.6.2