2 //#include <linux/kernel.h>
\r
3 #include <linux/memory.h>
\r
4 #include <linux/kernel.h>
\r
5 #include <linux/init.h>
\r
6 #include <linux/module.h>
\r
7 #include <linux/platform_device.h>
\r
8 #include <linux/sched.h>
\r
9 #include <linux/mutex.h>
\r
10 #include <linux/err.h>
\r
11 #include <linux/clk.h>
\r
12 #include <asm/delay.h>
\r
13 #include <linux/dma-mapping.h>
\r
14 #include <linux/delay.h>
\r
16 #include <linux/irq.h>
\r
17 #include <linux/interrupt.h>
\r
18 #include <linux/fs.h>
\r
19 #include <asm/uaccess.h>
\r
20 #include <linux/miscdevice.h>
\r
21 #include <linux/poll.h>
\r
22 #include <linux/delay.h>
\r
23 #include <linux/wait.h>
\r
24 #include <linux/syscalls.h>
\r
25 #include <linux/timer.h>
\r
26 #include <linux/time.h>
\r
27 #include <asm/cacheflush.h>
\r
28 #include <linux/slab.h>
\r
29 #include <linux/fb.h>
\r
30 #include <linux/wakelock.h>
\r
32 #include "rga2_reg_info.h"
\r
33 #include "../rga/rga_type.h"
\r
34 //#include "../rga/rga_rop.h"
\r
37 extern unsigned int ROP3_code[256];
\r
40 RGA2_reg_get_param(unsigned char *base, struct rga2_req *msg)
\r
42 RK_U32 *bRGA_SRC_INFO;
\r
43 RK_U32 *bRGA_SRC_X_FACTOR;
\r
44 RK_U32 *bRGA_SRC_Y_FACTOR;
\r
47 RK_U32 param_x, param_y;
\r
48 RK_U8 x_flag, y_flag;
\r
52 bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);
\r
53 reg = *bRGA_SRC_INFO;
\r
55 bRGA_SRC_X_FACTOR = (RK_U32 *)(base + RGA2_SRC_X_FACTOR_OFFSET);
\r
56 bRGA_SRC_Y_FACTOR = (RK_U32 *)(base + RGA2_SRC_Y_FACTOR_OFFSET);
\r
58 x_flag = y_flag = 0;
\r
60 if(((msg->rotate_mode & 0x3) == 1) || ((msg->rotate_mode & 0x3) == 3))
\r
62 dw = msg->dst.act_h;
\r
63 dh = msg->dst.act_w;
\r
67 dw = msg->dst.act_w;
\r
68 dh = msg->dst.act_h;
\r
71 sw = msg->src.act_w;
\r
72 sh = msg->src.act_h;
\r
77 #if SCALE_DOWN_LARGE
\r
78 param_x = ((dw) << 16) / (sw) + 1;
\r
80 param_x = ((dw) << 16) / (sw);
\r
82 *bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 0 );
\r
88 param_x = ((sw - 1) << 16) / (dw - 1);
\r
90 param_x = ((sw) << 16) / (dw);
\r
92 *bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 16);
\r
96 *bRGA_SRC_X_FACTOR = 0;//((1 << 14) << 16) | (1 << 14);
\r
102 #if SCALE_DOWN_LARGE
\r
103 param_y = ((dh) << 16) / (sh) + 1;
\r
105 param_y = ((dh) << 16) / (sh);
\r
107 *bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 0 );
\r
112 #if 1//SCALE_MINUS1
\r
113 param_y = ((sh - 1) << 16) / (dh - 1);
\r
115 param_y = ((sh) << 16) / (dh);
\r
117 *bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 16);
\r
121 *bRGA_SRC_Y_FACTOR = 0;//((1 << 14) << 16) | (1 << 14);
\r
124 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE(x_flag)));
\r
125 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE(y_flag)));
\r
129 RGA2_set_mode_ctrl(u8 *base, struct rga2_req *msg)
\r
131 RK_U32 *bRGA_MODE_CTL;
\r
133 RK_U32 render_mode = msg->render_mode;
\r
135 bRGA_MODE_CTL = (u32 *)(base + RGA2_MODE_CTRL_OFFSET);
\r
137 if(msg->render_mode == 4)
\r
142 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_RENDER_MODE)) | (s_RGA2_MODE_CTRL_SW_RENDER_MODE(render_mode)));
\r
143 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_BITBLT_MODE)) | (s_RGA2_MODE_CTRL_SW_BITBLT_MODE(msg->bitblt_mode)));
\r
144 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_CF_ROP4_PAT)) | (s_RGA2_MODE_CTRL_SW_CF_ROP4_PAT(msg->color_fill_mode)));
\r
145 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_ALPHA_ZERO_KET)) | (s_RGA2_MODE_CTRL_SW_ALPHA_ZERO_KET(msg->alpha_zero_key)));
\r
146 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_GRADIENT_SAT)) | (s_RGA2_MODE_CTRL_SW_GRADIENT_SAT(msg->alpha_rop_flag >> 7)));
\r
147 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_INTR_CF_E)) | (s_RGA2_MODE_CTRL_SW_INTR_CF_E(msg->CMD_fin_int_enable)));
\r
149 *bRGA_MODE_CTL = reg;
\r
153 RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
\r
155 RK_U32 *bRGA_SRC_INFO;
\r
156 RK_U32 *bRGA_SRC_BASE0, *bRGA_SRC_BASE1, *bRGA_SRC_BASE2;
\r
157 RK_U32 *bRGA_SRC_VIR_INFO;
\r
158 RK_U32 *bRGA_SRC_ACT_INFO;
\r
159 RK_U32 *bRGA_MASK_ADDR;
\r
160 RK_U32 *bRGA_SRC_TR_COLOR0, *bRGA_SRC_TR_COLOR1;
\r
163 RK_U8 src0_format = 0;
\r
165 RK_U8 src0_rb_swp = 0;
\r
166 RK_U8 src0_rgb_pack = 0;
\r
168 RK_U8 src0_cbcr_swp = 0;
\r
169 RK_U8 pixel_width = 1;
\r
171 RK_U32 uv_stride = 0;
\r
172 RK_U32 mask_stride = 0;
\r
173 RK_U32 ydiv = 1, xdiv = 2;
\r
179 RK_U8 scale_w_flag, scale_h_flag;
\r
181 bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);
\r
183 bRGA_SRC_BASE0 = (RK_U32 *)(base + RGA2_SRC_BASE0_OFFSET);
\r
184 bRGA_SRC_BASE1 = (RK_U32 *)(base + RGA2_SRC_BASE1_OFFSET);
\r
185 bRGA_SRC_BASE2 = (RK_U32 *)(base + RGA2_SRC_BASE2_OFFSET);
\r
187 bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);
\r
188 bRGA_SRC_ACT_INFO = (RK_U32 *)(base + RGA2_SRC_ACT_INFO_OFFSET);
\r
190 bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
\r
192 bRGA_SRC_TR_COLOR0 = (RK_U32 *)(base + RGA2_SRC_TR_COLOR0_OFFSET);
\r
193 bRGA_SRC_TR_COLOR1 = (RK_U32 *)(base + RGA2_SRC_TR_COLOR1_OFFSET);
\r
195 if (msg->src.format == RGA2_FORMAT_YCbCr_420_SP_10B ||
\r
196 msg->src.format == RGA2_FORMAT_YCrCb_420_SP_10B) {
\r
197 if ((msg->src.act_w == msg->dst.act_w) &&
\r
198 (msg->src.act_h == msg->dst.act_h) &&
\r
199 (msg->rotate_mode == 0))
\r
200 msg->rotate_mode = 1 << 6;
\r
204 rotate_mode = msg->rotate_mode & 0x3;
\r
206 sw = msg->src.act_w;
\r
207 sh = msg->src.act_h;
\r
209 if((rotate_mode == 1) | (rotate_mode == 3))
\r
211 dw = msg->dst.act_h;
\r
212 dh = msg->dst.act_w;
\r
216 dw = msg->dst.act_w;
\r
217 dh = msg->dst.act_h;
\r
226 if(msg->rotate_mode >> 6)
\r
236 if(msg->rotate_mode >> 6)
\r
241 switch (msg->src.format)
\r
243 case RGA2_FORMAT_RGBA_8888 : src0_format = 0x0; pixel_width = 4; break;
\r
244 case RGA2_FORMAT_BGRA_8888 : src0_format = 0x0; src0_rb_swp = 0x1; pixel_width = 4; break;
\r
245 case RGA2_FORMAT_RGBX_8888 : src0_format = 0x1; pixel_width = 4; msg->src_trans_mode &= 0x07; break;
\r
246 case RGA2_FORMAT_BGRX_8888 : src0_format = 0x1; src0_rb_swp = 0x1; pixel_width = 4; msg->src_trans_mode &= 0x07; break;
\r
247 case RGA2_FORMAT_RGB_888 : src0_format = 0x2; src0_rgb_pack = 1; pixel_width = 3; msg->src_trans_mode &= 0x07; break;
\r
248 case RGA2_FORMAT_BGR_888 : src0_format = 0x2; src0_rgb_pack = 1; src0_rb_swp = 1; pixel_width = 3; msg->src_trans_mode &= 0x07; break;
\r
249 case RGA2_FORMAT_RGB_565 : src0_format = 0x4; pixel_width = 2; msg->src_trans_mode &= 0x07; src0_rb_swp = 0x1; break;
\r
250 case RGA2_FORMAT_RGBA_5551 : src0_format = 0x5; pixel_width = 2; src0_rb_swp = 0x1; break;
\r
251 case RGA2_FORMAT_RGBA_4444 : src0_format = 0x6; pixel_width = 2; src0_rb_swp = 0x1; break;
\r
252 case RGA2_FORMAT_BGR_565 : src0_format = 0x4; pixel_width = 2; msg->src_trans_mode &= 0x07; break;
\r
253 case RGA2_FORMAT_BGRA_5551 : src0_format = 0x5; pixel_width = 2; break;
\r
254 case RGA2_FORMAT_BGRA_4444 : src0_format = 0x6; pixel_width = 2; break;
\r
256 case RGA2_FORMAT_YCbCr_422_SP : src0_format = 0x8; xdiv = 1; ydiv = 1; break;
\r
257 case RGA2_FORMAT_YCbCr_422_P : src0_format = 0x9; xdiv = 2; ydiv = 1; break;
\r
258 case RGA2_FORMAT_YCbCr_420_SP : src0_format = 0xa; xdiv = 1; ydiv = 2; break;
\r
259 case RGA2_FORMAT_YCbCr_420_P : src0_format = 0xb; xdiv = 2; ydiv = 2; break;
\r
260 case RGA2_FORMAT_YCrCb_422_SP : src0_format = 0x8; xdiv = 1; ydiv = 1; src0_cbcr_swp = 1; break;
\r
261 case RGA2_FORMAT_YCrCb_422_P : src0_format = 0x9; xdiv = 2; ydiv = 1; src0_cbcr_swp = 1; break;
\r
262 case RGA2_FORMAT_YCrCb_420_SP : src0_format = 0xa; xdiv = 1; ydiv = 2; src0_cbcr_swp = 1; break;
\r
263 case RGA2_FORMAT_YCrCb_420_P : src0_format = 0xb; xdiv = 2; ydiv = 2; src0_cbcr_swp = 1; break;
\r
264 case RGA2_FORMAT_YCbCr_420_SP_10B : src0_format = 0xa; xdiv = 1; ydiv = 2; yuv10 = 1; break;
\r
265 case RGA2_FORMAT_YCrCb_420_SP_10B : src0_format = 0xa; xdiv = 1; ydiv = 2; src0_cbcr_swp = 1; yuv10 = 1; break;
\r
268 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) | (s_RGA2_SRC_INFO_SW_SRC_FMT(src0_format)));
\r
269 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP(src0_rb_swp)));
\r
270 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP(msg->alpha_swp)));
\r
271 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP(src0_cbcr_swp)));
\r
272 if(msg->src.format <= RGA2_FORMAT_BGRA_4444)
\r
273 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(0)));
\r
275 if(msg->dst.format >= RGA2_FORMAT_YCbCr_422_SP)
\r
276 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(0)));
\r
278 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(msg->yuv2rgb_mode)));
\r
280 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ROT_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ROT_MODE(msg->rotate_mode & 0x3)));
\r
281 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_MIR_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_MIR_MODE((msg->rotate_mode >> 4) & 0x3)));
\r
282 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE((scale_w_flag))));
\r
283 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE((scale_h_flag))));
\r
284 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_SCL_FILTER)) | (s_RGA2_SRC_INFO_SW_SW_SRC_SCL_FILTER((msg->scale_bicu_mode))));
\r
285 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_TRANS_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_TRANS_MODE(msg->src_trans_mode)));
\r
286 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_TRANS_E)) | (s_RGA2_SRC_INFO_SW_SW_SRC_TRANS_E(msg->src_trans_mode >> 1)));
\r
287 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_DITHER_UP_E)) | (s_RGA2_SRC_INFO_SW_SW_SRC_DITHER_UP_E((msg->alpha_rop_flag >> 4) & 0x1)));
\r
288 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL)) | (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL((msg->scale_bicu_mode>>4))));
\r
289 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_E)) | (s_RGA2_SRC_INFO_SW_SW_YUV10_E((yuv10))));
\r
290 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_ROUND_E)) | (s_RGA2_SRC_INFO_SW_SW_YUV10_ROUND_E((yuv10))));
\r
291 RGA2_reg_get_param(base, msg);
\r
293 stride = (((msg->src.vir_w * pixel_width) + 3) & ~3) >> 2;
\r
294 uv_stride = ((msg->src.vir_w / xdiv + 3) & ~3);
\r
296 *bRGA_SRC_BASE0 = (RK_U32)(msg->src.yrgb_addr + msg->src.y_offset * (stride<<2) + msg->src.x_offset * pixel_width);
\r
297 *bRGA_SRC_BASE1 = (RK_U32)(msg->src.uv_addr + (msg->src.y_offset / ydiv) * uv_stride + (msg->src.x_offset / xdiv));
\r
298 *bRGA_SRC_BASE2 = (RK_U32)(msg->src.v_addr + (msg->src.y_offset / ydiv) * uv_stride + (msg->src.x_offset / xdiv));
\r
300 //mask_stride = ((msg->src0_act.width + 31) & ~31) >> 5;
\r
301 mask_stride = msg->rop_mask_stride;
\r
303 *bRGA_SRC_VIR_INFO = stride | (mask_stride << 16);
\r
305 *bRGA_SRC_ACT_INFO = (msg->src.act_w - 1) | ((msg->src.act_h - 1) << 16);
\r
307 *bRGA_MASK_ADDR = (RK_U32)msg->rop_mask_addr;
\r
309 *bRGA_SRC_INFO = reg;
\r
311 *bRGA_SRC_TR_COLOR0 = msg->color_key_min;
\r
312 *bRGA_SRC_TR_COLOR1 = msg->color_key_max;
\r
317 RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
\r
319 RK_U32 *bRGA_DST_INFO;
\r
320 RK_U32 *bRGA_DST_BASE0, *bRGA_DST_BASE1, *bRGA_DST_BASE2, *bRGA_SRC_BASE3;
\r
321 RK_U32 *bRGA_DST_VIR_INFO;
\r
322 RK_U32 *bRGA_DST_ACT_INFO;
\r
324 RK_U8 src1_format = 0;
\r
325 RK_U8 src1_rb_swp = 0;
\r
326 RK_U8 src1_rgb_pack = 0;
\r
327 RK_U8 dst_format = 0;
\r
328 RK_U8 dst_rb_swp = 0;
\r
329 RK_U8 dst_rgb_pack = 0;
\r
330 RK_U8 dst_cbcr_swp = 0;
\r
333 RK_U32 s_stride, d_stride;
\r
334 RK_U32 x_mirr, y_mirr, rot_90_flag;
\r
335 RK_U32 yrgb_addr, u_addr, v_addr, s_yrgb_addr;
\r
336 RK_U32 d_uv_stride, x_div, y_div;
\r
337 RK_U32 y_lt_addr, y_ld_addr, y_rt_addr, y_rd_addr;
\r
338 RK_U32 u_lt_addr, u_ld_addr, u_rt_addr, u_rd_addr;
\r
339 RK_U32 v_lt_addr, v_ld_addr, v_rt_addr, v_rd_addr;
\r
341 RK_U32 s_y_lt_addr, s_y_ld_addr, s_y_rt_addr, s_y_rd_addr;
\r
346 bRGA_DST_INFO = (RK_U32 *)(base + RGA2_DST_INFO_OFFSET);
\r
347 bRGA_DST_BASE0 = (RK_U32 *)(base + RGA2_DST_BASE0_OFFSET);
\r
348 bRGA_DST_BASE1 = (RK_U32 *)(base + RGA2_DST_BASE1_OFFSET);
\r
349 bRGA_DST_BASE2 = (RK_U32 *)(base + RGA2_DST_BASE2_OFFSET);
\r
351 bRGA_SRC_BASE3 = (RK_U32 *)(base + RGA2_SRC_BASE3_OFFSET);
\r
353 bRGA_DST_VIR_INFO = (RK_U32 *)(base + RGA2_DST_VIR_INFO_OFFSET);
\r
354 bRGA_DST_ACT_INFO = (RK_U32 *)(base + RGA2_DST_ACT_INFO_OFFSET);
\r
356 switch (msg->src1.format)
\r
358 case RGA2_FORMAT_RGBA_8888 : src1_format = 0x0; spw = 4; break;
\r
359 case RGA2_FORMAT_BGRA_8888 : src1_format = 0x0; src1_rb_swp = 0x1; spw = 4; break;
\r
360 case RGA2_FORMAT_RGBX_8888 : src1_format = 0x1; spw = 4; break;
\r
361 case RGA2_FORMAT_BGRX_8888 : src1_format = 0x1; src1_rb_swp = 0x1; spw = 4; break;
\r
362 case RGA2_FORMAT_RGB_888 : src1_format = 0x2; src1_rgb_pack = 1; spw = 3; break;
\r
363 case RGA2_FORMAT_BGR_888 : src1_format = 0x2; src1_rgb_pack = 1; src1_rb_swp = 1; spw = 3; break;
\r
364 case RGA2_FORMAT_RGB_565 : src1_format = 0x4; spw = 2; src1_rb_swp = 0x1; break;
\r
365 case RGA2_FORMAT_RGBA_5551 : src1_format = 0x5; spw = 2; src1_rb_swp = 0x1; break;
\r
366 case RGA2_FORMAT_RGBA_4444 : src1_format = 0x6; spw = 2; src1_rb_swp = 0x1; break;
\r
367 case RGA2_FORMAT_BGR_565 : src1_format = 0x4; spw = 2; break;
\r
368 case RGA2_FORMAT_BGRA_5551 : src1_format = 0x5; spw = 2; break;
\r
369 case RGA2_FORMAT_BGRA_4444 : src1_format = 0x6; spw = 2; break;
\r
370 default : spw = 4; break;
\r
373 reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_FMT)) | (s_RGA2_DST_INFO_SW_SRC1_FMT(src1_format)));
\r
374 reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_RB_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_RB_SWP(src1_rb_swp)));
\r
375 reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP(msg->alpha_swp >> 1)));
\r
378 switch (msg->dst.format)
\r
380 case RGA2_FORMAT_RGBA_8888 : dst_format = 0x0; dpw = 4; break;
\r
381 case RGA2_FORMAT_BGRA_8888 : dst_format = 0x0; dst_rb_swp = 0x1; dpw = 4; break;
\r
382 case RGA2_FORMAT_RGBX_8888 : dst_format = 0x1; dpw = 4; break;
\r
383 case RGA2_FORMAT_BGRX_8888 : dst_format = 0x1; dst_rb_swp = 0x1; dpw = 4; break;
\r
384 case RGA2_FORMAT_RGB_888 : dst_format = 0x2; dst_rgb_pack = 1; dpw = 3; break;
\r
385 case RGA2_FORMAT_BGR_888 : dst_format = 0x2; dst_rgb_pack = 1; dst_rb_swp = 1; dpw = 3; break;
\r
386 case RGA2_FORMAT_RGB_565 : dst_format = 0x4; dpw = 2; dst_rb_swp = 0x1; break;
\r
387 case RGA2_FORMAT_RGBA_5551 : dst_format = 0x5; dpw = 2; dst_rb_swp = 0x1; break;
\r
388 case RGA2_FORMAT_RGBA_4444 : dst_format = 0x6; dpw = 2; dst_rb_swp = 0x1; break;
\r
389 case RGA2_FORMAT_BGR_565 : dst_format = 0x4; dpw = 2; break;
\r
390 case RGA2_FORMAT_BGRA_5551 : dst_format = 0x5; dpw = 2; break;
\r
391 case RGA2_FORMAT_BGRA_4444 : dst_format = 0x6; dpw = 2; break;
\r
393 case RGA2_FORMAT_YCbCr_422_SP : dst_format = 0x8; x_div = 1; y_div = 1; break;
\r
394 case RGA2_FORMAT_YCbCr_422_P : dst_format = 0x9; x_div = 2; y_div = 1; break;
\r
395 case RGA2_FORMAT_YCbCr_420_SP : dst_format = 0xa; x_div = 1; y_div = 2; break;
\r
396 case RGA2_FORMAT_YCbCr_420_P : dst_format = 0xb; x_div = 2; y_div = 2; break;
\r
397 case RGA2_FORMAT_YCrCb_422_SP : dst_format = 0x8; dst_cbcr_swp = 1; x_div = 1; y_div = 1; break;
\r
398 case RGA2_FORMAT_YCrCb_422_P : dst_format = 0x9; dst_cbcr_swp = 1; x_div = 2; y_div = 1; break;
\r
399 case RGA2_FORMAT_YCrCb_420_SP : dst_format = 0xa; dst_cbcr_swp = 1; x_div = 1; y_div = 2; break;
\r
400 case RGA2_FORMAT_YCrCb_420_P : dst_format = 0xb; dst_cbcr_swp = 1; x_div = 2; y_div = 2; break;
\r
403 reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_FMT)) | (s_RGA2_DST_INFO_SW_DST_FMT(dst_format)));
\r
404 reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_RB_SWAP)) | (s_RGA2_DST_INFO_SW_DST_RB_SWAP(dst_rb_swp)));
\r
405 reg = ((reg & (~m_RGA2_DST_INFO_SW_ALPHA_SWAP)) | (s_RGA2_DST_INFO_SW_ALPHA_SWAP(msg->alpha_swp >> 2)));
\r
406 reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_UV_SWAP)) | (s_RGA2_DST_INFO_SW_DST_UV_SWAP(dst_cbcr_swp)));
\r
408 reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_UP_E)) | (s_RGA2_DST_INFO_SW_DITHER_UP_E(msg->alpha_rop_flag >> 5)));
\r
409 reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_DOWN_E)) | (s_RGA2_DST_INFO_SW_DITHER_DOWN_E(msg->alpha_rop_flag >> 6)));
\r
410 reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_MODE)) | (s_RGA2_DST_INFO_SW_DITHER_MODE(msg->dither_mode)));
\r
411 reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_CSC_MODE)) | (s_RGA2_DST_INFO_SW_DST_CSC_MODE(msg->yuv2rgb_mode >> 4)));
\r
412 reg = ((reg & (~m_RGA2_DST_INFO_SW_CSC_CLIP_MODE)) | (s_RGA2_DST_INFO_SW_CSC_CLIP_MODE(msg->yuv2rgb_mode >> 6)));
\r
415 *bRGA_DST_INFO = reg;
\r
417 s_stride = ((msg->src1.vir_w * spw + 3) & ~3) >> 2;
\r
418 d_stride = ((msg->dst.vir_w * dpw + 3) & ~3) >> 2;
\r
419 d_uv_stride = (d_stride << 2) / x_div;
\r
421 *bRGA_DST_VIR_INFO = d_stride | (s_stride << 16);
\r
422 *bRGA_DST_ACT_INFO = (msg->dst.act_w - 1) | ((msg->dst.act_h - 1) << 16);
\r
426 if(((msg->rotate_mode & 0xf) == 0) || ((msg->rotate_mode & 0xf) == 1))
\r
437 rot_90_flag = msg->rotate_mode & 1;
\r
438 x_mirr = (x_mirr + ((msg->rotate_mode >> 4) & 1)) & 1;
\r
439 y_mirr = (y_mirr + ((msg->rotate_mode >> 5) & 1)) & 1;
\r
441 yrgb_addr = (RK_U32)msg->src1.yrgb_addr + (msg->src1.y_offset * s_stride) + (msg->src1.x_offset * spw);
\r
443 s_y_lt_addr = yrgb_addr;
\r
444 s_y_ld_addr = yrgb_addr + (msg->src1.act_h - 1) * s_stride;
\r
445 s_y_rt_addr = yrgb_addr + (msg->dst.act_w - 1) * spw;
\r
446 s_y_rd_addr = s_y_ld_addr + (msg->dst.act_w - 1) * spw;
\r
448 yrgb_addr = (RK_U32)msg->dst.yrgb_addr + (msg->dst.y_offset * d_stride) + (msg->dst.x_offset * dpw);
\r
449 u_addr = (RK_U32)msg->dst.uv_addr + (msg->dst.y_offset / y_div) * d_uv_stride + msg->dst.x_offset / x_div;
\r
450 v_addr = (RK_U32)msg->dst.v_addr + (msg->dst.y_offset / y_div) * d_uv_stride + msg->dst.x_offset / x_div;
\r
452 y_lt_addr = yrgb_addr;
\r
453 u_lt_addr = u_addr;
\r
454 v_lt_addr = v_addr;
\r
456 y_ld_addr = yrgb_addr + (msg->dst.act_h - 1) * (d_stride);
\r
457 u_ld_addr = u_addr + ((msg->dst.act_h / y_div) - 1) * (d_uv_stride);
\r
458 v_ld_addr = v_addr + ((msg->dst.act_h / y_div) - 1) * (d_uv_stride);
\r
460 y_rt_addr = yrgb_addr + (msg->dst.act_w - 1) * dpw;
\r
461 u_rt_addr = u_addr + (msg->dst.act_w / x_div) - 1;
\r
462 v_rt_addr = v_addr + (msg->dst.act_w / x_div) - 1;
\r
464 y_rd_addr = y_ld_addr + (msg->dst.act_w - 1) * dpw;
\r
465 u_rd_addr = u_ld_addr + (msg->dst.act_w / x_div) - 1;
\r
466 v_rd_addr = v_ld_addr + (msg->dst.act_w / x_div) - 1;
\r
468 if(rot_90_flag == 0)
\r
474 yrgb_addr = y_rd_addr;
\r
475 u_addr = u_rd_addr;
\r
476 v_addr = v_rd_addr;
\r
478 s_yrgb_addr = s_y_rd_addr;
\r
482 yrgb_addr = y_ld_addr;
\r
483 u_addr = u_ld_addr;
\r
484 v_addr = v_ld_addr;
\r
486 s_yrgb_addr = s_y_ld_addr;
\r
493 yrgb_addr = y_rt_addr;
\r
494 u_addr = u_rt_addr;
\r
495 v_addr = v_rt_addr;
\r
497 s_yrgb_addr = s_y_rt_addr;
\r
501 yrgb_addr = y_lt_addr;
\r
502 u_addr = u_lt_addr;
\r
503 v_addr = v_lt_addr;
\r
505 s_yrgb_addr = s_y_lt_addr;
\r
515 yrgb_addr = y_ld_addr;
\r
516 u_addr = u_ld_addr;
\r
517 v_addr = v_ld_addr;
\r
519 s_yrgb_addr = s_y_ld_addr;
\r
523 yrgb_addr = y_rd_addr;
\r
524 u_addr = u_rd_addr;
\r
525 v_addr = v_rd_addr;
\r
527 s_yrgb_addr = s_y_rd_addr;
\r
534 yrgb_addr = y_lt_addr;
\r
535 u_addr = u_lt_addr;
\r
536 v_addr = v_lt_addr;
\r
538 s_yrgb_addr = s_y_lt_addr;
\r
542 yrgb_addr = y_rt_addr;
\r
543 u_addr = u_rt_addr;
\r
544 v_addr = v_rt_addr;
\r
546 s_yrgb_addr = s_y_rt_addr;
\r
551 *bRGA_DST_BASE0 = (RK_U32)yrgb_addr;
\r
553 if((msg->dst.format == RGA2_FORMAT_YCbCr_420_P) || (msg->dst.format == RGA2_FORMAT_YCrCb_420_P))
\r
555 if(dst_cbcr_swp == 0) {
\r
556 *bRGA_DST_BASE1 = (RK_U32)v_addr;
\r
557 *bRGA_DST_BASE2 = (RK_U32)u_addr;
\r
560 *bRGA_DST_BASE1 = (RK_U32)u_addr;
\r
561 *bRGA_DST_BASE2 = (RK_U32)v_addr;
\r
565 *bRGA_DST_BASE1 = (RK_U32)u_addr;
\r
566 *bRGA_DST_BASE2 = (RK_U32)v_addr;
\r
569 *bRGA_SRC_BASE3 = (RK_U32)s_y_lt_addr;
\r
573 RGA2_set_reg_alpha_info(u8 *base, struct rga2_req *msg)
\r
575 RK_U32 *bRGA_ALPHA_CTRL0;
\r
576 RK_U32 *bRGA_ALPHA_CTRL1;
\r
577 RK_U32 *bRGA_FADING_CTRL;
\r
581 bRGA_ALPHA_CTRL0 = (RK_U32 *)(base + RGA2_ALPHA_CTRL0_OFFSET);
\r
582 bRGA_ALPHA_CTRL1 = (RK_U32 *)(base + RGA2_ALPHA_CTRL1_OFFSET);
\r
583 bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
\r
585 reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0)) | (s_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0(msg->alpha_rop_flag)));
\r
586 reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL)) | (s_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL(msg->alpha_rop_flag >> 1)));
\r
587 reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ROP_MODE)) | (s_RGA2_ALPHA_CTRL0_SW_ROP_MODE(msg->rop_mode)));
\r
588 reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA)) | (s_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA(msg->src_a_global_val)));
\r
589 reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA)) | (s_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA(msg->dst_a_global_val)));
\r
591 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_COLOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_COLOR_M0(msg->alpha_mode_0 >> 15)));
\r
592 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_COLOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_COLOR_M0(msg->alpha_mode_0 >> 7)));
\r
593 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M0(msg->alpha_mode_0 >> 12)));
\r
594 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M0(msg->alpha_mode_0 >> 4)));
\r
595 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M0(msg->alpha_mode_0 >> 11)));
\r
596 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M0(msg->alpha_mode_0 >> 3)));
\r
597 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M0(msg->alpha_mode_0 >> 9)));
\r
598 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M0(msg->alpha_mode_0 >> 1)));
\r
599 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M0(msg->alpha_mode_0 >> 8)));
\r
600 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M0(msg->alpha_mode_0 >> 0)));
\r
602 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M1(msg->alpha_mode_1 >> 12)));
\r
603 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M1(msg->alpha_mode_1 >> 4)));
\r
604 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M1(msg->alpha_mode_1 >> 11)));
\r
605 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M1(msg->alpha_mode_1 >> 3)));
\r
606 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M1(msg->alpha_mode_1 >> 9)));
\r
607 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M1(msg->alpha_mode_1 >> 1)));
\r
608 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M1(msg->alpha_mode_1 >> 8)));
\r
609 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M1(msg->alpha_mode_1 >> 0)));
\r
611 *bRGA_ALPHA_CTRL0 = reg0;
\r
612 *bRGA_ALPHA_CTRL1 = reg1;
\r
614 if((msg->alpha_rop_flag>>2)&1)
\r
616 *bRGA_FADING_CTRL = (1<<24) | (msg->fading_b_value<<16) | (msg->fading_g_value<<8) | (msg->fading_r_value);
\r
621 RGA2_set_reg_rop_info(u8 *base, struct rga2_req *msg)
\r
623 RK_U32 *bRGA_ALPHA_CTRL0;
\r
624 RK_U32 *bRGA_ROP_CTRL0;
\r
625 RK_U32 *bRGA_ROP_CTRL1;
\r
626 RK_U32 *bRGA_MASK_ADDR;
\r
627 RK_U32 *bRGA_FG_COLOR;
\r
628 RK_U32 *bRGA_PAT_CON;
\r
630 RK_U32 rop_code0 = 0;
\r
631 RK_U32 rop_code1 = 0;
\r
633 bRGA_ALPHA_CTRL0 = (RK_U32 *)(base + RGA2_ALPHA_CTRL0_OFFSET);
\r
634 bRGA_ROP_CTRL0 = (RK_U32 *)(base + RGA2_ROP_CTRL0_OFFSET);
\r
635 bRGA_ROP_CTRL1 = (RK_U32 *)(base + RGA2_ROP_CTRL1_OFFSET);
\r
636 bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
\r
637 bRGA_FG_COLOR = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);
\r
638 bRGA_PAT_CON = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
\r
640 if(msg->rop_mode == 0) {
\r
641 rop_code0 = ROP3_code[(msg->rop_code & 0xff)];
\r
643 else if(msg->rop_mode == 1) {
\r
644 rop_code0 = ROP3_code[(msg->rop_code & 0xff)];
\r
646 else if(msg->rop_mode == 2) {
\r
647 rop_code0 = ROP3_code[(msg->rop_code & 0xff)];
\r
648 rop_code1 = ROP3_code[(msg->rop_code & 0xff00)>>8];
\r
651 *bRGA_ROP_CTRL0 = rop_code0;
\r
652 *bRGA_ROP_CTRL1 = rop_code1;
\r
653 *bRGA_FG_COLOR = msg->fg_color;
\r
654 *bRGA_MASK_ADDR = (RK_U32)msg->rop_mask_addr;
\r
655 *bRGA_PAT_CON = (msg->pat.act_w-1) | ((msg->pat.act_h-1) << 8)
\r
656 | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24);
\r
657 *bRGA_ALPHA_CTRL0 = *bRGA_ALPHA_CTRL0 | (((msg->endian_mode >> 1) & 1) << 20);
\r
664 RGA2_set_reg_color_palette(RK_U8 *base, struct rga2_req *msg)
\r
666 RK_U32 *bRGA_SRC_BASE0, *bRGA_SRC_INFO, *bRGA_SRC_VIR_INFO, *bRGA_SRC_ACT_INFO, *bRGA_SRC_FG_COLOR, *bRGA_SRC_BG_COLOR;
\r
668 RK_S16 x_off, y_off;
\r
675 bRGA_SRC_BASE0 = (RK_U32 *)(base + RGA2_SRC_BASE0_OFFSET);
\r
676 bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);
\r
677 bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);
\r
678 bRGA_SRC_ACT_INFO = (RK_U32 *)(base + RGA2_SRC_ACT_INFO_OFFSET);
\r
679 bRGA_SRC_FG_COLOR = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);
\r
680 bRGA_SRC_BG_COLOR = (RK_U32 *)(base + RGA2_SRC_BG_COLOR_OFFSET);
\r
684 shift = 3 - msg->palette_mode;
\r
686 x_off = msg->src.x_offset;
\r
687 y_off = msg->src.y_offset;
\r
689 sw = msg->src.vir_w;
\r
690 byte_num = sw >> shift;
\r
692 src_stride = (byte_num + 3) & (~3);
\r
694 p = (RK_U32 *)((unsigned long)msg->src.yrgb_addr);
\r
699 p = p + (x_off>>shift) + y_off*src_stride;
\r
703 p = p + (((x_off>>shift)>>2)<<2) + (3 - ((x_off>>shift) & 3)) + y_off*src_stride;
\r
707 p = p + (x_off>>shift) + y_off*src_stride;
\r
710 *bRGA_SRC_BASE0 = (unsigned long)p;
\r
712 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) | (s_RGA2_SRC_INFO_SW_SRC_FMT((msg->palette_mode | 0xc))));
\r
713 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_CP_ENDAIN)) | (s_RGA2_SRC_INFO_SW_SW_CP_ENDAIN(msg->endian_mode & 1)));
\r
714 *bRGA_SRC_VIR_INFO = src_stride >> 2;
\r
715 *bRGA_SRC_ACT_INFO = (msg->src.act_w - 1) | ((msg->src.act_h - 1) << 16);
\r
716 *bRGA_SRC_INFO = reg;
\r
718 *bRGA_SRC_FG_COLOR = msg->fg_color;
\r
719 *bRGA_SRC_BG_COLOR = msg->bg_color;
\r
724 RGA2_set_reg_color_fill(u8 *base, struct rga2_req *msg)
\r
726 RK_U32 *bRGA_CF_GR_A;
\r
727 RK_U32 *bRGA_CF_GR_B;
\r
728 RK_U32 *bRGA_CF_GR_G;
\r
729 RK_U32 *bRGA_CF_GR_R;
\r
730 RK_U32 *bRGA_SRC_FG_COLOR;
\r
731 RK_U32 *bRGA_MASK_ADDR;
\r
732 RK_U32 *bRGA_PAT_CON;
\r
734 RK_U32 mask_stride;
\r
735 RK_U32 *bRGA_SRC_VIR_INFO;
\r
737 bRGA_SRC_FG_COLOR = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);
\r
739 bRGA_CF_GR_A = (RK_U32 *)(base + RGA2_CF_GR_A_OFFSET);
\r
740 bRGA_CF_GR_B = (RK_U32 *)(base + RGA2_CF_GR_B_OFFSET);
\r
741 bRGA_CF_GR_G = (RK_U32 *)(base + RGA2_CF_GR_G_OFFSET);
\r
742 bRGA_CF_GR_R = (RK_U32 *)(base + RGA2_CF_GR_R_OFFSET);
\r
744 bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
\r
745 bRGA_PAT_CON = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
\r
747 bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);
\r
749 mask_stride = msg->rop_mask_stride;
\r
751 if(msg->color_fill_mode == 0)
\r
754 *bRGA_CF_GR_A = (msg->gr_color.gr_x_a & 0xffff) | (msg->gr_color.gr_y_a << 16);
\r
755 *bRGA_CF_GR_B = (msg->gr_color.gr_x_b & 0xffff) | (msg->gr_color.gr_y_b << 16);
\r
756 *bRGA_CF_GR_G = (msg->gr_color.gr_x_g & 0xffff) | (msg->gr_color.gr_y_g << 16);
\r
757 *bRGA_CF_GR_R = (msg->gr_color.gr_x_r & 0xffff) | (msg->gr_color.gr_y_r << 16);
\r
759 *bRGA_SRC_FG_COLOR = msg->fg_color;
\r
764 *bRGA_MASK_ADDR = (RK_U32)msg->pat.yrgb_addr;
\r
765 *bRGA_PAT_CON = (msg->pat.act_w - 1) | ((msg->pat.act_h - 1) << 8)
\r
766 | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24);
\r
768 *bRGA_SRC_VIR_INFO = mask_stride << 16;
\r
773 RGA2_set_reg_update_palette_table(RK_U8 *base, struct rga2_req *msg)
\r
775 RK_U32 *bRGA_MASK_BASE;
\r
776 RK_U32 *bRGA_FADING_CTRL;
\r
778 bRGA_MASK_BASE = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
\r
779 bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
\r
781 *bRGA_FADING_CTRL = msg->fading_g_value << 8;
\r
782 *bRGA_MASK_BASE = (RK_U32)msg->pat.yrgb_addr;
\r
787 RGA2_set_reg_update_patten_buff(RK_U8 *base, struct rga2_req *msg)
\r
791 u32 *bRGA_PAT_START_POINT;
\r
792 RK_U32 *bRGA_FADING_CTRL;
\r
794 rga_img_info_t *pat;
\r
796 RK_U32 num, offset;
\r
800 num = (pat->act_w * pat->act_h) - 1;
\r
802 offset = pat->act_w * pat->y_offset + pat->x_offset;
\r
804 bRGA_PAT_START_POINT = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
\r
805 bRGA_PAT_MST = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
\r
806 bRGA_PAT_CON = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
\r
807 bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
\r
809 *bRGA_PAT_MST = (RK_U32)msg->pat.yrgb_addr;
\r
810 *bRGA_PAT_START_POINT = (pat->act_w * pat->y_offset) + pat->x_offset;
\r
812 reg = (pat->act_w-1) | ((pat->act_h-1) << 8) | (pat->x_offset << 16) | (pat->y_offset << 24);
\r
813 *bRGA_PAT_CON = reg;
\r
815 *bRGA_FADING_CTRL = (num << 8) | offset;
\r
820 RGA2_set_pat_info(RK_U8 *base, struct rga2_req *msg)
\r
823 u32 *bRGA_FADING_CTRL;
\r
825 rga_img_info_t *pat;
\r
827 RK_U32 num, offset;
\r
831 num = ((pat->act_w * pat->act_h) - 1) & 0xff;
\r
833 offset = (pat->act_w * pat->y_offset) + pat->x_offset;
\r
835 bRGA_PAT_CON = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
\r
836 bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
\r
838 reg = (pat->act_w-1) | ((pat->act_h-1) << 8) | (pat->x_offset << 16) | (pat->y_offset << 24);
\r
839 *bRGA_PAT_CON = reg;
\r
840 *bRGA_FADING_CTRL = (num << 8) | offset;
\r
845 RGA2_set_mmu_info(RK_U8 *base, struct rga2_req *msg)
\r
847 RK_U32 *bRGA_MMU_CTRL1;
\r
848 RK_U32 *bRGA_MMU_SRC_BASE;
\r
849 RK_U32 *bRGA_MMU_SRC1_BASE;
\r
850 RK_U32 *bRGA_MMU_DST_BASE;
\r
851 RK_U32 *bRGA_MMU_ELS_BASE;
\r
855 bRGA_MMU_CTRL1 = (RK_U32 *)(base + RGA2_MMU_CTRL1_OFFSET);
\r
856 bRGA_MMU_SRC_BASE = (RK_U32 *)(base + RGA2_MMU_SRC_BASE_OFFSET);
\r
857 bRGA_MMU_SRC1_BASE = (RK_U32 *)(base + RGA2_MMU_SRC1_BASE_OFFSET);
\r
858 bRGA_MMU_DST_BASE = (RK_U32 *)(base + RGA2_MMU_DST_BASE_OFFSET);
\r
859 bRGA_MMU_ELS_BASE = (RK_U32 *)(base + RGA2_MMU_ELS_BASE_OFFSET);
\r
861 reg = (msg->mmu_info.src0_mmu_flag & 0xf) | ((msg->mmu_info.src1_mmu_flag & 0xf) << 4)
\r
862 | ((msg->mmu_info.dst_mmu_flag & 0xf) << 8) | ((msg->mmu_info.els_mmu_flag & 0x3) << 12);
\r
864 *bRGA_MMU_CTRL1 = reg;
\r
865 *bRGA_MMU_SRC_BASE = (RK_U32)(msg->mmu_info.src0_base_addr) >> 4;
\r
866 *bRGA_MMU_SRC1_BASE = (RK_U32)(msg->mmu_info.src1_base_addr) >> 4;
\r
867 *bRGA_MMU_DST_BASE = (RK_U32)(msg->mmu_info.dst_base_addr) >> 4;
\r
868 *bRGA_MMU_ELS_BASE = (RK_U32)(msg->mmu_info.els_base_addr) >> 4;
\r
873 RGA2_gen_reg_info(RK_U8 *base , struct rga2_req *msg)
\r
876 RGA2_set_mode_ctrl(base, msg);
\r
878 RGA2_set_pat_info(base, msg);
\r
880 switch(msg->render_mode)
\r
883 RGA2_set_reg_src_info(base, msg);
\r
884 RGA2_set_reg_dst_info(base, msg);
\r
885 RGA2_set_reg_alpha_info(base, msg);
\r
886 RGA2_set_reg_rop_info(base, msg);
\r
888 case color_fill_mode :
\r
889 RGA2_set_reg_color_fill(base, msg);
\r
890 RGA2_set_reg_dst_info(base, msg);
\r
891 RGA2_set_reg_alpha_info(base, msg);
\r
893 case color_palette_mode :
\r
894 RGA2_set_reg_color_palette(base, msg);
\r
895 RGA2_set_reg_dst_info(base, msg);
\r
897 case update_palette_table_mode :
\r
898 RGA2_set_reg_update_palette_table(base, msg);
\r
900 case update_patten_buff_mode :
\r
901 RGA2_set_reg_update_patten_buff(base, msg);
\r
904 printk("RGA2 ERROR msg render mode %d \n", msg->render_mode);
\r
909 RGA2_set_mmu_info(base, msg);
\r
915 void format_name_convert(uint32_t *df, uint32_t sf)
\r
918 RK_FORMAT_RGBA_8888 = 0x0,
\r
919 RK_FORMAT_RGBX_8888 = 0x1,
\r
920 RK_FORMAT_RGB_888 = 0x2,
\r
921 RK_FORMAT_BGRA_8888 = 0x3,
\r
922 RK_FORMAT_RGB_565 = 0x4,
\r
923 RK_FORMAT_RGBA_5551 = 0x5,
\r
924 RK_FORMAT_RGBA_4444 = 0x6,
\r
925 RK_FORMAT_BGR_888 = 0x7,
\r
927 RK_FORMAT_YCbCr_422_SP = 0x8,
\r
928 RK_FORMAT_YCbCr_422_P = 0x9,
\r
929 RK_FORMAT_YCbCr_420_SP = 0xa,
\r
930 RK_FORMAT_YCbCr_420_P = 0xb,
\r
932 RK_FORMAT_YCrCb_422_SP = 0xc,
\r
933 RK_FORMAT_YCrCb_422_P = 0xd,
\r
934 RK_FORMAT_YCrCb_420_SP = 0xe,
\r
935 RK_FORMAT_YCrCb_420_P = 0xf,
\r
937 RGA2_FORMAT_RGBA_8888 = 0x0,
\r
938 RGA2_FORMAT_RGBX_8888 = 0x1,
\r
939 RGA2_FORMAT_RGB_888 = 0x2,
\r
940 RGA2_FORMAT_BGRA_8888 = 0x3,
\r
941 RGA2_FORMAT_BGRX_8888 = 0x4,
\r
942 RGA2_FORMAT_BGR_888 = 0x5,
\r
943 RGA2_FORMAT_RGB_565 = 0x6,
\r
944 RGA2_FORMAT_RGBA_5551 = 0x7,
\r
945 RGA2_FORMAT_RGBA_4444 = 0x8,
\r
946 RGA2_FORMAT_BGR_565 = 0x9,
\r
947 RGA2_FORMAT_BGRA_5551 = 0xa,
\r
948 RGA2_FORMAT_BGRA_4444 = 0xb,
\r
950 RGA2_FORMAT_YCbCr_422_SP = 0x10,
\r
951 RGA2_FORMAT_YCbCr_422_P = 0x11,
\r
952 RGA2_FORMAT_YCbCr_420_SP = 0x12,
\r
953 RGA2_FORMAT_YCbCr_420_P = 0x13,
\r
954 RGA2_FORMAT_YCrCb_422_SP = 0x14,
\r
955 RGA2_FORMAT_YCrCb_422_P = 0x15,
\r
956 RGA2_FORMAT_YCrCb_420_SP = 0x16,
\r
957 RGA2_FORMAT_YCrCb_420_P = 0x17,*/
\r
960 case 0x0: *df = RGA2_FORMAT_RGBA_8888; break;
\r
961 case 0x1: *df = RGA2_FORMAT_RGBX_8888; break;
\r
962 case 0x2: *df = RGA2_FORMAT_RGB_888; break;
\r
963 case 0x3: *df = RGA2_FORMAT_BGRA_8888; break;
\r
964 case 0x4: *df = RGA2_FORMAT_RGB_565; break;
\r
965 case 0x5: *df = RGA2_FORMAT_RGBA_5551; break;
\r
966 case 0x6: *df = RGA2_FORMAT_RGBA_4444; break;
\r
967 case 0x7: *df = RGA2_FORMAT_BGR_888; break;
\r
968 case 0x8: *df = RGA2_FORMAT_YCbCr_422_SP; break;
\r
969 case 0x9: *df = RGA2_FORMAT_YCbCr_422_P; break;
\r
970 case 0xa: *df = RGA2_FORMAT_YCbCr_420_SP; break;
\r
971 case 0xb: *df = RGA2_FORMAT_YCbCr_420_P; break;
\r
972 case 0xc: *df = RGA2_FORMAT_YCrCb_422_SP; break;
\r
973 case 0xd: *df = RGA2_FORMAT_YCrCb_422_P; break;
\r
974 case 0xe: *df = RGA2_FORMAT_YCrCb_420_SP; break;
\r
975 case 0xf: *df = RGA2_FORMAT_YCrCb_420_P; break;
\r
977 case 0x20:*df = RGA2_FORMAT_YCbCr_420_SP_10B; break;
\r
978 case 0x21:*df = RGA2_FORMAT_YCrCb_420_SP_10B; break;
\r
982 void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
\r
984 u16 alpha_mode_0, alpha_mode_1;
986 if (req_rga->render_mode & RGA_BUF_GEM_TYPE_MASK)
987 req->buf_type = RGA_BUF_GEM_TYPE_MASK & RGA_BUF_GEM_TYPE_DMA;
989 req_rga->render_mode &= (~RGA_BUF_GEM_TYPE_MASK);
991 if (req_rga->render_mode == 6)
\r
992 req->render_mode = update_palette_table_mode;
\r
993 else if (req_rga->render_mode == 7)
\r
994 req->render_mode = update_patten_buff_mode;
\r
995 else if (req_rga->render_mode == 5)
\r
996 req->render_mode = bitblt_mode;
\r
998 req->render_mode = req_rga->render_mode;
\r
1000 memcpy(&req->src, &req_rga->src, sizeof(req_rga->src));
\r
1001 memcpy(&req->dst, &req_rga->dst, sizeof(req_rga->dst));
\r
1002 memcpy(&req->pat, &req_rga->pat, sizeof(req_rga->pat));
\r
1003 memcpy(&req->src1,&req_rga->pat, sizeof(req_rga->pat));
\r
1005 format_name_convert(&req->src.format, req_rga->src.format);
\r
1006 format_name_convert(&req->dst.format, req_rga->dst.format);
\r
1008 if(req_rga->rotate_mode == 1) {
\r
1009 if(req_rga->sina == 0 && req_rga->cosa == 65536) {
\r
1011 req->rotate_mode = 0;
\r
1013 else if (req_rga->sina == 65536 && req_rga->cosa == 0) {
\r
1015 req->rotate_mode = 1;
\r
1016 req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_h + 1;
\r
1017 req->dst.act_w = req_rga->dst.act_h;
\r
1018 req->dst.act_h = req_rga->dst.act_w;
\r
1020 else if (req_rga->sina == 0 && req_rga->cosa == -65536) {
\r
1022 req->rotate_mode = 2;
\r
1023 req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_w + 1;
\r
1024 req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_h + 1;
\r
1026 else if (req_rga->sina == -65536 && req_rga->cosa == 0) {
\r
1028 req->rotate_mode = 3;
\r
1029 req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_w + 1;
\r
1030 req->dst.act_w = req_rga->dst.act_h;
\r
1031 req->dst.act_h = req_rga->dst.act_w;
\r
1034 else if (req_rga->rotate_mode == 2)
\r
1037 req->rotate_mode |= (1 << 4);
\r
1039 else if (req_rga->rotate_mode == 3)
\r
1042 req->rotate_mode |= (2 << 4);
\r
1045 req->rotate_mode = 0;
\r
1048 if((req->dst.act_w > 2048) && (req->src.act_h < req->dst.act_h))
\r
1049 req->scale_bicu_mode |= (1<<4);
\r
1051 req->LUT_addr = req_rga->LUT_addr;
\r
1052 req->rop_mask_addr = req_rga->rop_mask_addr;
\r
1054 req->bitblt_mode = req_rga->bsfilter_flag;
\r
1056 req->src_a_global_val = req_rga->alpha_global_value;
\r
1057 req->dst_a_global_val = req_rga->alpha_global_value;
\r
1058 req->rop_code = req_rga->rop_code;
\r
1059 req->rop_mode = 0;
\r
1061 req->color_fill_mode = req_rga->color_fill_mode;
\r
1062 req->color_key_min = req_rga->color_key_min;
\r
1063 req->color_key_max = req_rga->color_key_max;
\r
1065 req->fg_color = req_rga->fg_color;
\r
1066 req->bg_color = req_rga->bg_color;
\r
1067 memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));
\r
1069 req->palette_mode = req_rga->palette_mode;
\r
1070 req->yuv2rgb_mode = req_rga->yuv2rgb_mode + 1;
\r
1071 req->endian_mode = req_rga->endian_mode;
\r
1072 req->rgb2yuv_mode = 0;
\r
1074 req->fading_alpha_value = 0;
\r
1075 req->fading_r_value = req_rga->fading.r;
\r
1076 req->fading_g_value = req_rga->fading.g;
\r
1077 req->fading_b_value = req_rga->fading.b;
\r
1079 /* alpha mode set */
\r
1080 req->alpha_rop_flag = 0;
\r
1081 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag & 1))); // alpha_rop_enable
\r
1082 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 1) & 1) << 1); // rop_enable
\r
1083 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 2) & 1) << 2); // fading_enable
\r
1084 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 4) & 1) << 3); // alpha_cal_mode_sel
\r
1085 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 5) & 1) << 6); // dst_dither_down
\r
1086 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 6) & 1) << 7); // gradient fill mode sel
\r
1088 if (((req_rga->alpha_rop_flag) & 1)) {
\r
1089 if ((req_rga->alpha_rop_flag >> 3) & 1) {
\r
1090 /* porter duff alpha enable */
\r
1091 switch (req_rga->PD_mode)
\r
1095 case 1: //dst = src
\r
1097 case 2: //dst = dst
\r
1099 case 3: //dst = (256*sc + (256 - sa)*dc) >> 8
\r
1100 if((req_rga->alpha_rop_mode & 3) == 0) {
\r
1101 alpha_mode_0 = 0x3818;
\r
1102 alpha_mode_1 = 0x3818;
\r
1104 else if ((req_rga->alpha_rop_mode & 3) == 1) {
\r
1105 alpha_mode_0 = 0x381A;
\r
1106 alpha_mode_1 = 0x381A;
\r
1108 else if ((req_rga->alpha_rop_mode & 3) == 2) {
\r
1109 alpha_mode_0 = 0x381C;
\r
1110 alpha_mode_1 = 0x381C;
\r
1113 alpha_mode_0 = 0x381A;
\r
1114 alpha_mode_1 = 0x381A;
\r
1116 req->alpha_mode_0 = alpha_mode_0;
\r
1117 req->alpha_mode_1 = alpha_mode_1;
\r
1119 case 4: //dst = (sc*(256-da) + 256*dc) >> 8
\r
1121 case 5: //dst = (da*sc) >> 8
\r
1123 case 6: //dst = (sa*dc) >> 8
\r
1125 case 7: //dst = ((256-da)*sc) >> 8
\r
1127 case 8: //dst = ((256-sa)*dc) >> 8
\r
1129 case 9: //dst = (da*sc + (256-sa)*dc) >> 8
\r
1130 req->alpha_mode_0 = 0x3848;
\r
1131 req->alpha_mode_1 = 0x3848;
\r
1133 case 10://dst = ((256-da)*sc + (sa*dc)) >> 8
\r
1135 case 11://dst = ((256-da)*sc + (256-sa)*dc) >> 8;
\r
1138 req->alpha_mode_0 = 0x0010;
\r
1139 req->alpha_mode_1 = 0x0820;
\r
1146 if((req_rga->alpha_rop_mode & 3) == 0) {
\r
1147 req->alpha_mode_0 = 0x3848;
\r
1148 req->alpha_mode_1 = 0x3848;
\r
1150 else if ((req_rga->alpha_rop_mode & 3) == 1) {
\r
1151 req->alpha_mode_0 = 0x483A;
\r
1152 req->alpha_mode_1 = 0x483A;
\r
1154 else if ((req_rga->alpha_rop_mode & 3) == 2) {
\r
1155 req->alpha_mode_0 = 0x384C;
\r
1156 req->alpha_mode_1 = 0x384C;
\r
1161 if (req_rga->mmu_info.mmu_en && (req_rga->mmu_info.mmu_flag & 1) == 1) {
\r
1162 req->mmu_info.src0_mmu_flag = 1;
\r
1163 req->mmu_info.dst_mmu_flag = 1;
\r
1165 if (req_rga->mmu_info.mmu_flag >> 31) {
\r
1166 req->mmu_info.src0_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 8) & 1);
\r
1167 req->mmu_info.src1_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 9) & 1);
\r
1168 req->mmu_info.dst_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 10) & 1);
\r
1169 req->mmu_info.els_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 11) & 1);
\r
1172 if (req_rga->src.yrgb_addr >= 0xa0000000) {
\r
1173 req->mmu_info.src0_mmu_flag = 0;
\r
1174 req->src.yrgb_addr = req_rga->src.yrgb_addr - 0x60000000;
\r
1175 req->src.uv_addr = req_rga->src.uv_addr - 0x60000000;
\r
1176 req->src.v_addr = req_rga->src.v_addr - 0x60000000;
\r
1179 if (req_rga->dst.yrgb_addr >= 0xa0000000) {
\r
1180 req->mmu_info.dst_mmu_flag = 0;
\r
1181 req->dst.yrgb_addr = req_rga->dst.yrgb_addr - 0x60000000;
\r
1187 void memcpy_img_info(struct rga_img_info_t *dst, struct rga_img_info_32_t *src)
\r
1189 dst->yrgb_addr = src->yrgb_addr; /* yrgb mem addr */
\r
1190 dst->uv_addr = src->uv_addr; /* cb/cr mem addr */
\r
1191 dst->v_addr = src->v_addr; /* cr mem addr */
\r
1192 dst->format = src->format; //definition by RK_FORMAT
\r
1194 dst->act_w = src->act_w;
\r
1195 dst->act_h = src->act_h;
\r
1196 dst->x_offset = src->x_offset;
\r
1197 dst->y_offset = src->y_offset;
\r
1199 dst->vir_w = src->vir_w;
\r
1200 dst->vir_h = src->vir_h;
\r
1201 dst->endian_mode = src->endian_mode; //for BPP
\r
1202 dst->alpha_swap = src->alpha_swap;
\r
1204 void RGA_MSG_2_RGA2_MSG_32(struct rga_req_32 *req_rga, struct rga2_req *req)
\r
1206 u16 alpha_mode_0, alpha_mode_1;
1208 if (req_rga->render_mode & RGA_BUF_GEM_TYPE_MASK)
1209 req->buf_type = RGA_BUF_GEM_TYPE_MASK & RGA_BUF_GEM_TYPE_DMA;
1211 req_rga->render_mode &= (~RGA_BUF_GEM_TYPE_MASK);
1213 if (req_rga->render_mode == 6)
\r
1214 req->render_mode = update_palette_table_mode;
\r
1215 else if (req_rga->render_mode == 7)
\r
1216 req->render_mode = update_patten_buff_mode;
\r
1217 else if (req_rga->render_mode == 5)
\r
1218 req->render_mode = bitblt_mode;
\r
1220 req->render_mode = req_rga->render_mode;
\r
1221 memcpy_img_info(&req->src, &req_rga->src);
\r
1222 memcpy_img_info(&req->dst, &req_rga->dst);
\r
1223 memcpy_img_info(&req->pat, &req_rga->pat);
\r
1224 memcpy_img_info(&req->src1,&req_rga->pat);
\r
1225 format_name_convert(&req->src.format, req_rga->src.format);
\r
1226 format_name_convert(&req->dst.format, req_rga->dst.format);
\r
1227 if(req_rga->rotate_mode == 1) {
\r
1228 if(req_rga->sina == 0 && req_rga->cosa == 65536) {
\r
1229 req->rotate_mode = 0;
\r
1231 else if (req_rga->sina == 65536 && req_rga->cosa == 0) {
\r
1232 req->rotate_mode = 1;
\r
1233 req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_h + 1;
\r
1234 req->dst.act_w = req_rga->dst.act_h;
\r
1235 req->dst.act_h = req_rga->dst.act_w;
\r
1237 else if (req_rga->sina == 0 && req_rga->cosa == -65536) {
\r
1238 req->rotate_mode = 2;
\r
1239 req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_w + 1;
\r
1240 req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_h + 1;
\r
1242 else if (req_rga->sina == -65536 && req_rga->cosa == 0) {
\r
1243 req->rotate_mode = 3;
\r
1244 req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_w + 1;
\r
1245 req->dst.act_w = req_rga->dst.act_h;
\r
1246 req->dst.act_h = req_rga->dst.act_w;
\r
1249 else if (req_rga->rotate_mode == 2)
\r
1251 req->rotate_mode = (1 << 4);
\r
1253 else if (req_rga->rotate_mode == 3)
\r
1255 req->rotate_mode = (2 << 4);
\r
1258 req->rotate_mode = 0;
\r
1260 if((req->dst.act_w > 2048) && (req->src.act_h < req->dst.act_h))
\r
1261 req->scale_bicu_mode |= (1<<4);
\r
1262 req->LUT_addr = req_rga->LUT_addr;
\r
1263 req->rop_mask_addr = req_rga->rop_mask_addr;
\r
1264 req->bitblt_mode = req_rga->bsfilter_flag;
\r
1265 req->src_a_global_val = req_rga->alpha_global_value;
\r
1266 req->dst_a_global_val = req_rga->alpha_global_value;
\r
1267 req->rop_code = req_rga->rop_code;
\r
1268 req->rop_mode = 0;
\r
1269 req->color_fill_mode = req_rga->color_fill_mode;
\r
1270 req->color_key_min = req_rga->color_key_min;
\r
1271 req->color_key_max = req_rga->color_key_max;
\r
1272 req->fg_color = req_rga->fg_color;
\r
1273 req->bg_color = req_rga->bg_color;
\r
1274 memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));
\r
1275 req->palette_mode = req_rga->palette_mode;
\r
1276 req->yuv2rgb_mode = req_rga->yuv2rgb_mode + 1;
\r
1277 req->endian_mode = req_rga->endian_mode;
\r
1278 req->rgb2yuv_mode = 0;
\r
1279 req->fading_alpha_value = 0;
\r
1280 req->fading_r_value = req_rga->fading.r;
\r
1281 req->fading_g_value = req_rga->fading.g;
\r
1282 req->fading_b_value = req_rga->fading.b;
\r
1283 req->alpha_rop_flag = 0;
\r
1284 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag & 1))); // alpha_rop_enable
\r
1285 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 1) & 1) << 1); // rop_enable
\r
1286 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 2) & 1) << 2); // fading_enable
\r
1287 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 4) & 1) << 3); // alpha_cal_mode_sel
\r
1288 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 5) & 1) << 6); // dst_dither_down
\r
1289 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 6) & 1) << 7); // gradient fill mode sel
\r
1290 if(((req_rga->alpha_rop_flag) & 1)) {
\r
1291 if((req_rga->alpha_rop_flag >> 3) & 1) {
\r
1292 switch(req_rga->PD_mode)
\r
1296 case 1: //dst = src
\r
1298 case 2: //dst = dst
\r
1300 case 3: //dst = (256*sc + (256 - sa)*dc) >> 8
\r
1301 if((req_rga->alpha_rop_mode & 3) == 0) {
\r
1302 alpha_mode_0 = 0x3818;
\r
1303 alpha_mode_1 = 0x3818;
\r
1305 else if ((req_rga->alpha_rop_mode & 3) == 1) {
\r
1306 alpha_mode_0 = 0x381A;
\r
1307 alpha_mode_1 = 0x381A;
\r
1309 else if ((req_rga->alpha_rop_mode & 3) == 2) {
\r
1310 alpha_mode_0 = 0x381C;
\r
1311 alpha_mode_1 = 0x381C;
\r
1314 alpha_mode_0 = 0x381A;
\r
1315 alpha_mode_1 = 0x381A;
\r
1317 req->alpha_mode_0 = alpha_mode_0;
\r
1318 req->alpha_mode_1 = alpha_mode_1;
\r
1320 case 4: //dst = (sc*(256-da) + 256*dc) >> 8
\r
1322 case 5: //dst = (da*sc) >> 8
\r
1324 case 6: //dst = (sa*dc) >> 8
\r
1326 case 7: //dst = ((256-da)*sc) >> 8
\r
1328 case 8: //dst = ((256-sa)*dc) >> 8
\r
1330 case 9: //dst = (da*sc + (256-sa)*dc) >> 8
\r
1331 req->alpha_mode_0 = 0x3848;
\r
1332 req->alpha_mode_1 = 0x3848;
\r
1334 case 10://dst = ((256-da)*sc + (sa*dc)) >> 8
\r
1336 case 11://dst = ((256-da)*sc + (256-sa)*dc) >> 8;
\r
1339 req->alpha_mode_0 = 0x0010;
\r
1340 req->alpha_mode_1 = 0x0820;
\r
1347 if((req_rga->alpha_rop_mode & 3) == 0) {
\r
1348 req->alpha_mode_0 = 0x3848;
\r
1349 req->alpha_mode_1 = 0x3848;
\r
1351 else if ((req_rga->alpha_rop_mode & 3) == 1) {
\r
1352 req->alpha_mode_0 = 0x483A;
\r
1353 req->alpha_mode_1 = 0x483A;
\r
1355 else if ((req_rga->alpha_rop_mode & 3) == 2) {
\r
1356 req->alpha_mode_0 = 0x384C;
\r
1357 req->alpha_mode_1 = 0x384C;
\r
1361 if (req_rga->mmu_info.mmu_en && (req_rga->mmu_info.mmu_flag & 1) == 1) {
\r
1362 req->mmu_info.src0_mmu_flag = 1;
\r
1363 req->mmu_info.dst_mmu_flag = 1;
\r
1364 if (req_rga->mmu_info.mmu_flag >> 31) {
\r
1365 req->mmu_info.src0_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 8) & 1);
\r
1366 req->mmu_info.src1_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 9) & 1);
\r
1367 req->mmu_info.dst_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 10) & 1);
\r
1368 req->mmu_info.els_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 11) & 1);
\r
1371 if (req_rga->src.yrgb_addr >= 0xa0000000) {
\r
1372 req->mmu_info.src0_mmu_flag = 0;
\r
1373 req->src.yrgb_addr = req_rga->src.yrgb_addr - 0x60000000;
\r
1374 req->src.uv_addr = req_rga->src.uv_addr - 0x60000000;
\r
1375 req->src.v_addr = req_rga->src.v_addr - 0x60000000;
\r
1377 if (req_rga->dst.yrgb_addr >= 0xa0000000) {
\r
1378 req->mmu_info.dst_mmu_flag = 0;
\r
1379 req->dst.yrgb_addr = req_rga->dst.yrgb_addr - 0x60000000;
\r