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 "rga2_rop.h"
\r
38 RGA2_reg_get_param(unsigned char *base, struct rga2_req *msg)
\r
40 RK_U32 *bRGA_SRC_INFO;
\r
41 RK_U32 *bRGA_SRC_X_FACTOR;
\r
42 RK_U32 *bRGA_SRC_Y_FACTOR;
\r
45 RK_U32 param_x, param_y;
\r
46 RK_U8 x_flag, y_flag;
\r
50 bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);
\r
51 reg = *bRGA_SRC_INFO;
\r
53 bRGA_SRC_X_FACTOR = (RK_U32 *)(base + RGA2_SRC_X_FACTOR_OFFSET);
\r
54 bRGA_SRC_Y_FACTOR = (RK_U32 *)(base + RGA2_SRC_Y_FACTOR_OFFSET);
\r
56 x_flag = y_flag = 0;
\r
58 if(((msg->rotate_mode & 0x3) == 1) || ((msg->rotate_mode & 0x3) == 3))
\r
60 dw = msg->dst.act_h;
\r
61 dh = msg->dst.act_w;
\r
65 dw = msg->dst.act_w;
\r
66 dh = msg->dst.act_h;
\r
69 sw = msg->src.act_w;
\r
70 sh = msg->src.act_h;
\r
75 #if SCALE_DOWN_LARGE
\r
76 param_x = ((dw) << 16) / (sw);
\r
78 param_x = ((dw) << 16) / (sw);
\r
80 *bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 0 );
\r
86 param_x = ((sw - 1) << 16) / (dw - 1);
\r
88 param_x = ((sw) << 16) / (dw);
\r
90 *bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 16);
\r
94 *bRGA_SRC_X_FACTOR = 0;//((1 << 14) << 16) | (1 << 14);
\r
100 #if SCALE_DOWN_LARGE
\r
101 param_y = ((dh) << 16) / (sh);
\r
103 param_y = ((dh) << 16) / (sh);
\r
105 *bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 0 );
\r
110 #if 1//SCALE_MINUS1
\r
111 param_y = ((sh - 1) << 16) / (dh - 1);
\r
113 param_y = ((sh) << 16) / (dh);
\r
115 *bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 16);
\r
119 *bRGA_SRC_Y_FACTOR = 0;//((1 << 14) << 16) | (1 << 14);
\r
122 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE(x_flag)));
\r
123 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE(y_flag)));
\r
127 RGA2_set_mode_ctrl(u8 *base, struct rga2_req *msg)
\r
129 RK_U32 *bRGA_MODE_CTL;
\r
131 RK_U32 render_mode = msg->render_mode;
\r
133 bRGA_MODE_CTL = (u32 *)(base + RGA2_MODE_CTRL_OFFSET);
\r
135 if(msg->render_mode == 4)
\r
140 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_RENDER_MODE)) | (s_RGA2_MODE_CTRL_SW_RENDER_MODE(render_mode)));
\r
141 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_BITBLT_MODE)) | (s_RGA2_MODE_CTRL_SW_BITBLT_MODE(msg->bitblt_mode)));
\r
142 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_CF_ROP4_PAT)) | (s_RGA2_MODE_CTRL_SW_CF_ROP4_PAT(msg->color_fill_mode)));
\r
143 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_ALPHA_ZERO_KET)) | (s_RGA2_MODE_CTRL_SW_ALPHA_ZERO_KET(msg->alpha_zero_key)));
\r
144 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_GRADIENT_SAT)) | (s_RGA2_MODE_CTRL_SW_GRADIENT_SAT(msg->alpha_rop_flag >> 7)));
\r
145 reg = ((reg & (~m_RGA2_MODE_CTRL_SW_INTR_CF_E)) | (s_RGA2_MODE_CTRL_SW_INTR_CF_E(msg->CMD_fin_int_enable)));
\r
147 *bRGA_MODE_CTL = reg;
\r
151 RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
\r
153 RK_U32 *bRGA_SRC_INFO;
\r
154 RK_U32 *bRGA_SRC_BASE0, *bRGA_SRC_BASE1, *bRGA_SRC_BASE2;
\r
155 RK_U32 *bRGA_SRC_VIR_INFO;
\r
156 RK_U32 *bRGA_SRC_ACT_INFO;
\r
157 RK_U32 *bRGA_MASK_ADDR;
\r
158 RK_U32 *bRGA_SRC_TR_COLOR0, *bRGA_SRC_TR_COLOR1;
\r
161 RK_U8 src0_format = 0;
\r
163 RK_U8 src0_rb_swp = 0;
\r
164 RK_U8 src0_rgb_pack = 0;
\r
166 RK_U8 src0_cbcr_swp = 0;
\r
167 RK_U8 pixel_width = 1;
\r
169 RK_U32 uv_stride = 0;
\r
170 RK_U32 mask_stride = 0;
\r
171 RK_U32 ydiv = 1, xdiv = 2;
\r
176 RK_U8 scale_w_flag, scale_h_flag;
\r
178 bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);
\r
180 bRGA_SRC_BASE0 = (RK_U32 *)(base + RGA2_SRC_BASE0_OFFSET);
\r
181 bRGA_SRC_BASE1 = (RK_U32 *)(base + RGA2_SRC_BASE1_OFFSET);
\r
182 bRGA_SRC_BASE2 = (RK_U32 *)(base + RGA2_SRC_BASE2_OFFSET);
\r
184 bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);
\r
185 bRGA_SRC_ACT_INFO = (RK_U32 *)(base + RGA2_SRC_ACT_INFO_OFFSET);
\r
187 bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
\r
189 bRGA_SRC_TR_COLOR0 = (RK_U32 *)(base + RGA2_SRC_TR_COLOR0_OFFSET);
\r
190 bRGA_SRC_TR_COLOR1 = (RK_U32 *)(base + RGA2_SRC_TR_COLOR1_OFFSET);
\r
193 rotate_mode = msg->rotate_mode & 0x3;
\r
195 sw = msg->src.act_w;
\r
196 sh = msg->src.act_h;
\r
198 if((rotate_mode == 1) | (rotate_mode == 3))
\r
200 dw = msg->dst.act_h;
\r
201 dh = msg->dst.act_w;
\r
205 dw = msg->dst.act_w;
\r
206 dh = msg->dst.act_h;
\r
215 if(msg->rotate_mode >> 6)
\r
225 if(msg->rotate_mode >> 6)
\r
230 switch (msg->src.format)
\r
232 case RGA2_FORMAT_RGBA_8888 : src0_format = 0x0; pixel_width = 4; break;
\r
233 case RGA2_FORMAT_BGRA_8888 : src0_format = 0x0; src0_rb_swp = 0x1; pixel_width = 4; break;
\r
234 case RGA2_FORMAT_RGBX_8888 : src0_format = 0x1; pixel_width = 4; msg->src_trans_mode &= 0x07; break;
\r
235 case RGA2_FORMAT_BGRX_8888 : src0_format = 0x1; src0_rb_swp = 0x1; pixel_width = 4; msg->src_trans_mode &= 0x07; break;
\r
236 case RGA2_FORMAT_RGB_888 : src0_format = 0x2; src0_rgb_pack = 1; pixel_width = 3; msg->src_trans_mode &= 0x07; break;
\r
237 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
238 case RGA2_FORMAT_RGB_565 : src0_format = 0x4; pixel_width = 2; msg->src_trans_mode &= 0x07; src0_rb_swp = 0x1; break;
\r
239 case RGA2_FORMAT_RGBA_5551 : src0_format = 0x5; pixel_width = 2; src0_rb_swp = 0x1; break;
\r
240 case RGA2_FORMAT_RGBA_4444 : src0_format = 0x6; pixel_width = 2; src0_rb_swp = 0x1; break;
\r
241 case RGA2_FORMAT_BGR_565 : src0_format = 0x4; pixel_width = 2; msg->src_trans_mode &= 0x07; break;
\r
242 case RGA2_FORMAT_BGRA_5551 : src0_format = 0x5; pixel_width = 2; break;
\r
243 case RGA2_FORMAT_BGRA_4444 : src0_format = 0x6; pixel_width = 2; break;
\r
245 case RGA2_FORMAT_YCbCr_422_SP : src0_format = 0x8; xdiv = 1; ydiv = 1; break;
\r
246 case RGA2_FORMAT_YCbCr_422_P : src0_format = 0x9; xdiv = 2; ydiv = 1; break;
\r
247 case RGA2_FORMAT_YCbCr_420_SP : src0_format = 0xa; xdiv = 1; ydiv = 2; break;
\r
248 case RGA2_FORMAT_YCbCr_420_P : src0_format = 0xb; xdiv = 2; ydiv = 2; break;
\r
249 case RGA2_FORMAT_YCrCb_422_SP : src0_format = 0x8; xdiv = 1; ydiv = 1; src0_cbcr_swp = 1; break;
\r
250 case RGA2_FORMAT_YCrCb_422_P : src0_format = 0x9; xdiv = 2; ydiv = 1; src0_cbcr_swp = 1; break;
\r
251 case RGA2_FORMAT_YCrCb_420_SP : src0_format = 0xa; xdiv = 1; ydiv = 2; src0_cbcr_swp = 1; break;
\r
252 case RGA2_FORMAT_YCrCb_420_P : src0_format = 0xb; xdiv = 2; ydiv = 2; src0_cbcr_swp = 1; break;
\r
255 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) | (s_RGA2_SRC_INFO_SW_SRC_FMT(src0_format)));
\r
256 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP(src0_rb_swp)));
\r
257 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP(msg->alpha_swp)));
\r
258 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP(src0_cbcr_swp)));
\r
259 if(msg->src.format <= RGA2_FORMAT_BGRA_4444)
\r
260 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(0)));
\r
262 if(msg->dst.format >= RGA2_FORMAT_YCbCr_422_SP)
\r
263 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(0)));
\r
265 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(msg->yuv2rgb_mode)));
\r
267 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
268 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
269 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE((scale_w_flag))));
\r
270 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE((scale_h_flag))));
\r
271 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
272 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
273 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
274 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
275 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
276 RGA2_reg_get_param(base, msg);
\r
278 stride = (((msg->src.vir_w * pixel_width) + 3) & ~3) >> 2;
\r
280 uv_stride = ((msg->src.vir_w / xdiv + 3) & ~3);
\r
282 *bRGA_SRC_BASE0 = (RK_U32)(msg->src.yrgb_addr + msg->src.y_offset * (stride<<2) + msg->src.x_offset * pixel_width);
\r
283 *bRGA_SRC_BASE1 = (RK_U32)(msg->src.uv_addr + (msg->src.y_offset / ydiv) * uv_stride + (msg->src.x_offset / xdiv));
\r
284 *bRGA_SRC_BASE2 = (RK_U32)(msg->src.v_addr + (msg->src.y_offset / ydiv) * uv_stride + (msg->src.x_offset / xdiv));
\r
286 //mask_stride = ((msg->src0_act.width + 31) & ~31) >> 5;
\r
287 mask_stride = msg->rop_mask_stride;
\r
289 *bRGA_SRC_VIR_INFO = stride | (mask_stride << 16);
\r
291 *bRGA_SRC_ACT_INFO = (msg->src.act_w - 1) | ((msg->src.act_h - 1) << 16);
\r
293 *bRGA_MASK_ADDR = (RK_U32)msg->rop_mask_addr;
\r
295 *bRGA_SRC_INFO = reg;
\r
297 *bRGA_SRC_TR_COLOR0 = msg->color_key_min;
\r
298 *bRGA_SRC_TR_COLOR1 = msg->color_key_max;
\r
303 RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
\r
305 RK_U32 *bRGA_DST_INFO;
\r
306 RK_U32 *bRGA_DST_BASE0, *bRGA_DST_BASE1, *bRGA_DST_BASE2, *bRGA_SRC_BASE3;
\r
307 RK_U32 *bRGA_DST_VIR_INFO;
\r
308 RK_U32 *bRGA_DST_ACT_INFO;
\r
310 RK_U8 src1_format = 0;
\r
311 RK_U8 src1_rb_swp = 0;
\r
312 RK_U8 src1_rgb_pack = 0;
\r
313 RK_U8 dst_format = 0;
\r
314 RK_U8 dst_rb_swp = 0;
\r
315 RK_U8 dst_rgb_pack = 0;
\r
316 RK_U8 dst_cbcr_swp = 0;
\r
319 RK_U32 s_stride, d_stride;
\r
320 RK_U32 x_mirr, y_mirr, rot_90_flag;
\r
321 RK_U32 yrgb_addr, u_addr, v_addr, s_yrgb_addr;
\r
322 RK_U32 d_uv_stride, x_div, y_div;
\r
323 RK_U32 y_lt_addr, y_ld_addr, y_rt_addr, y_rd_addr;
\r
324 RK_U32 u_lt_addr, u_ld_addr, u_rt_addr, u_rd_addr;
\r
325 RK_U32 v_lt_addr, v_ld_addr, v_rt_addr, v_rd_addr;
\r
327 RK_U32 s_y_lt_addr, s_y_ld_addr, s_y_rt_addr, s_y_rd_addr;
\r
332 bRGA_DST_INFO = (RK_U32 *)(base + RGA2_DST_INFO_OFFSET);
\r
333 bRGA_DST_BASE0 = (RK_U32 *)(base + RGA2_DST_BASE0_OFFSET);
\r
334 bRGA_DST_BASE1 = (RK_U32 *)(base + RGA2_DST_BASE1_OFFSET);
\r
335 bRGA_DST_BASE2 = (RK_U32 *)(base + RGA2_DST_BASE2_OFFSET);
\r
337 bRGA_SRC_BASE3 = (RK_U32 *)(base + RGA2_SRC_BASE3_OFFSET);
\r
339 bRGA_DST_VIR_INFO = (RK_U32 *)(base + RGA2_DST_VIR_INFO_OFFSET);
\r
340 bRGA_DST_ACT_INFO = (RK_U32 *)(base + RGA2_DST_ACT_INFO_OFFSET);
\r
342 switch (msg->src1.format)
\r
344 case RGA2_FORMAT_RGBA_8888 : src1_format = 0x0; spw = 4; break;
\r
345 case RGA2_FORMAT_BGRA_8888 : src1_format = 0x0; src1_rb_swp = 0x1; spw = 4; break;
\r
346 case RGA2_FORMAT_RGBX_8888 : src1_format = 0x1; spw = 4; break;
\r
347 case RGA2_FORMAT_BGRX_8888 : src1_format = 0x1; src1_rb_swp = 0x1; spw = 4; break;
\r
348 case RGA2_FORMAT_RGB_888 : src1_format = 0x2; src1_rgb_pack = 1; spw = 3; break;
\r
349 case RGA2_FORMAT_BGR_888 : src1_format = 0x2; src1_rgb_pack = 1; src1_rb_swp = 1; spw = 3; break;
\r
350 case RGA2_FORMAT_RGB_565 : src1_format = 0x4; spw = 2; src1_rb_swp = 0x1; break;
\r
351 case RGA2_FORMAT_RGBA_5551 : src1_format = 0x5; spw = 2; src1_rb_swp = 0x1; break;
\r
352 case RGA2_FORMAT_RGBA_4444 : src1_format = 0x6; spw = 2; src1_rb_swp = 0x1; break;
\r
353 case RGA2_FORMAT_BGR_565 : src1_format = 0x4; spw = 2; break;
\r
354 case RGA2_FORMAT_BGRA_5551 : src1_format = 0x5; spw = 2; break;
\r
355 case RGA2_FORMAT_BGRA_4444 : src1_format = 0x6; spw = 2; break;
\r
356 default : spw = 4; break;
\r
359 reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_FMT)) | (s_RGA2_DST_INFO_SW_SRC1_FMT(src1_format)));
\r
360 reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_RB_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_RB_SWP(src1_rb_swp)));
\r
361 reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP(msg->alpha_swp >> 1)));
\r
364 switch (msg->dst.format)
\r
366 case RGA2_FORMAT_RGBA_8888 : dst_format = 0x0; dpw = 4; break;
\r
367 case RGA2_FORMAT_BGRA_8888 : dst_format = 0x0; dst_rb_swp = 0x1; dpw = 4; break;
\r
368 case RGA2_FORMAT_RGBX_8888 : dst_format = 0x1; dpw = 4; break;
\r
369 case RGA2_FORMAT_BGRX_8888 : dst_format = 0x1; dst_rb_swp = 0x1; dpw = 4; break;
\r
370 case RGA2_FORMAT_RGB_888 : dst_format = 0x2; dst_rgb_pack = 1; dpw = 3; break;
\r
371 case RGA2_FORMAT_BGR_888 : dst_format = 0x2; dst_rgb_pack = 1; dst_rb_swp = 1; dpw = 3; break;
\r
372 case RGA2_FORMAT_RGB_565 : dst_format = 0x4; dpw = 2; dst_rb_swp = 0x1; break;
\r
373 case RGA2_FORMAT_RGBA_5551 : dst_format = 0x5; dpw = 2; dst_rb_swp = 0x1; break;
\r
374 case RGA2_FORMAT_RGBA_4444 : dst_format = 0x6; dpw = 2; dst_rb_swp = 0x1; break;
\r
375 case RGA2_FORMAT_BGR_565 : dst_format = 0x4; dpw = 2; break;
\r
376 case RGA2_FORMAT_BGRA_5551 : dst_format = 0x5; dpw = 2; break;
\r
377 case RGA2_FORMAT_BGRA_4444 : dst_format = 0x6; dpw = 2; break;
\r
379 case RGA2_FORMAT_YCbCr_422_SP : dst_format = 0x8; x_div = 1; y_div = 1; break;
\r
380 case RGA2_FORMAT_YCbCr_422_P : dst_format = 0x9; x_div = 2; y_div = 1; break;
\r
381 case RGA2_FORMAT_YCbCr_420_SP : dst_format = 0xa; x_div = 1; y_div = 2; break;
\r
382 case RGA2_FORMAT_YCbCr_420_P : dst_format = 0xb; x_div = 2; y_div = 2; break;
\r
383 case RGA2_FORMAT_YCrCb_422_SP : dst_format = 0x8; dst_cbcr_swp = 1; x_div = 1; y_div = 1; break;
\r
384 case RGA2_FORMAT_YCrCb_422_P : dst_format = 0x9; dst_cbcr_swp = 1; x_div = 2; y_div = 1; break;
\r
385 case RGA2_FORMAT_YCrCb_420_SP : dst_format = 0xa; dst_cbcr_swp = 1; x_div = 1; y_div = 2; break;
\r
386 case RGA2_FORMAT_YCrCb_420_P : dst_format = 0xb; dst_cbcr_swp = 1; x_div = 2; y_div = 2; break;
\r
389 reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_FMT)) | (s_RGA2_DST_INFO_SW_DST_FMT(dst_format)));
\r
390 reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_RB_SWAP)) | (s_RGA2_DST_INFO_SW_DST_RB_SWAP(dst_rb_swp)));
\r
391 reg = ((reg & (~m_RGA2_DST_INFO_SW_ALPHA_SWAP)) | (s_RGA2_DST_INFO_SW_ALPHA_SWAP(msg->alpha_swp >> 2)));
\r
392 reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_UV_SWAP)) | (s_RGA2_DST_INFO_SW_DST_UV_SWAP(dst_cbcr_swp)));
\r
394 reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_UP_E)) | (s_RGA2_DST_INFO_SW_DITHER_UP_E(msg->alpha_rop_flag >> 5)));
\r
395 reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_DOWN_E)) | (s_RGA2_DST_INFO_SW_DITHER_DOWN_E(msg->alpha_rop_flag >> 6)));
\r
396 reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_MODE)) | (s_RGA2_DST_INFO_SW_DITHER_MODE(msg->dither_mode)));
\r
397 reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_CSC_MODE)) | (s_RGA2_DST_INFO_SW_DST_CSC_MODE(msg->yuv2rgb_mode >> 4)));
\r
398 reg = ((reg & (~m_RGA2_DST_INFO_SW_CSC_CLIP_MODE)) | (s_RGA2_DST_INFO_SW_CSC_CLIP_MODE(msg->yuv2rgb_mode >> 6)));
\r
401 *bRGA_DST_INFO = reg;
\r
403 s_stride = ((msg->src1.vir_w * spw + 3) & ~3) >> 2;
\r
404 d_stride = ((msg->dst.vir_w * dpw + 3) & ~3) >> 2;
\r
405 d_uv_stride = (d_stride << 2) / x_div;
\r
407 *bRGA_DST_VIR_INFO = d_stride | (s_stride << 16);
\r
408 *bRGA_DST_ACT_INFO = (msg->dst.act_w - 1) | ((msg->dst.act_h - 1) << 16);
\r
412 if(((msg->rotate_mode & 0xf) == 0) || ((msg->rotate_mode & 0xf) == 1))
\r
423 rot_90_flag = msg->rotate_mode & 1;
\r
424 x_mirr = (x_mirr + ((msg->rotate_mode >> 4) & 1)) & 1;
\r
425 y_mirr = (y_mirr + ((msg->rotate_mode >> 5) & 1)) & 1;
\r
427 yrgb_addr = (RK_U32)msg->src1.yrgb_addr + (msg->src1.y_offset * s_stride) + (msg->src1.x_offset * spw);
\r
429 s_y_lt_addr = yrgb_addr;
\r
430 s_y_ld_addr = yrgb_addr + (msg->src1.act_h - 1) * s_stride;
\r
431 s_y_rt_addr = yrgb_addr + (msg->dst.act_w - 1) * spw;
\r
432 s_y_rd_addr = s_y_ld_addr + (msg->dst.act_w - 1) * spw;
\r
434 yrgb_addr = (RK_U32)msg->dst.yrgb_addr + (msg->dst.y_offset * d_stride) + (msg->dst.x_offset * dpw);
\r
435 u_addr = (RK_U32)msg->dst.uv_addr + msg->dst.y_offset * d_uv_stride + msg->dst.x_offset / x_div;
\r
436 v_addr = (RK_U32)msg->dst.v_addr + msg->dst.y_offset * d_uv_stride + msg->dst.x_offset / x_div;
\r
438 y_lt_addr = yrgb_addr;
\r
439 u_lt_addr = u_addr;
\r
440 v_lt_addr = v_addr;
\r
442 y_ld_addr = yrgb_addr + (msg->dst.act_h - 1) * (d_stride);
\r
443 u_ld_addr = u_addr + ((msg->dst.act_h / y_div) - 1) * (d_uv_stride);
\r
444 v_ld_addr = v_addr + ((msg->dst.act_h / y_div) - 1) * (d_uv_stride);
\r
446 y_rt_addr = yrgb_addr + (msg->dst.act_w - 1) * dpw;
\r
447 u_rt_addr = u_addr + (msg->dst.act_w / x_div) - 1;
\r
448 v_rt_addr = v_addr + (msg->dst.act_w / x_div) - 1;
\r
450 y_rd_addr = y_ld_addr + (msg->dst.act_w - 1) * dpw;
\r
451 u_rd_addr = u_ld_addr + (msg->dst.act_w / x_div) - 1;
\r
452 v_rd_addr = v_ld_addr + (msg->dst.act_w / x_div) - 1;
\r
454 if(rot_90_flag == 0)
\r
460 yrgb_addr = y_rd_addr;
\r
461 u_addr = u_rd_addr;
\r
462 v_addr = v_rd_addr;
\r
464 s_yrgb_addr = s_y_rd_addr;
\r
468 yrgb_addr = y_ld_addr;
\r
469 u_addr = u_ld_addr;
\r
470 v_addr = v_ld_addr;
\r
472 s_yrgb_addr = s_y_ld_addr;
\r
479 yrgb_addr = y_rt_addr;
\r
480 u_addr = u_rt_addr;
\r
481 v_addr = v_rt_addr;
\r
483 s_yrgb_addr = s_y_rt_addr;
\r
487 yrgb_addr = y_lt_addr;
\r
488 u_addr = u_lt_addr;
\r
489 v_addr = v_lt_addr;
\r
491 s_yrgb_addr = s_y_lt_addr;
\r
501 yrgb_addr = y_ld_addr;
\r
502 u_addr = u_ld_addr;
\r
503 v_addr = v_ld_addr;
\r
505 s_yrgb_addr = s_y_ld_addr;
\r
509 yrgb_addr = y_rd_addr;
\r
510 u_addr = u_rd_addr;
\r
511 v_addr = v_rd_addr;
\r
513 s_yrgb_addr = s_y_rd_addr;
\r
520 yrgb_addr = y_lt_addr;
\r
521 u_addr = u_lt_addr;
\r
522 v_addr = v_lt_addr;
\r
524 s_yrgb_addr = s_y_lt_addr;
\r
528 yrgb_addr = y_rt_addr;
\r
529 u_addr = u_rt_addr;
\r
530 v_addr = v_rt_addr;
\r
532 s_yrgb_addr = s_y_rt_addr;
\r
537 *bRGA_DST_BASE0 = (RK_U32)yrgb_addr;
\r
538 *bRGA_DST_BASE1 = (RK_U32)u_addr;
\r
539 *bRGA_DST_BASE2 = (RK_U32)v_addr;
\r
540 *bRGA_SRC_BASE3 = (RK_U32)s_y_lt_addr;
\r
544 RGA2_set_reg_alpha_info(u8 *base, struct rga2_req *msg)
\r
546 RK_U32 *bRGA_ALPHA_CTRL0;
\r
547 RK_U32 *bRGA_ALPHA_CTRL1;
\r
548 RK_U32 *bRGA_FADING_CTRL;
\r
552 bRGA_ALPHA_CTRL0 = (RK_U32 *)(base + RGA2_ALPHA_CTRL0_OFFSET);
\r
553 bRGA_ALPHA_CTRL1 = (RK_U32 *)(base + RGA2_ALPHA_CTRL1_OFFSET);
\r
554 bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
\r
556 reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0)) | (s_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0(msg->alpha_rop_flag)));
\r
557 reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL)) | (s_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL(msg->alpha_rop_flag >> 1)));
\r
558 reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ROP_MODE)) | (s_RGA2_ALPHA_CTRL0_SW_ROP_MODE(msg->rop_mode)));
\r
559 reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA)) | (s_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA(msg->src_a_global_val)));
\r
560 reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA)) | (s_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA(msg->dst_a_global_val)));
\r
562 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_COLOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_COLOR_M0(msg->alpha_mode_0 >> 15)));
\r
563 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_COLOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_COLOR_M0(msg->alpha_mode_0 >> 7)));
\r
564 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M0(msg->alpha_mode_0 >> 12)));
\r
565 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M0(msg->alpha_mode_0 >> 4)));
\r
566 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
567 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
568 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M0(msg->alpha_mode_0 >> 9)));
\r
569 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M0(msg->alpha_mode_0 >> 1)));
\r
570 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M0(msg->alpha_mode_0 >> 8)));
\r
571 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M0(msg->alpha_mode_0 >> 0)));
\r
573 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M1(msg->alpha_mode_1 >> 12)));
\r
574 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M1(msg->alpha_mode_1 >> 4)));
\r
575 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
576 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
577 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M1(msg->alpha_mode_1 >> 9)));
\r
578 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M1(msg->alpha_mode_1 >> 1)));
\r
579 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M1(msg->alpha_mode_1 >> 8)));
\r
580 reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M1(msg->alpha_mode_1 >> 0)));
\r
582 *bRGA_ALPHA_CTRL0 = reg0;
\r
583 *bRGA_ALPHA_CTRL1 = reg1;
\r
585 if((msg->alpha_rop_flag>>2)&1)
\r
587 *bRGA_FADING_CTRL = (1<<24) | (msg->fading_b_value<<16) | (msg->fading_g_value<<8) | (msg->fading_r_value);
\r
592 RGA2_set_reg_rop_info(u8 *base, struct rga2_req *msg)
\r
594 RK_U32 *bRGA_ALPHA_CTRL0;
\r
595 RK_U32 *bRGA_ROP_CTRL0;
\r
596 RK_U32 *bRGA_ROP_CTRL1;
\r
597 RK_U32 *bRGA_MASK_ADDR;
\r
598 RK_U32 *bRGA_FG_COLOR;
\r
599 RK_U32 *bRGA_PAT_CON;
\r
601 RK_U32 rop_code0 = 0;
\r
602 RK_U32 rop_code1 = 0;
\r
604 bRGA_ALPHA_CTRL0 = (RK_U32 *)(base + RGA2_ALPHA_CTRL0_OFFSET);
\r
605 bRGA_ROP_CTRL0 = (RK_U32 *)(base + RGA2_ROP_CTRL0_OFFSET);
\r
606 bRGA_ROP_CTRL1 = (RK_U32 *)(base + RGA2_ROP_CTRL1_OFFSET);
\r
607 bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
\r
608 bRGA_FG_COLOR = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);
\r
609 bRGA_PAT_CON = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
\r
611 if(msg->rop_mode == 0) {
\r
612 rop_code0 = ROP3_code[(msg->rop_code & 0xff)];
\r
614 else if(msg->rop_mode == 1) {
\r
615 rop_code0 = ROP3_code[(msg->rop_code & 0xff)];
\r
617 else if(msg->rop_mode == 2) {
\r
618 rop_code0 = ROP3_code[(msg->rop_code & 0xff)];
\r
619 rop_code1 = ROP3_code[(msg->rop_code & 0xff00)>>8];
\r
622 *bRGA_ROP_CTRL0 = rop_code0;
\r
623 *bRGA_ROP_CTRL1 = rop_code1;
\r
624 *bRGA_FG_COLOR = msg->fg_color;
\r
625 *bRGA_MASK_ADDR = (RK_U32)msg->rop_mask_addr;
\r
626 *bRGA_PAT_CON = (msg->pat.act_w-1) | ((msg->pat.act_h-1) << 8)
\r
627 | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24);
\r
628 *bRGA_ALPHA_CTRL0 = *bRGA_ALPHA_CTRL0 | (((msg->endian_mode >> 1) & 1) << 20);
\r
635 RGA2_set_reg_color_palette(RK_U8 *base, struct rga2_req *msg)
\r
637 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
639 RK_S16 x_off, y_off;
\r
646 bRGA_SRC_BASE0 = (RK_U32 *)(base + RGA2_SRC_BASE0_OFFSET);
\r
647 bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);
\r
648 bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);
\r
649 bRGA_SRC_ACT_INFO = (RK_U32 *)(base + RGA2_SRC_ACT_INFO_OFFSET);
\r
650 bRGA_SRC_FG_COLOR = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);
\r
651 bRGA_SRC_BG_COLOR = (RK_U32 *)(base + RGA2_SRC_BG_COLOR_OFFSET);
\r
655 shift = 3 - msg->palette_mode;
\r
657 x_off = msg->src.x_offset;
\r
658 y_off = msg->src.y_offset;
\r
660 sw = msg->src.vir_w;
\r
661 byte_num = sw >> shift;
\r
663 src_stride = (byte_num + 3) & (~3);
\r
665 p = (RK_U32 *)msg->src.yrgb_addr;
\r
670 p = p + (x_off>>shift) + y_off*src_stride;
\r
674 p = p + (((x_off>>shift)>>2)<<2) + (3 - ((x_off>>shift) & 3)) + y_off*src_stride;
\r
678 p = p + (x_off>>shift) + y_off*src_stride;
\r
681 *bRGA_SRC_BASE0 = (RK_U32)p;
\r
683 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) | (s_RGA2_SRC_INFO_SW_SRC_FMT((msg->palette_mode | 0xc))));
\r
684 reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_CP_ENDAIN)) | (s_RGA2_SRC_INFO_SW_SW_CP_ENDAIN(msg->endian_mode & 1)));
\r
685 *bRGA_SRC_VIR_INFO = src_stride >> 2;
\r
686 *bRGA_SRC_ACT_INFO = (msg->src.act_w - 1) | ((msg->src.act_h - 1) << 16);
\r
687 *bRGA_SRC_INFO = reg;
\r
689 *bRGA_SRC_FG_COLOR = msg->fg_color;
\r
690 *bRGA_SRC_BG_COLOR = msg->bg_color;
\r
695 RGA2_set_reg_color_fill(u8 *base, struct rga2_req *msg)
\r
697 RK_U32 *bRGA_CF_GR_A;
\r
698 RK_U32 *bRGA_CF_GR_B;
\r
699 RK_U32 *bRGA_CF_GR_G;
\r
700 RK_U32 *bRGA_CF_GR_R;
\r
701 RK_U32 *bRGA_SRC_FG_COLOR;
\r
702 RK_U32 *bRGA_MASK_ADDR;
\r
703 RK_U32 *bRGA_PAT_CON;
\r
705 RK_U32 mask_stride;
\r
706 RK_U32 *bRGA_SRC_VIR_INFO;
\r
708 bRGA_SRC_FG_COLOR = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);
\r
710 bRGA_CF_GR_A = (RK_U32 *)(base + RGA2_CF_GR_A_OFFSET);
\r
711 bRGA_CF_GR_B = (RK_U32 *)(base + RGA2_CF_GR_B_OFFSET);
\r
712 bRGA_CF_GR_G = (RK_U32 *)(base + RGA2_CF_GR_G_OFFSET);
\r
713 bRGA_CF_GR_R = (RK_U32 *)(base + RGA2_CF_GR_R_OFFSET);
\r
715 bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
\r
716 bRGA_PAT_CON = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
\r
718 bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);
\r
720 mask_stride = msg->rop_mask_stride;
\r
722 if(msg->color_fill_mode == 0)
\r
725 *bRGA_CF_GR_A = (msg->gr_color.gr_x_a & 0xffff) | (msg->gr_color.gr_y_a << 16);
\r
726 *bRGA_CF_GR_B = (msg->gr_color.gr_x_b & 0xffff) | (msg->gr_color.gr_y_b << 16);
\r
727 *bRGA_CF_GR_G = (msg->gr_color.gr_x_g & 0xffff) | (msg->gr_color.gr_y_g << 16);
\r
728 *bRGA_CF_GR_R = (msg->gr_color.gr_x_r & 0xffff) | (msg->gr_color.gr_y_r << 16);
\r
730 *bRGA_SRC_FG_COLOR = msg->fg_color;
\r
735 *bRGA_MASK_ADDR = (RK_U32)msg->pat.yrgb_addr;
\r
736 *bRGA_PAT_CON = (msg->pat.act_w - 1) | ((msg->pat.act_h - 1) << 8)
\r
737 | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24);
\r
739 *bRGA_SRC_VIR_INFO = mask_stride << 16;
\r
744 RGA2_set_reg_update_palette_table(RK_U8 *base, struct rga2_req *msg)
\r
746 RK_U32 *bRGA_MASK_BASE;
\r
747 RK_U32 *bRGA_FADING_CTRL;
\r
749 bRGA_MASK_BASE = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
\r
750 bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
\r
752 *bRGA_FADING_CTRL = msg->fading_g_value << 8;
\r
753 // *bRGA_MASK_BASE = (RK_U32)msg->LUT_addr;
\r
754 *bRGA_MASK_BASE = (RK_U32)msg->pat.yrgb_addr;
\r
759 RGA2_set_reg_update_patten_buff(RK_U8 *base, struct rga2_req *msg)
\r
763 u32 *bRGA_PAT_START_POINT;
\r
764 RK_U32 *bRGA_FADING_CTRL;
\r
766 rga_img_info_t *pat;
\r
768 RK_U32 num, offset;
\r
772 num = (pat->act_w * pat->act_h) - 1;
\r
774 offset = pat->act_w * pat->y_offset + pat->x_offset;
\r
776 bRGA_PAT_START_POINT = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
\r
777 bRGA_PAT_MST = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
\r
778 bRGA_PAT_CON = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
\r
779 bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
\r
781 *bRGA_PAT_MST = (RK_U32)msg->pat.yrgb_addr;
\r
782 *bRGA_PAT_START_POINT = (pat->act_w * pat->y_offset) + pat->x_offset;
\r
784 reg = (pat->act_w-1) | ((pat->act_h-1) << 8) | (pat->x_offset << 16) | (pat->y_offset << 24);
\r
785 *bRGA_PAT_CON = reg;
\r
787 *bRGA_FADING_CTRL = (num << 8) | offset;
\r
792 RGA2_set_pat_info(RK_U8 *base, struct rga2_req *msg)
\r
795 u32 *bRGA_FADING_CTRL;
\r
797 rga_img_info_t *pat;
\r
799 RK_U32 num, offset;
\r
803 num = ((pat->act_w * pat->act_h) - 1) & 0xff;
\r
805 offset = (pat->act_w * pat->y_offset) + pat->x_offset;
\r
807 bRGA_PAT_CON = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
\r
808 bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
\r
810 reg = (pat->act_w-1) | ((pat->act_h-1) << 8) | (pat->x_offset << 16) | (pat->y_offset << 24);
\r
811 *bRGA_PAT_CON = reg;
\r
813 *bRGA_FADING_CTRL = (num << 8) | offset; //???pat_addr???
\r
818 RGA2_set_mmu_info(RK_U8 *base, struct rga2_req *msg)
\r
820 RK_U32 *bRGA_MMU_CTRL1;
\r
821 RK_U32 *bRGA_MMU_SRC_BASE;
\r
822 RK_U32 *bRGA_MMU_SRC1_BASE;
\r
823 RK_U32 *bRGA_MMU_DST_BASE;
\r
824 RK_U32 *bRGA_MMU_ELS_BASE;
\r
828 bRGA_MMU_CTRL1 = (RK_U32 *)(base + RGA2_MMU_CTRL1_OFFSET);
\r
829 bRGA_MMU_SRC_BASE = (RK_U32 *)(base + RGA2_MMU_SRC_BASE_OFFSET);
\r
830 bRGA_MMU_SRC1_BASE = (RK_U32 *)(base + RGA2_MMU_SRC1_BASE_OFFSET);
\r
831 bRGA_MMU_DST_BASE = (RK_U32 *)(base + RGA2_MMU_DST_BASE_OFFSET);
\r
832 bRGA_MMU_ELS_BASE = (RK_U32 *)(base + RGA2_MMU_ELS_BASE_OFFSET);
\r
834 reg = (msg->mmu_info.src0_mmu_flag & 0xf) | ((msg->mmu_info.src1_mmu_flag & 0xf) << 4)
\r
835 | ((msg->mmu_info.dst_mmu_flag & 0xf) << 8) | ((msg->mmu_info.els_mmu_flag & 0x3) << 12);
\r
837 *bRGA_MMU_CTRL1 = reg;
\r
838 *bRGA_MMU_SRC_BASE = (RK_U32)(msg->mmu_info.src0_base_addr) >> 4;
\r
839 *bRGA_MMU_SRC1_BASE = (RK_U32)(msg->mmu_info.src1_base_addr) >> 4;
\r
840 *bRGA_MMU_DST_BASE = (RK_U32)(msg->mmu_info.dst_base_addr) >> 4;
\r
841 *bRGA_MMU_ELS_BASE = (RK_U32)(msg->mmu_info.els_base_addr) >> 4;
\r
846 RGA2_gen_reg_info(RK_U8 *base , struct rga2_req *msg)
\r
849 RGA2_set_mode_ctrl(base, msg);
\r
851 RGA2_set_pat_info(base, msg);
\r
853 switch(msg->render_mode)
\r
856 RGA2_set_reg_src_info(base, msg);
\r
857 RGA2_set_reg_dst_info(base, msg);
\r
858 RGA2_set_reg_alpha_info(base, msg);
\r
859 RGA2_set_reg_rop_info(base, msg);
\r
861 case color_fill_mode :
\r
862 RGA2_set_reg_color_fill(base, msg);
\r
863 RGA2_set_reg_dst_info(base, msg);
\r
864 RGA2_set_reg_alpha_info(base, msg);
\r
866 case color_palette_mode :
\r
867 RGA2_set_reg_color_palette(base, msg);
\r
868 RGA2_set_reg_dst_info(base, msg);
\r
870 case update_palette_table_mode :
\r
871 RGA2_set_reg_update_palette_table(base, msg);
\r
873 case update_patten_buff_mode :
\r
874 RGA2_set_reg_update_patten_buff(base, msg);
\r
877 printk("RGA2 ERROR msg render mode %d \n", msg->render_mode);
\r
882 RGA2_set_mmu_info(base, msg);
\r
888 void format_name_convert(uint32_t *df, uint32_t sf)
\r
891 RK_FORMAT_RGBA_8888 = 0x0,
\r
892 RK_FORMAT_RGBX_8888 = 0x1,
\r
893 RK_FORMAT_RGB_888 = 0x2,
\r
894 RK_FORMAT_BGRA_8888 = 0x3,
\r
895 RK_FORMAT_RGB_565 = 0x4,
\r
896 RK_FORMAT_RGBA_5551 = 0x5,
\r
897 RK_FORMAT_RGBA_4444 = 0x6,
\r
898 RK_FORMAT_BGR_888 = 0x7,
\r
900 RK_FORMAT_YCbCr_422_SP = 0x8,
\r
901 RK_FORMAT_YCbCr_422_P = 0x9,
\r
902 RK_FORMAT_YCbCr_420_SP = 0xa,
\r
903 RK_FORMAT_YCbCr_420_P = 0xb,
\r
905 RK_FORMAT_YCrCb_422_SP = 0xc,
\r
906 RK_FORMAT_YCrCb_422_P = 0xd,
\r
907 RK_FORMAT_YCrCb_420_SP = 0xe,
\r
908 RK_FORMAT_YCrCb_420_P = 0xf,
\r
910 RGA2_FORMAT_RGBA_8888 = 0x0,
\r
911 RGA2_FORMAT_RGBX_8888 = 0x1,
\r
912 RGA2_FORMAT_RGB_888 = 0x2,
\r
913 RGA2_FORMAT_BGRA_8888 = 0x3,
\r
914 RGA2_FORMAT_BGRX_8888 = 0x4,
\r
915 RGA2_FORMAT_BGR_888 = 0x5,
\r
916 RGA2_FORMAT_RGB_565 = 0x6,
\r
917 RGA2_FORMAT_RGBA_5551 = 0x7,
\r
918 RGA2_FORMAT_RGBA_4444 = 0x8,
\r
919 RGA2_FORMAT_BGR_565 = 0x9,
\r
920 RGA2_FORMAT_BGRA_5551 = 0xa,
\r
921 RGA2_FORMAT_BGRA_4444 = 0xb,
\r
923 RGA2_FORMAT_YCbCr_422_SP = 0x10,
\r
924 RGA2_FORMAT_YCbCr_422_P = 0x11,
\r
925 RGA2_FORMAT_YCbCr_420_SP = 0x12,
\r
926 RGA2_FORMAT_YCbCr_420_P = 0x13,
\r
927 RGA2_FORMAT_YCrCb_422_SP = 0x14,
\r
928 RGA2_FORMAT_YCrCb_422_P = 0x15,
\r
929 RGA2_FORMAT_YCrCb_420_SP = 0x16,
\r
930 RGA2_FORMAT_YCrCb_420_P = 0x17,*/
\r
933 case 0x0: *df = RGA2_FORMAT_RGBA_8888; break;
\r
934 case 0x1: *df = RGA2_FORMAT_RGBX_8888; break;
\r
935 case 0x2: *df = RGA2_FORMAT_RGB_888; break;
\r
936 case 0x3: *df = RGA2_FORMAT_BGRA_8888; break;
\r
937 case 0x4: *df = RGA2_FORMAT_RGB_565; break;
\r
938 case 0x5: *df = RGA2_FORMAT_RGBA_5551; break;
\r
939 case 0x6: *df = RGA2_FORMAT_RGBA_4444; break;
\r
940 case 0x7: *df = RGA2_FORMAT_BGR_888; break;
\r
941 case 0x8: *df = RGA2_FORMAT_YCbCr_422_SP; break;
\r
942 case 0x9: *df = RGA2_FORMAT_YCbCr_422_P; break;
\r
943 case 0xa: *df = RGA2_FORMAT_YCbCr_420_SP; break;
\r
944 case 0xb: *df = RGA2_FORMAT_YCbCr_420_P; break;
\r
945 case 0xc: *df = RGA2_FORMAT_YCrCb_422_SP; break;
\r
946 case 0xd: *df = RGA2_FORMAT_YCrCb_422_P; break;
\r
947 case 0xe: *df = RGA2_FORMAT_YCrCb_420_SP; break;
\r
948 case 0xf: *df = RGA2_FORMAT_YCrCb_420_P; break;
\r
952 void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
\r
954 u16 alpha_mode_0, alpha_mode_1;
\r
956 if (req_rga->render_mode == 6)
\r
957 req->render_mode = update_palette_table_mode;
\r
958 else if (req_rga->render_mode == 7)
\r
959 req->render_mode = update_patten_buff_mode;
\r
960 else if (req_rga->render_mode == 5)
\r
961 req->render_mode = bitblt_mode;
\r
963 req->render_mode = req_rga->render_mode;
\r
965 memcpy(&req->src, &req_rga->src, sizeof(req_rga->src));
\r
966 memcpy(&req->dst, &req_rga->dst, sizeof(req_rga->dst));
\r
967 memcpy(&req->pat, &req_rga->pat, sizeof(req_rga->pat));
\r
968 memcpy(&req->src1,&req_rga->pat, sizeof(req_rga->pat));
\r
970 format_name_convert(&req->src.format, req_rga->src.format);
\r
971 format_name_convert(&req->dst.format, req_rga->dst.format);
\r
973 if(req_rga->rotate_mode == 1) {
\r
974 if(req_rga->sina == 0 && req_rga->cosa == 65536) {
\r
976 req->rotate_mode = 0;
\r
978 else if (req_rga->sina == 65536 && req_rga->cosa == 0) {
\r
980 req->rotate_mode = 1;
\r
981 req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_h + 1;
\r
982 req->dst.act_w = req_rga->dst.act_h;
\r
983 req->dst.act_h = req_rga->dst.act_w;
\r
985 else if (req_rga->sina == 0 && req_rga->cosa == -65536) {
\r
987 req->rotate_mode = 2;
\r
988 req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_w + 1;
\r
989 req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_h + 1;
\r
991 else if (req_rga->sina == -65536 && req_rga->cosa == 0) {
\r
993 req->rotate_mode = 3;
\r
994 req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_w + 1;
\r
995 req->dst.act_w = req_rga->dst.act_h;
\r
996 req->dst.act_h = req_rga->dst.act_w;
\r
999 else if (req_rga->rotate_mode == 2)
\r
1003 else if (req_rga->rotate_mode == 3)
\r
1008 req->rotate_mode = 0;
\r
1011 req->LUT_addr = req_rga->LUT_addr;
\r
1012 req->rop_mask_addr = req_rga->rop_mask_addr;
\r
1014 req->bitblt_mode = req_rga->bsfilter_flag;
\r
1016 req->src_a_global_val = req_rga->alpha_global_value;
\r
1017 req->dst_a_global_val = 0;
\r
1018 req->rop_code = req_rga->rop_code;
\r
1019 req->rop_mode = 0;
\r
1021 req->color_fill_mode = req_rga->color_fill_mode;
\r
1022 req->color_key_min = req_rga->color_key_min;
\r
1023 req->color_key_max = req_rga->color_key_max;
\r
1025 req->fg_color = req_rga->fg_color;
\r
1026 req->bg_color = req_rga->bg_color;
\r
1027 memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));
\r
1029 req->palette_mode = req_rga->palette_mode;
\r
1030 req->yuv2rgb_mode = req_rga->yuv2rgb_mode + 1;
\r
1031 req->endian_mode = req_rga->endian_mode;
\r
1032 req->rgb2yuv_mode = 0;
\r
1034 req->fading_alpha_value = 0;
\r
1035 req->fading_r_value = req_rga->fading.r;
\r
1036 req->fading_g_value = req_rga->fading.g;
\r
1037 req->fading_b_value = req_rga->fading.b;
\r
1039 /* alpha mode set */
\r
1040 req->alpha_rop_flag = 0;
\r
1041 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag & 1))); // alpha_rop_enable
\r
1042 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 1) & 1) << 1); // rop_enable
\r
1043 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 2) & 1) << 2); // fading_enable
\r
1044 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 4) & 1) << 3); // alpha_cal_mode_sel
\r
1045 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 5) & 1) << 6); // dst_dither_down
\r
1046 req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 6) & 1) << 7); // gradient fill mode sel
\r
1048 if(((req_rga->alpha_rop_flag) & 1)) {
\r
1049 if((req_rga->alpha_rop_flag >> 3) & 1) {
\r
1050 /* porter duff alpha enable */
\r
1051 switch(req_rga->PD_mode)
\r
1055 case 1: //dst = src
\r
1057 case 2: //dst = dst
\r
1059 case 3: //dst = (256*sc + (256 - sa)*dc) >> 8
\r
1060 if((req_rga->alpha_rop_mode & 3) == 0) {
\r
1061 alpha_mode_0 = 0x3818;
\r
1062 alpha_mode_1 = 0x3818;
\r
1064 else if ((req_rga->alpha_rop_mode & 3) == 1) {
\r
1065 alpha_mode_0 = 0x381A;
\r
1066 alpha_mode_1 = 0x381A;
\r
1068 else if ((req_rga->alpha_rop_mode & 3) == 2) {
\r
1069 alpha_mode_0 = 0x381C;
\r
1070 alpha_mode_1 = 0x381C;
\r
1073 alpha_mode_0 = 0x381A;
\r
1074 alpha_mode_1 = 0x381A;
\r
1076 req->alpha_mode_0 = alpha_mode_0;
\r
1077 req->alpha_mode_1 = alpha_mode_1;
\r
1079 case 4: //dst = (sc*(256-da) + 256*dc) >> 8
\r
1081 case 5: //dst = (da*sc) >> 8
\r
1083 case 6: //dst = (sa*dc) >> 8
\r
1085 case 7: //dst = ((256-da)*sc) >> 8
\r
1087 case 8: //dst = ((256-sa)*dc) >> 8
\r
1089 case 9: //dst = (da*sc + (256-sa)*dc) >> 8
\r
1090 req->alpha_mode_0 = 0x3848;
\r
1091 req->alpha_mode_1 = 0x3848;
\r
1093 case 10://dst = ((256-da)*sc + (sa*dc)) >> 8
\r
1095 case 11://dst = ((256-da)*sc + (256-sa)*dc) >> 8;
\r
1102 if((req_rga->alpha_rop_mode & 3) == 0) {
\r
1103 req->alpha_mode_0 = 0x3848;
\r
1104 req->alpha_mode_1 = 0x3848;
\r
1106 else if ((req_rga->alpha_rop_mode & 3) == 1) {
\r
1107 req->alpha_mode_0 = 0x384A;
\r
1108 req->alpha_mode_1 = 0x384A;
\r
1110 else if ((req_rga->alpha_rop_mode & 3) == 2) {
\r
1111 req->alpha_mode_0 = 0x384C;
\r
1112 req->alpha_mode_1 = 0x384C;
\r
1117 if (req_rga->mmu_info.mmu_en && (req_rga->mmu_info.mmu_flag & 1) == 1) {
\r
1118 req->mmu_info.src0_mmu_flag = 1;
\r
1119 req->mmu_info.dst_mmu_flag = 1;
\r
1121 if (req_rga->mmu_info.mmu_flag >> 31) {
\r
1122 req->mmu_info.src0_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 8) & 1);
\r
1123 req->mmu_info.src1_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 9) & 1);
\r
1124 req->mmu_info.dst_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 10) & 1);
\r
1125 req->mmu_info.els_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 11) & 1);
\r
1128 if (req_rga->src.yrgb_addr >= 0xa0000000) {
\r
1129 req->mmu_info.src0_mmu_flag = 0;
\r
1130 req->src.yrgb_addr = req_rga->src.yrgb_addr - 0x60000000;
\r
1131 req->src.uv_addr = req_rga->src.uv_addr - 0x60000000;
\r
1132 req->src.v_addr = req_rga->src.v_addr - 0x60000000;
\r
1135 if (req_rga->dst.yrgb_addr >= 0xa0000000) {
\r
1136 req->mmu_info.dst_mmu_flag = 0;
\r
1137 req->dst.yrgb_addr = req_rga->dst.yrgb_addr - 0x60000000;
\r