d1a9db5dffb9ee9971cdb2ad40285b3c85d5c763
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / rga2 / rga2_reg_info.c
1 \r
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
15 #include <asm/io.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
31 \r
32 #include "rga2_reg_info.h"\r
33 #include "../rga/rga_type.h"\r
34 //#include "../rga/rga_rop.h"\r
35 #include "rga2.h"\r
36 \r
37 extern unsigned int ROP3_code[256];\r
38 \r
39 void\r
40 RGA2_reg_get_param(unsigned char *base, struct rga2_req *msg)\r
41 {\r
42     RK_U32 *bRGA_SRC_INFO;\r
43     RK_U32 *bRGA_SRC_X_FACTOR;\r
44     RK_U32 *bRGA_SRC_Y_FACTOR;\r
45     RK_U32 sw, sh;\r
46     RK_U32 dw, dh;\r
47     RK_U32 param_x, param_y;\r
48     RK_U8 x_flag, y_flag;\r
49 \r
50     RK_U32 reg;\r
51 \r
52     bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);\r
53     reg = *bRGA_SRC_INFO;\r
54 \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
57 \r
58     x_flag = y_flag = 0;\r
59 \r
60     if(((msg->rotate_mode & 0x3) == 1) || ((msg->rotate_mode & 0x3) == 3))\r
61     {\r
62         dw = msg->dst.act_h;\r
63         dh = msg->dst.act_w;\r
64     }\r
65     else\r
66     {\r
67         dw = msg->dst.act_w;\r
68         dh = msg->dst.act_h;\r
69     }\r
70 \r
71     sw = msg->src.act_w;\r
72     sh = msg->src.act_h;\r
73 \r
74     if (sw > dw)\r
75     {\r
76         x_flag = 1;\r
77         #if SCALE_DOWN_LARGE\r
78         param_x = ((dw) << 16) / (sw) + 1;\r
79                 #else\r
80         param_x = ((dw) << 16) / (sw);\r
81         #endif\r
82         *bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 0 );\r
83     }\r
84     else if (sw < dw)\r
85     {\r
86         x_flag = 2;\r
87         #if 1//SCALE_MINUS1\r
88         param_x = ((sw - 1) << 16) / (dw - 1);\r
89         #else\r
90         param_x = ((sw) << 16) / (dw);\r
91                 #endif\r
92         *bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 16);\r
93     }\r
94     else\r
95     {\r
96         *bRGA_SRC_X_FACTOR = 0;//((1 << 14) << 16) | (1 << 14);\r
97     }\r
98 \r
99     if (sh > dh)\r
100     {\r
101         y_flag = 1;\r
102         #if SCALE_DOWN_LARGE\r
103         param_y = ((dh) << 16) / (sh) + 1;\r
104                 #else\r
105         param_y = ((dh) << 16) / (sh);\r
106         #endif\r
107         *bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 0 );\r
108     }\r
109     else if (sh < dh)\r
110     {\r
111         y_flag = 2;\r
112         #if 1//SCALE_MINUS1\r
113         param_y = ((sh - 1) << 16) / (dh - 1);\r
114         #else\r
115         param_y = ((sh) << 16) / (dh);\r
116                 #endif\r
117         *bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 16);\r
118     }\r
119     else\r
120     {\r
121         *bRGA_SRC_Y_FACTOR = 0;//((1 << 14) << 16) | (1 << 14);\r
122     }\r
123 \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
126 }\r
127 \r
128 void\r
129 RGA2_set_mode_ctrl(u8 *base, struct rga2_req *msg)\r
130 {\r
131     RK_U32 *bRGA_MODE_CTL;\r
132     RK_U32 reg = 0;\r
133     RK_U32 render_mode = msg->render_mode;\r
134 \r
135     bRGA_MODE_CTL = (u32 *)(base + RGA2_MODE_CTRL_OFFSET);\r
136 \r
137     if(msg->render_mode == 4)\r
138     {\r
139         render_mode = 3;\r
140     }\r
141 \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
148 \r
149     *bRGA_MODE_CTL = reg;\r
150 }\r
151 \r
152 void\r
153 RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)\r
154 {\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
161 \r
162     RK_U32 reg = 0;\r
163     RK_U8 src0_format = 0;\r
164 \r
165     RK_U8 src0_rb_swp = 0;\r
166     RK_U8 src0_rgb_pack = 0;\r
167 \r
168     RK_U8 src0_cbcr_swp = 0;\r
169     RK_U8 pixel_width = 1;\r
170     RK_U32 stride = 0;\r
171     RK_U32 uv_stride = 0;\r
172     RK_U32 mask_stride = 0;\r
173     RK_U32 ydiv = 1, xdiv = 2;\r
174     RK_U8  yuv10 = 0;\r
175 \r
176     RK_U32 sw, sh;\r
177     RK_U32 dw, dh;\r
178     RK_U8 rotate_mode;\r
179     RK_U8 scale_w_flag, scale_h_flag;\r
180 \r
181     bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);\r
182 \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
186 \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
189 \r
190     bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);\r
191 \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
194 \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
201     }\r
202 \r
203     {\r
204         rotate_mode = msg->rotate_mode & 0x3;\r
205 \r
206         sw = msg->src.act_w;\r
207         sh = msg->src.act_h;\r
208 \r
209         if((rotate_mode == 1) | (rotate_mode == 3))\r
210         {\r
211             dw = msg->dst.act_h;\r
212             dh = msg->dst.act_w;\r
213         }\r
214         else\r
215         {\r
216             dw = msg->dst.act_w;\r
217             dh = msg->dst.act_h;\r
218         }\r
219 \r
220         if(sw > dw)\r
221             scale_w_flag = 1;\r
222         else if (sw < dw)\r
223             scale_w_flag = 2;\r
224         else {\r
225             scale_w_flag = 0;\r
226             if(msg->rotate_mode >> 6)\r
227                 scale_w_flag = 3;\r
228         }\r
229 \r
230         if(sh > dh)\r
231             scale_h_flag = 1;\r
232         else if (sh < dh)\r
233             scale_h_flag = 2;\r
234         else {\r
235             scale_h_flag = 0;\r
236             if(msg->rotate_mode >> 6)\r
237                 scale_h_flag = 3;\r
238         }\r
239     }\r
240 \r
241     switch (msg->src.format)\r
242     {\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
255 \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
266     };\r
267 \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
274     else\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
277         else\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
279 \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
292 \r
293     stride = (((msg->src.vir_w * pixel_width) + 3) & ~3) >> 2;\r
294     uv_stride = ((msg->src.vir_w / xdiv + 3) & ~3);\r
295 \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
299 \r
300     //mask_stride = ((msg->src0_act.width + 31) & ~31) >> 5;\r
301     mask_stride = msg->rop_mask_stride;\r
302 \r
303     *bRGA_SRC_VIR_INFO = stride | (mask_stride << 16);\r
304 \r
305     *bRGA_SRC_ACT_INFO = (msg->src.act_w - 1) | ((msg->src.act_h - 1) << 16);\r
306 \r
307     *bRGA_MASK_ADDR = (RK_U32)msg->rop_mask_addr;\r
308 \r
309     *bRGA_SRC_INFO = reg;\r
310 \r
311         *bRGA_SRC_TR_COLOR0 = msg->color_key_min;\r
312     *bRGA_SRC_TR_COLOR1 = msg->color_key_max;\r
313 }\r
314 \r
315 \r
316 void\r
317 RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)\r
318 {\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
323 \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
331     RK_U32 reg = 0;\r
332     RK_U8 spw, dpw;\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
340 \r
341     RK_U32 s_y_lt_addr, s_y_ld_addr, s_y_rt_addr, s_y_rd_addr;\r
342 \r
343     dpw = 1;\r
344     x_div = y_div = 1;\r
345 \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
350 \r
351     bRGA_SRC_BASE3 = (RK_U32 *)(base + RGA2_SRC_BASE3_OFFSET);\r
352 \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
355 \r
356     switch (msg->src1.format)\r
357     {\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
371     };\r
372 \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
376 \r
377 \r
378     switch (msg->dst.format)\r
379     {\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
392 \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
401     };\r
402 \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
407 \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
413 \r
414 \r
415     *bRGA_DST_INFO = reg;\r
416 \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
420 \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
423     s_stride <<= 2;\r
424         d_stride <<= 2;\r
425 \r
426     if(((msg->rotate_mode & 0xf) == 0) || ((msg->rotate_mode & 0xf) == 1))\r
427     {\r
428         x_mirr = 0;\r
429         y_mirr = 0;\r
430     }\r
431     else\r
432     {\r
433         x_mirr = 1;\r
434         y_mirr = 1;\r
435     }\r
436 \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
440 \r
441     yrgb_addr = (RK_U32)msg->src1.yrgb_addr + (msg->src1.y_offset * s_stride) + (msg->src1.x_offset * spw);\r
442 \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
447 \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
451 \r
452     y_lt_addr = yrgb_addr;\r
453     u_lt_addr = u_addr;\r
454     v_lt_addr = v_addr;\r
455 \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
459 \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
463 \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
467 \r
468     if(rot_90_flag == 0)\r
469     {\r
470         if(y_mirr == 1)\r
471         {\r
472             if(x_mirr == 1)\r
473             {\r
474                 yrgb_addr = y_rd_addr;\r
475                 u_addr = u_rd_addr;\r
476                 v_addr = v_rd_addr;\r
477 \r
478                 s_yrgb_addr = s_y_rd_addr;\r
479             }\r
480             else\r
481             {\r
482                 yrgb_addr = y_ld_addr;\r
483                 u_addr = u_ld_addr;\r
484                 v_addr = v_ld_addr;\r
485 \r
486                 s_yrgb_addr = s_y_ld_addr;\r
487             }\r
488         }\r
489         else\r
490         {\r
491             if(x_mirr == 1)\r
492             {\r
493                 yrgb_addr = y_rt_addr;\r
494                 u_addr = u_rt_addr;\r
495                 v_addr = v_rt_addr;\r
496 \r
497                 s_yrgb_addr = s_y_rt_addr;\r
498             }\r
499             else\r
500             {\r
501                 yrgb_addr = y_lt_addr;\r
502                 u_addr = u_lt_addr;\r
503                 v_addr = v_lt_addr;\r
504 \r
505                 s_yrgb_addr = s_y_lt_addr;\r
506             }\r
507         }\r
508     }\r
509     else\r
510     {\r
511         if(y_mirr == 1)\r
512         {\r
513             if(x_mirr == 1)\r
514             {\r
515                 yrgb_addr = y_ld_addr;\r
516                 u_addr = u_ld_addr;\r
517                 v_addr = v_ld_addr;\r
518 \r
519                 s_yrgb_addr = s_y_ld_addr;\r
520             }\r
521             else\r
522             {\r
523                 yrgb_addr = y_rd_addr;\r
524                 u_addr = u_rd_addr;\r
525                 v_addr = v_rd_addr;\r
526 \r
527                 s_yrgb_addr = s_y_rd_addr;\r
528             }\r
529         }\r
530         else\r
531         {\r
532             if(x_mirr == 1)\r
533             {\r
534                 yrgb_addr = y_lt_addr;\r
535                 u_addr = u_lt_addr;\r
536                 v_addr = v_lt_addr;\r
537 \r
538                 s_yrgb_addr = s_y_lt_addr;\r
539             }\r
540             else\r
541             {\r
542                 yrgb_addr = y_rt_addr;\r
543                 u_addr = u_rt_addr;\r
544                 v_addr = v_rt_addr;\r
545 \r
546                 s_yrgb_addr = s_y_rt_addr;\r
547             }\r
548         }\r
549     }\r
550 \r
551     *bRGA_DST_BASE0 = (RK_U32)yrgb_addr;\r
552 \r
553     if((msg->dst.format == RGA2_FORMAT_YCbCr_420_P) || (msg->dst.format == RGA2_FORMAT_YCrCb_420_P))\r
554     {\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
558         }\r
559         else {\r
560             *bRGA_DST_BASE1 = (RK_U32)u_addr;\r
561             *bRGA_DST_BASE2 = (RK_U32)v_addr;\r
562         }\r
563     }\r
564     else {\r
565         *bRGA_DST_BASE1 = (RK_U32)u_addr;\r
566         *bRGA_DST_BASE2 = (RK_U32)v_addr;\r
567     }\r
568 \r
569     *bRGA_SRC_BASE3 = (RK_U32)s_y_lt_addr;\r
570 }\r
571 \r
572 void\r
573 RGA2_set_reg_alpha_info(u8 *base, struct rga2_req *msg)\r
574 {\r
575     RK_U32 *bRGA_ALPHA_CTRL0;\r
576     RK_U32 *bRGA_ALPHA_CTRL1;\r
577     RK_U32 *bRGA_FADING_CTRL;\r
578     RK_U32 reg0 = 0;\r
579     RK_U32 reg1 = 0;\r
580 \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
584 \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
590 \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
601 \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
610 \r
611     *bRGA_ALPHA_CTRL0 = reg0;\r
612     *bRGA_ALPHA_CTRL1 = reg1;\r
613 \r
614     if((msg->alpha_rop_flag>>2)&1)\r
615     {\r
616         *bRGA_FADING_CTRL = (1<<24) | (msg->fading_b_value<<16) | (msg->fading_g_value<<8) | (msg->fading_r_value);\r
617     }\r
618 }\r
619 \r
620 void\r
621 RGA2_set_reg_rop_info(u8 *base, struct rga2_req *msg)\r
622 {\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
629 \r
630     RK_U32 rop_code0 = 0;\r
631     RK_U32 rop_code1 = 0;\r
632 \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
639 \r
640     if(msg->rop_mode == 0) {\r
641         rop_code0 =  ROP3_code[(msg->rop_code & 0xff)];\r
642     }\r
643     else if(msg->rop_mode == 1) {\r
644         rop_code0 =  ROP3_code[(msg->rop_code & 0xff)];\r
645     }\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
649     }\r
650 \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
658 \r
659 }\r
660 \r
661 \r
662 \r
663 void\r
664 RGA2_set_reg_color_palette(RK_U8 *base, struct rga2_req *msg)\r
665 {\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
667     RK_U32  *p;\r
668     RK_S16  x_off, y_off;\r
669     RK_U16  src_stride;\r
670     RK_U8   shift;\r
671     RK_U32  sw;\r
672     RK_U32  byte_num;\r
673     RK_U32 reg;\r
674 \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
681 \r
682     reg = 0;\r
683 \r
684     shift = 3 - msg->palette_mode;\r
685 \r
686     x_off = msg->src.x_offset;\r
687     y_off = msg->src.y_offset;\r
688 \r
689     sw = msg->src.vir_w;\r
690     byte_num = sw >> shift;\r
691 \r
692     src_stride = (byte_num + 3) & (~3);\r
693 \r
694     p = (RK_U32 *)((unsigned long)msg->src.yrgb_addr);\r
695 \r
696     #if 0\r
697     if(endian_mode)\r
698     {\r
699         p = p + (x_off>>shift) + y_off*src_stride;\r
700     }\r
701     else\r
702     {\r
703         p = p + (((x_off>>shift)>>2)<<2) + (3 - ((x_off>>shift) & 3)) + y_off*src_stride;\r
704     }\r
705     #endif\r
706 \r
707     p = p + (x_off>>shift) + y_off*src_stride;\r
708 \r
709 \r
710     *bRGA_SRC_BASE0 = (unsigned long)p;\r
711 \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
717 \r
718     *bRGA_SRC_FG_COLOR = msg->fg_color;\r
719     *bRGA_SRC_BG_COLOR = msg->bg_color;\r
720 \r
721 }\r
722 \r
723 void\r
724 RGA2_set_reg_color_fill(u8 *base, struct rga2_req *msg)\r
725 {\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
733 \r
734     RK_U32 mask_stride;\r
735     RK_U32 *bRGA_SRC_VIR_INFO;\r
736 \r
737     bRGA_SRC_FG_COLOR = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);\r
738 \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
743 \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
746 \r
747     bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);\r
748 \r
749     mask_stride = msg->rop_mask_stride;\r
750 \r
751     if(msg->color_fill_mode == 0)\r
752     {\r
753         /* solid color */\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
758 \r
759         *bRGA_SRC_FG_COLOR = msg->fg_color;\r
760     }\r
761     else\r
762     {\r
763         /* patten 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
767     }\r
768         *bRGA_SRC_VIR_INFO = mask_stride << 16;\r
769 }\r
770 \r
771 \r
772 void\r
773 RGA2_set_reg_update_palette_table(RK_U8 *base, struct rga2_req *msg)\r
774 {\r
775     RK_U32 *bRGA_MASK_BASE;\r
776     RK_U32 *bRGA_FADING_CTRL;\r
777 \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
780 \r
781     *bRGA_FADING_CTRL = msg->fading_g_value << 8;\r
782     *bRGA_MASK_BASE = (RK_U32)msg->pat.yrgb_addr;\r
783 }\r
784 \r
785 \r
786 void\r
787 RGA2_set_reg_update_patten_buff(RK_U8 *base, struct rga2_req *msg)\r
788 {\r
789     u32 *bRGA_PAT_MST;\r
790     u32 *bRGA_PAT_CON;\r
791     u32 *bRGA_PAT_START_POINT;\r
792     RK_U32 *bRGA_FADING_CTRL;\r
793     u32 reg = 0;\r
794     rga_img_info_t *pat;\r
795 \r
796     RK_U32 num, offset;\r
797 \r
798     pat = &msg->pat;\r
799 \r
800     num = (pat->act_w * pat->act_h) - 1;\r
801 \r
802     offset = pat->act_w * pat->y_offset + pat->x_offset;\r
803 \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
808 \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
811 \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
814 \r
815     *bRGA_FADING_CTRL = (num << 8) | offset;\r
816 }\r
817 \r
818 \r
819 void\r
820 RGA2_set_pat_info(RK_U8 *base, struct rga2_req *msg)\r
821 {\r
822     u32 *bRGA_PAT_CON;\r
823     u32 *bRGA_FADING_CTRL;\r
824     u32 reg = 0;\r
825     rga_img_info_t *pat;\r
826 \r
827     RK_U32 num, offset;\r
828 \r
829     pat = &msg->pat;\r
830 \r
831     num = ((pat->act_w * pat->act_h) - 1) & 0xff;\r
832 \r
833     offset = (pat->act_w * pat->y_offset) + pat->x_offset;\r
834 \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
837 \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
841 }\r
842 \r
843 \r
844 void\r
845 RGA2_set_mmu_info(RK_U8 *base, struct rga2_req *msg)\r
846 {\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
852 \r
853     RK_U32 reg;\r
854 \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
860 \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
863 \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
869 }\r
870 \r
871 \r
872 int\r
873 RGA2_gen_reg_info(RK_U8 *base , struct rga2_req *msg)\r
874 {\r
875 \r
876     RGA2_set_mode_ctrl(base, msg);\r
877 \r
878     RGA2_set_pat_info(base, msg);\r
879 \r
880     switch(msg->render_mode)\r
881     {\r
882         case bitblt_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
887             break;\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
892             break;\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
896             break;\r
897         case update_palette_table_mode :\r
898             RGA2_set_reg_update_palette_table(base, msg);\r
899             break;\r
900         case update_patten_buff_mode :\r
901             RGA2_set_reg_update_patten_buff(base, msg);\r
902             break;\r
903         default :\r
904             printk("RGA2 ERROR msg render mode %d \n", msg->render_mode);\r
905             break;\r
906 \r
907     }\r
908 \r
909     RGA2_set_mmu_info(base, msg);\r
910 \r
911     return 0;\r
912 \r
913 }\r
914 \r
915 void format_name_convert(uint32_t *df, uint32_t sf)\r
916 {\r
917     /*\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
926 \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
931 \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
936 \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
949 \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
958     switch(sf)\r
959     {\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
976 \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
979     }\r
980 }\r
981 \r
982 void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)\r
983 {\r
984     u16 alpha_mode_0, alpha_mode_1;\r
985 \r
986     if (req_rga->render_mode == 6)\r
987         req->render_mode = update_palette_table_mode;\r
988     else if (req_rga->render_mode == 7)\r
989         req->render_mode = update_patten_buff_mode;\r
990     else if (req_rga->render_mode == 5)\r
991         req->render_mode = bitblt_mode;\r
992     else\r
993         req->render_mode = req_rga->render_mode;\r
994 \r
995     memcpy(&req->src, &req_rga->src, sizeof(req_rga->src));\r
996     memcpy(&req->dst, &req_rga->dst, sizeof(req_rga->dst));\r
997     memcpy(&req->pat, &req_rga->pat, sizeof(req_rga->pat));\r
998     memcpy(&req->src1,&req_rga->pat, sizeof(req_rga->pat));\r
999 \r
1000     format_name_convert(&req->src.format, req_rga->src.format);\r
1001     format_name_convert(&req->dst.format, req_rga->dst.format);\r
1002 \r
1003     if(req_rga->rotate_mode == 1) {\r
1004         if(req_rga->sina == 0 && req_rga->cosa == 65536) {\r
1005             /* rotate 0 */\r
1006             req->rotate_mode = 0;\r
1007         }\r
1008         else if (req_rga->sina == 65536 && req_rga->cosa == 0) {\r
1009             /* rotate 90 */\r
1010             req->rotate_mode = 1;\r
1011             req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_h + 1;\r
1012             req->dst.act_w = req_rga->dst.act_h;\r
1013             req->dst.act_h = req_rga->dst.act_w;\r
1014         }\r
1015         else if (req_rga->sina == 0 && req_rga->cosa == -65536) {\r
1016             /* rotate 180 */\r
1017             req->rotate_mode = 2;\r
1018             req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_w + 1;\r
1019             req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_h + 1;\r
1020         }\r
1021         else if (req_rga->sina == -65536 && req_rga->cosa == 0) {\r
1022             /* totate 270 */\r
1023             req->rotate_mode = 3;\r
1024             req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_w + 1;\r
1025             req->dst.act_w = req_rga->dst.act_h;\r
1026             req->dst.act_h = req_rga->dst.act_w;\r
1027         }\r
1028     }\r
1029     else if (req_rga->rotate_mode == 2)\r
1030     {\r
1031         //x_mirror\r
1032         req->rotate_mode |= (1 << 4);\r
1033     }\r
1034     else if (req_rga->rotate_mode == 3)\r
1035     {\r
1036         //y_mirror\r
1037         req->rotate_mode |= (2 << 4);\r
1038     }\r
1039     else {\r
1040         req->rotate_mode = 0;\r
1041     }\r
1042 \r
1043     if((req->dst.act_w > 2048) && (req->src.act_h < req->dst.act_h))\r
1044         req->scale_bicu_mode |= (1<<4);\r
1045 \r
1046     req->LUT_addr = req_rga->LUT_addr;\r
1047     req->rop_mask_addr = req_rga->rop_mask_addr;\r
1048 \r
1049     req->bitblt_mode = req_rga->bsfilter_flag;\r
1050 \r
1051     req->src_a_global_val = req_rga->alpha_global_value;\r
1052     req->dst_a_global_val = req_rga->alpha_global_value;\r
1053     req->rop_code = req_rga->rop_code;\r
1054     req->rop_mode = 0;\r
1055 \r
1056     req->color_fill_mode = req_rga->color_fill_mode;\r
1057     req->color_key_min   = req_rga->color_key_min;\r
1058     req->color_key_max   = req_rga->color_key_max;\r
1059 \r
1060     req->fg_color = req_rga->fg_color;\r
1061     req->bg_color = req_rga->bg_color;\r
1062     memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));\r
1063 \r
1064     req->palette_mode = req_rga->palette_mode;\r
1065     req->yuv2rgb_mode = req_rga->yuv2rgb_mode + 1;\r
1066     req->endian_mode = req_rga->endian_mode;\r
1067     req->rgb2yuv_mode = 0;\r
1068 \r
1069     req->fading_alpha_value = 0;\r
1070     req->fading_r_value = req_rga->fading.r;\r
1071     req->fading_g_value = req_rga->fading.g;\r
1072     req->fading_b_value = req_rga->fading.b;\r
1073 \r
1074     /* alpha mode set */\r
1075     req->alpha_rop_flag = 0;\r
1076     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag & 1)));           // alpha_rop_enable\r
1077     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 1) & 1) << 1); // rop_enable\r
1078     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 2) & 1) << 2); // fading_enable\r
1079     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 4) & 1) << 3); // alpha_cal_mode_sel\r
1080     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 5) & 1) << 6); // dst_dither_down\r
1081     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 6) & 1) << 7); // gradient fill mode sel\r
1082 \r
1083     if (((req_rga->alpha_rop_flag) & 1)) {\r
1084         if ((req_rga->alpha_rop_flag >> 3) & 1) {\r
1085             /* porter duff alpha enable */\r
1086             switch (req_rga->PD_mode)\r
1087             {\r
1088                 case 0: //dst = 0\r
1089                     break;\r
1090                 case 1: //dst = src\r
1091                     break;\r
1092                 case 2: //dst = dst\r
1093                     break;\r
1094                 case 3: //dst = (256*sc + (256 - sa)*dc) >> 8\r
1095                     if((req_rga->alpha_rop_mode & 3) == 0) {\r
1096                         alpha_mode_0 = 0x3818;\r
1097                         alpha_mode_1 = 0x3818;\r
1098                     }\r
1099                     else if ((req_rga->alpha_rop_mode & 3) == 1) {\r
1100                         alpha_mode_0 = 0x381A;\r
1101                         alpha_mode_1 = 0x381A;\r
1102                     }\r
1103                     else if ((req_rga->alpha_rop_mode & 3) == 2) {\r
1104                         alpha_mode_0 = 0x381C;\r
1105                         alpha_mode_1 = 0x381C;\r
1106                     }\r
1107                     else {\r
1108                         alpha_mode_0 = 0x381A;\r
1109                         alpha_mode_1 = 0x381A;\r
1110                     }\r
1111                     req->alpha_mode_0 = alpha_mode_0;\r
1112                     req->alpha_mode_1 = alpha_mode_1;\r
1113                     break;\r
1114                 case 4: //dst = (sc*(256-da) + 256*dc) >> 8\r
1115                     break;\r
1116                 case 5: //dst = (da*sc) >> 8\r
1117                     break;\r
1118                 case 6: //dst = (sa*dc) >> 8\r
1119                     break;\r
1120                 case 7: //dst = ((256-da)*sc) >> 8\r
1121                     break;\r
1122                 case 8: //dst = ((256-sa)*dc) >> 8\r
1123                     break;\r
1124                 case 9: //dst = (da*sc + (256-sa)*dc) >> 8\r
1125                     req->alpha_mode_0 = 0x3848;\r
1126                     req->alpha_mode_1 = 0x3848;\r
1127                     break;\r
1128                 case 10://dst = ((256-da)*sc + (sa*dc)) >> 8\r
1129                     break;\r
1130                 case 11://dst = ((256-da)*sc + (256-sa)*dc) >> 8;\r
1131                     break;\r
1132                 case 12:\r
1133                     req->alpha_mode_0 = 0x0010;\r
1134                     req->alpha_mode_1 = 0x0820;\r
1135                     break;\r
1136                 default:\r
1137                     break;\r
1138             }\r
1139         }\r
1140         else {\r
1141             if((req_rga->alpha_rop_mode & 3) == 0) {\r
1142                 req->alpha_mode_0 = 0x3848;\r
1143                 req->alpha_mode_1 = 0x3848;\r
1144             }\r
1145             else if ((req_rga->alpha_rop_mode & 3) == 1) {\r
1146                 req->alpha_mode_0 = 0x483A;\r
1147                 req->alpha_mode_1 = 0x483A;\r
1148             }\r
1149             else if ((req_rga->alpha_rop_mode & 3) == 2) {\r
1150                 req->alpha_mode_0 = 0x384C;\r
1151                 req->alpha_mode_1 = 0x384C;\r
1152             }\r
1153         }\r
1154     }\r
1155 \r
1156     if (req_rga->mmu_info.mmu_en && (req_rga->mmu_info.mmu_flag & 1) == 1) {\r
1157         req->mmu_info.src0_mmu_flag = 1;\r
1158         req->mmu_info.dst_mmu_flag = 1;\r
1159 \r
1160         if (req_rga->mmu_info.mmu_flag >> 31) {\r
1161             req->mmu_info.src0_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 8)  & 1);\r
1162             req->mmu_info.src1_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 9)  & 1);\r
1163             req->mmu_info.dst_mmu_flag  = ((req_rga->mmu_info.mmu_flag >> 10) & 1);\r
1164             req->mmu_info.els_mmu_flag  = ((req_rga->mmu_info.mmu_flag >> 11) & 1);\r
1165         }\r
1166         else {\r
1167             if (req_rga->src.yrgb_addr >= 0xa0000000) {\r
1168                req->mmu_info.src0_mmu_flag = 0;\r
1169                req->src.yrgb_addr = req_rga->src.yrgb_addr - 0x60000000;\r
1170                req->src.uv_addr   = req_rga->src.uv_addr - 0x60000000;\r
1171                req->src.v_addr    = req_rga->src.v_addr - 0x60000000;\r
1172             }\r
1173 \r
1174             if (req_rga->dst.yrgb_addr >= 0xa0000000) {\r
1175                req->mmu_info.dst_mmu_flag = 0;\r
1176                req->dst.yrgb_addr = req_rga->dst.yrgb_addr - 0x60000000;\r
1177             }\r
1178         }\r
1179     }\r
1180 }\r
1181 \r
1182 void memcpy_img_info(struct rga_img_info_t *dst, struct rga_img_info_32_t *src)\r
1183 {\r
1184     dst->yrgb_addr = src->yrgb_addr;      /* yrgb    mem addr         */\r
1185     dst->uv_addr = src->uv_addr;        /* cb/cr   mem addr         */\r
1186     dst->v_addr = src->v_addr;         /* cr      mem addr         */\r
1187     dst->format = src->format;         //definition by RK_FORMAT\r
1188 \r
1189     dst->act_w = src->act_w;\r
1190     dst->act_h = src->act_h;\r
1191     dst->x_offset = src->x_offset;\r
1192     dst->y_offset = src->y_offset;\r
1193 \r
1194     dst->vir_w = src->vir_w;\r
1195     dst->vir_h = src->vir_h;\r
1196     dst->endian_mode = src->endian_mode; //for BPP\r
1197     dst->alpha_swap = src->alpha_swap;\r
1198 }\r
1199 void RGA_MSG_2_RGA2_MSG_32(struct rga_req_32 *req_rga, struct rga2_req *req)\r
1200 {\r
1201     u16 alpha_mode_0, alpha_mode_1;\r
1202     if (req_rga->render_mode == 6)\r
1203         req->render_mode = update_palette_table_mode;\r
1204     else if (req_rga->render_mode == 7)\r
1205         req->render_mode = update_patten_buff_mode;\r
1206     else if (req_rga->render_mode == 5)\r
1207         req->render_mode = bitblt_mode;\r
1208     else\r
1209         req->render_mode = req_rga->render_mode;\r
1210     memcpy_img_info(&req->src, &req_rga->src);\r
1211     memcpy_img_info(&req->dst, &req_rga->dst);\r
1212     memcpy_img_info(&req->pat, &req_rga->pat);\r
1213     memcpy_img_info(&req->src1,&req_rga->pat);\r
1214     format_name_convert(&req->src.format, req_rga->src.format);\r
1215     format_name_convert(&req->dst.format, req_rga->dst.format);\r
1216     if(req_rga->rotate_mode == 1) {\r
1217         if(req_rga->sina == 0 && req_rga->cosa == 65536) {\r
1218             req->rotate_mode = 0;\r
1219         }\r
1220         else if (req_rga->sina == 65536 && req_rga->cosa == 0) {\r
1221             req->rotate_mode = 1;\r
1222             req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_h + 1;\r
1223             req->dst.act_w = req_rga->dst.act_h;\r
1224             req->dst.act_h = req_rga->dst.act_w;\r
1225         }\r
1226         else if (req_rga->sina == 0 && req_rga->cosa == -65536) {\r
1227             req->rotate_mode = 2;\r
1228             req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_w + 1;\r
1229             req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_h + 1;\r
1230         }\r
1231         else if (req_rga->sina == -65536 && req_rga->cosa == 0) {\r
1232             req->rotate_mode = 3;\r
1233             req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_w + 1;\r
1234             req->dst.act_w = req_rga->dst.act_h;\r
1235             req->dst.act_h = req_rga->dst.act_w;\r
1236         }\r
1237     }\r
1238     else if (req_rga->rotate_mode == 2)\r
1239     {\r
1240         req->rotate_mode = (1 << 4);\r
1241     }\r
1242     else if (req_rga->rotate_mode == 3)\r
1243     {\r
1244         req->rotate_mode = (2 << 4);\r
1245     }\r
1246     else {\r
1247         req->rotate_mode = 0;\r
1248     }\r
1249     if((req->dst.act_w > 2048) && (req->src.act_h < req->dst.act_h))\r
1250         req->scale_bicu_mode |= (1<<4);\r
1251     req->LUT_addr = req_rga->LUT_addr;\r
1252     req->rop_mask_addr = req_rga->rop_mask_addr;\r
1253     req->bitblt_mode = req_rga->bsfilter_flag;\r
1254     req->src_a_global_val = req_rga->alpha_global_value;\r
1255     req->dst_a_global_val = req_rga->alpha_global_value;\r
1256     req->rop_code = req_rga->rop_code;\r
1257     req->rop_mode = 0;\r
1258     req->color_fill_mode = req_rga->color_fill_mode;\r
1259     req->color_key_min   = req_rga->color_key_min;\r
1260     req->color_key_max   = req_rga->color_key_max;\r
1261     req->fg_color = req_rga->fg_color;\r
1262     req->bg_color = req_rga->bg_color;\r
1263     memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));\r
1264     req->palette_mode = req_rga->palette_mode;\r
1265     req->yuv2rgb_mode = req_rga->yuv2rgb_mode + 1;\r
1266     req->endian_mode = req_rga->endian_mode;\r
1267     req->rgb2yuv_mode = 0;\r
1268     req->fading_alpha_value = 0;\r
1269     req->fading_r_value = req_rga->fading.r;\r
1270     req->fading_g_value = req_rga->fading.g;\r
1271     req->fading_b_value = req_rga->fading.b;\r
1272     req->alpha_rop_flag = 0;\r
1273     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag & 1)));           // alpha_rop_enable\r
1274     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 1) & 1) << 1); // rop_enable\r
1275     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 2) & 1) << 2); // fading_enable\r
1276     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 4) & 1) << 3); // alpha_cal_mode_sel\r
1277     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 5) & 1) << 6); // dst_dither_down\r
1278     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 6) & 1) << 7); // gradient fill mode sel\r
1279     if(((req_rga->alpha_rop_flag) & 1)) {\r
1280         if((req_rga->alpha_rop_flag >> 3) & 1) {\r
1281             switch(req_rga->PD_mode)\r
1282             {\r
1283                 case 0: //dst = 0\r
1284                     break;\r
1285                 case 1: //dst = src\r
1286                     break;\r
1287                 case 2: //dst = dst\r
1288                     break;\r
1289                 case 3: //dst = (256*sc + (256 - sa)*dc) >> 8\r
1290                     if((req_rga->alpha_rop_mode & 3) == 0) {\r
1291                         alpha_mode_0 = 0x3818;\r
1292                         alpha_mode_1 = 0x3818;\r
1293                     }\r
1294                     else if ((req_rga->alpha_rop_mode & 3) == 1) {\r
1295                         alpha_mode_0 = 0x381A;\r
1296                         alpha_mode_1 = 0x381A;\r
1297                     }\r
1298                     else if ((req_rga->alpha_rop_mode & 3) == 2) {\r
1299                         alpha_mode_0 = 0x381C;\r
1300                         alpha_mode_1 = 0x381C;\r
1301                     }\r
1302                     else {\r
1303                         alpha_mode_0 = 0x381A;\r
1304                         alpha_mode_1 = 0x381A;\r
1305                     }\r
1306                     req->alpha_mode_0 = alpha_mode_0;\r
1307                     req->alpha_mode_1 = alpha_mode_1;\r
1308                     break;\r
1309                 case 4: //dst = (sc*(256-da) + 256*dc) >> 8\r
1310                     break;\r
1311                 case 5: //dst = (da*sc) >> 8\r
1312                     break;\r
1313                 case 6: //dst = (sa*dc) >> 8\r
1314                     break;\r
1315                 case 7: //dst = ((256-da)*sc) >> 8\r
1316                     break;\r
1317                 case 8: //dst = ((256-sa)*dc) >> 8\r
1318                     break;\r
1319                 case 9: //dst = (da*sc + (256-sa)*dc) >> 8\r
1320                     req->alpha_mode_0 = 0x3848;\r
1321                     req->alpha_mode_1 = 0x3848;\r
1322                     break;\r
1323                 case 10://dst = ((256-da)*sc + (sa*dc)) >> 8\r
1324                     break;\r
1325                 case 11://dst = ((256-da)*sc + (256-sa)*dc) >> 8;\r
1326                     break;\r
1327                 case 12:\r
1328                     req->alpha_mode_0 = 0x0010;\r
1329                     req->alpha_mode_1 = 0x0820;\r
1330                     break;\r
1331                 default:\r
1332                     break;\r
1333             }\r
1334         }\r
1335         else {\r
1336             if((req_rga->alpha_rop_mode & 3) == 0) {\r
1337                 req->alpha_mode_0 = 0x3848;\r
1338                 req->alpha_mode_1 = 0x3848;\r
1339             }\r
1340             else if ((req_rga->alpha_rop_mode & 3) == 1) {\r
1341                 req->alpha_mode_0 = 0x483A;\r
1342                 req->alpha_mode_1 = 0x483A;\r
1343             }\r
1344             else if ((req_rga->alpha_rop_mode & 3) == 2) {\r
1345                 req->alpha_mode_0 = 0x384C;\r
1346                 req->alpha_mode_1 = 0x384C;\r
1347             }\r
1348         }\r
1349     }\r
1350     if (req_rga->mmu_info.mmu_en && (req_rga->mmu_info.mmu_flag & 1) == 1) {\r
1351         req->mmu_info.src0_mmu_flag = 1;\r
1352         req->mmu_info.dst_mmu_flag = 1;\r
1353         if (req_rga->mmu_info.mmu_flag >> 31) {\r
1354             req->mmu_info.src0_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 8)  & 1);\r
1355             req->mmu_info.src1_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 9)  & 1);\r
1356             req->mmu_info.dst_mmu_flag  = ((req_rga->mmu_info.mmu_flag >> 10) & 1);\r
1357             req->mmu_info.els_mmu_flag  = ((req_rga->mmu_info.mmu_flag >> 11) & 1);\r
1358         }\r
1359         else {\r
1360             if (req_rga->src.yrgb_addr >= 0xa0000000) {\r
1361                req->mmu_info.src0_mmu_flag = 0;\r
1362                req->src.yrgb_addr = req_rga->src.yrgb_addr - 0x60000000;\r
1363                req->src.uv_addr   = req_rga->src.uv_addr - 0x60000000;\r
1364                req->src.v_addr    = req_rga->src.v_addr - 0x60000000;\r
1365             }\r
1366             if (req_rga->dst.yrgb_addr >= 0xa0000000) {\r
1367                req->mmu_info.dst_mmu_flag = 0;\r
1368                req->dst.yrgb_addr = req_rga->dst.yrgb_addr - 0x60000000;\r
1369             }\r
1370         }\r
1371     }\r
1372 }\r