fix rga2 color fill bug
[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 "rga2_rop.h"\r
34 #include "rga2.h"\r
35 \r
36 \r
37 void\r
38 RGA2_reg_get_param(unsigned char *base, struct rga2_req *msg)\r
39 {\r
40     RK_U32 *bRGA_SRC_INFO;\r
41     RK_U32 *bRGA_SRC_X_FACTOR;\r
42     RK_U32 *bRGA_SRC_Y_FACTOR;\r
43     RK_U32 sw, sh;\r
44     RK_U32 dw, dh;\r
45     RK_U32 param_x, param_y;\r
46     RK_U8 x_flag, y_flag;\r
47 \r
48     RK_U32 reg;\r
49 \r
50     bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);\r
51     reg = *bRGA_SRC_INFO;\r
52 \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
55 \r
56     x_flag = y_flag = 0;\r
57 \r
58     if(((msg->rotate_mode & 0x3) == 1) || ((msg->rotate_mode & 0x3) == 3))\r
59     {\r
60         dw = msg->dst.act_h;\r
61         dh = msg->dst.act_w;\r
62     }\r
63     else\r
64     {\r
65         dw = msg->dst.act_w;\r
66         dh = msg->dst.act_h;\r
67     }\r
68 \r
69     sw = msg->src.act_w;\r
70     sh = msg->src.act_h;\r
71 \r
72     if (sw > dw)\r
73     {\r
74         x_flag = 1;\r
75         #if SCALE_DOWN_LARGE\r
76         param_x = ((dw) << 16) / (sw);\r
77                 #else\r
78         param_x = ((dw) << 16) / (sw);\r
79         #endif\r
80         *bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 0 );\r
81     }\r
82     else if (sw < dw)\r
83     {\r
84         x_flag = 2;\r
85         #if 1//SCALE_MINUS1\r
86         param_x = ((sw - 1) << 16) / (dw - 1);\r
87         #else\r
88         param_x = ((sw) << 16) / (dw);\r
89                 #endif\r
90         *bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 16);\r
91     }\r
92     else\r
93     {\r
94         *bRGA_SRC_X_FACTOR = 0;//((1 << 14) << 16) | (1 << 14);\r
95     }\r
96 \r
97     if (sh > dh)\r
98     {\r
99         y_flag = 1;\r
100         #if SCALE_DOWN_LARGE\r
101         param_y = ((dh) << 16) / (sh);\r
102                 #else\r
103         param_y = ((dh) << 16) / (sh);\r
104         #endif\r
105         *bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 0 );\r
106     }\r
107     else if (sh < dh)\r
108     {\r
109         y_flag = 2;\r
110         #if 1//SCALE_MINUS1\r
111         param_y = ((sh - 1) << 16) / (dh - 1);\r
112         #else\r
113         param_y = ((sh) << 16) / (dh);\r
114                 #endif\r
115         *bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 16);\r
116     }\r
117     else\r
118     {\r
119         *bRGA_SRC_Y_FACTOR = 0;//((1 << 14) << 16) | (1 << 14);\r
120     }\r
121 \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
124 }\r
125 \r
126 void\r
127 RGA2_set_mode_ctrl(u8 *base, struct rga2_req *msg)\r
128 {\r
129     RK_U32 *bRGA_MODE_CTL;\r
130     RK_U32 reg = 0;\r
131     RK_U32 render_mode = msg->render_mode;\r
132 \r
133     bRGA_MODE_CTL = (u32 *)(base + RGA2_MODE_CTRL_OFFSET);\r
134 \r
135     if(msg->render_mode == 4)\r
136     {\r
137         render_mode = 3;\r
138     }\r
139 \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
146 \r
147     *bRGA_MODE_CTL = reg;\r
148 }\r
149 \r
150 void\r
151 RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)\r
152 {\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
159 \r
160     RK_U32 reg = 0;\r
161     RK_U8 src0_format = 0;\r
162 \r
163     RK_U8 src0_rb_swp = 0;\r
164     RK_U8 src0_rgb_pack = 0;\r
165 \r
166     RK_U8 src0_cbcr_swp = 0;\r
167     RK_U8 pixel_width = 1;\r
168     RK_U32 stride = 0;\r
169     RK_U32 uv_stride = 0;\r
170     RK_U32 mask_stride = 0;\r
171     RK_U32 ydiv = 1, xdiv = 2;\r
172 \r
173     RK_U32 sw, sh;\r
174     RK_U32 dw, dh;\r
175     RK_U8 rotate_mode;\r
176     RK_U8 scale_w_flag, scale_h_flag;\r
177 \r
178     bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);\r
179 \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
183 \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
186 \r
187     bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);\r
188 \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
191 \r
192     {\r
193         rotate_mode = msg->rotate_mode & 0x3;\r
194 \r
195         sw = msg->src.act_w;\r
196         sh = msg->src.act_h;\r
197 \r
198         if((rotate_mode == 1) | (rotate_mode == 3))\r
199         {\r
200             dw = msg->dst.act_h;\r
201             dh = msg->dst.act_w;\r
202         }\r
203         else\r
204         {\r
205             dw = msg->dst.act_w;\r
206             dh = msg->dst.act_h;\r
207         }\r
208 \r
209         if(sw > dw)\r
210             scale_w_flag = 1;\r
211         else if (sw < dw)\r
212             scale_w_flag = 2;\r
213         else {\r
214             scale_w_flag = 0;\r
215             if(msg->rotate_mode >> 6)\r
216                 scale_w_flag = 3;\r
217         }\r
218 \r
219         if(sh > dh)\r
220             scale_h_flag = 1;\r
221         else if (sh < dh)\r
222             scale_h_flag = 2;\r
223         else {\r
224             scale_h_flag = 0;\r
225             if(msg->rotate_mode >> 6)\r
226                 scale_h_flag = 3;\r
227         }\r
228     }\r
229 \r
230     switch (msg->src.format)\r
231     {\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
244 \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
253     };\r
254 \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
261     else\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
264         else\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
266 \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
277 \r
278     stride = (((msg->src.vir_w * pixel_width) + 3) & ~3) >> 2;\r
279 \r
280     uv_stride = ((msg->src.vir_w / xdiv + 3) & ~3);\r
281 \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
285 \r
286     //mask_stride = ((msg->src0_act.width + 31) & ~31) >> 5;\r
287     mask_stride = msg->rop_mask_stride;\r
288 \r
289     *bRGA_SRC_VIR_INFO = stride | (mask_stride << 16);\r
290 \r
291     *bRGA_SRC_ACT_INFO = (msg->src.act_w - 1) | ((msg->src.act_h - 1) << 16);\r
292 \r
293     *bRGA_MASK_ADDR = (RK_U32)msg->rop_mask_addr;\r
294 \r
295     *bRGA_SRC_INFO = reg;\r
296 \r
297         *bRGA_SRC_TR_COLOR0 = msg->color_key_min;\r
298     *bRGA_SRC_TR_COLOR1 = msg->color_key_max;\r
299 }\r
300 \r
301 \r
302 void\r
303 RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)\r
304 {\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
309 \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
317     RK_U32 reg = 0;\r
318     RK_U8 spw, dpw;\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
326 \r
327     RK_U32 s_y_lt_addr, s_y_ld_addr, s_y_rt_addr, s_y_rd_addr;\r
328 \r
329     dpw = 1;\r
330     x_div = y_div = 1;\r
331 \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
336 \r
337     bRGA_SRC_BASE3 = (RK_U32 *)(base + RGA2_SRC_BASE3_OFFSET);\r
338 \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
341 \r
342     switch (msg->src1.format)\r
343     {\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
357     };\r
358 \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
362 \r
363 \r
364     switch (msg->dst.format)\r
365     {\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
378 \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
387     };\r
388 \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
393 \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
399 \r
400 \r
401     *bRGA_DST_INFO = reg;\r
402 \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
406 \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
409     s_stride <<= 2;\r
410         d_stride <<= 2;\r
411 \r
412     if(((msg->rotate_mode & 0xf) == 0) || ((msg->rotate_mode & 0xf) == 1))\r
413     {\r
414         x_mirr = 0;\r
415         y_mirr = 0;\r
416     }\r
417     else\r
418     {\r
419         x_mirr = 1;\r
420         y_mirr = 1;\r
421     }\r
422 \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
426 \r
427     yrgb_addr = (RK_U32)msg->src1.yrgb_addr + (msg->src1.y_offset * s_stride) + (msg->src1.x_offset * spw);\r
428 \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
433 \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
437 \r
438     y_lt_addr = yrgb_addr;\r
439     u_lt_addr = u_addr;\r
440     v_lt_addr = v_addr;\r
441 \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
445 \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
449 \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
453 \r
454     if(rot_90_flag == 0)\r
455     {\r
456         if(y_mirr == 1)\r
457         {\r
458             if(x_mirr == 1)\r
459             {\r
460                 yrgb_addr = y_rd_addr;\r
461                 u_addr = u_rd_addr;\r
462                 v_addr = v_rd_addr;\r
463 \r
464                 s_yrgb_addr = s_y_rd_addr;\r
465             }\r
466             else\r
467             {\r
468                 yrgb_addr = y_ld_addr;\r
469                 u_addr = u_ld_addr;\r
470                 v_addr = v_ld_addr;\r
471 \r
472                 s_yrgb_addr = s_y_ld_addr;\r
473             }\r
474         }\r
475         else\r
476         {\r
477             if(x_mirr == 1)\r
478             {\r
479                 yrgb_addr = y_rt_addr;\r
480                 u_addr = u_rt_addr;\r
481                 v_addr = v_rt_addr;\r
482 \r
483                 s_yrgb_addr = s_y_rt_addr;\r
484             }\r
485             else\r
486             {\r
487                 yrgb_addr = y_lt_addr;\r
488                 u_addr = u_lt_addr;\r
489                 v_addr = v_lt_addr;\r
490 \r
491                 s_yrgb_addr = s_y_lt_addr;\r
492             }\r
493         }\r
494     }\r
495     else\r
496     {\r
497         if(y_mirr == 1)\r
498         {\r
499             if(x_mirr == 1)\r
500             {\r
501                 yrgb_addr = y_ld_addr;\r
502                 u_addr = u_ld_addr;\r
503                 v_addr = v_ld_addr;\r
504 \r
505                 s_yrgb_addr = s_y_ld_addr;\r
506             }\r
507             else\r
508             {\r
509                 yrgb_addr = y_rd_addr;\r
510                 u_addr = u_rd_addr;\r
511                 v_addr = v_rd_addr;\r
512 \r
513                 s_yrgb_addr = s_y_rd_addr;\r
514             }\r
515         }\r
516         else\r
517         {\r
518             if(x_mirr == 1)\r
519             {\r
520                 yrgb_addr = y_lt_addr;\r
521                 u_addr = u_lt_addr;\r
522                 v_addr = v_lt_addr;\r
523 \r
524                 s_yrgb_addr = s_y_lt_addr;\r
525             }\r
526             else\r
527             {\r
528                 yrgb_addr = y_rt_addr;\r
529                 u_addr = u_rt_addr;\r
530                 v_addr = v_rt_addr;\r
531 \r
532                 s_yrgb_addr = s_y_rt_addr;\r
533             }\r
534         }\r
535     }\r
536 \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
541 }\r
542 \r
543 void\r
544 RGA2_set_reg_alpha_info(u8 *base, struct rga2_req *msg)\r
545 {\r
546     RK_U32 *bRGA_ALPHA_CTRL0;\r
547     RK_U32 *bRGA_ALPHA_CTRL1;\r
548     RK_U32 *bRGA_FADING_CTRL;\r
549     RK_U32 reg0 = 0;\r
550     RK_U32 reg1 = 0;\r
551 \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
555 \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
561 \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
572 \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
581 \r
582     *bRGA_ALPHA_CTRL0 = reg0;\r
583     *bRGA_ALPHA_CTRL1 = reg1;\r
584 \r
585     if((msg->alpha_rop_flag>>2)&1)\r
586     {\r
587         *bRGA_FADING_CTRL = (1<<24) | (msg->fading_b_value<<16) | (msg->fading_g_value<<8) | (msg->fading_r_value);\r
588     }\r
589 }\r
590 \r
591 void\r
592 RGA2_set_reg_rop_info(u8 *base, struct rga2_req *msg)\r
593 {\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
600 \r
601     RK_U32 rop_code0 = 0;\r
602     RK_U32 rop_code1 = 0;\r
603 \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
610 \r
611     if(msg->rop_mode == 0) {\r
612         rop_code0 =  ROP3_code[(msg->rop_code & 0xff)];\r
613     }\r
614     else if(msg->rop_mode == 1) {\r
615         rop_code0 =  ROP3_code[(msg->rop_code & 0xff)];\r
616     }\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
620     }\r
621 \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
629 \r
630 }\r
631 \r
632 \r
633 \r
634 void\r
635 RGA2_set_reg_color_palette(RK_U8 *base, struct rga2_req *msg)\r
636 {\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
638     RK_U32  *p;\r
639     RK_S16  x_off, y_off;\r
640     RK_U16  src_stride;\r
641     RK_U8   shift;\r
642     RK_U32  sw;\r
643     RK_U32  byte_num;\r
644     RK_U32 reg;\r
645 \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
652 \r
653     reg = 0;\r
654 \r
655     shift = 3 - msg->palette_mode;\r
656 \r
657     x_off = msg->src.x_offset;\r
658     y_off = msg->src.y_offset;\r
659 \r
660     sw = msg->src.vir_w;\r
661     byte_num = sw >> shift;\r
662 \r
663     src_stride = (byte_num + 3) & (~3);\r
664 \r
665     p = (RK_U32 *)msg->src.yrgb_addr;\r
666 \r
667     #if 0\r
668     if(endian_mode)\r
669     {\r
670         p = p + (x_off>>shift) + y_off*src_stride;\r
671     }\r
672     else\r
673     {\r
674         p = p + (((x_off>>shift)>>2)<<2) + (3 - ((x_off>>shift) & 3)) + y_off*src_stride;\r
675     }\r
676     #endif\r
677 \r
678     p = p + (x_off>>shift) + y_off*src_stride;\r
679 \r
680 \r
681     *bRGA_SRC_BASE0 = (RK_U32)p;\r
682 \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
688 \r
689     *bRGA_SRC_FG_COLOR = msg->fg_color;\r
690     *bRGA_SRC_BG_COLOR = msg->bg_color;\r
691 \r
692 }\r
693 \r
694 void\r
695 RGA2_set_reg_color_fill(u8 *base, struct rga2_req *msg)\r
696 {\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
704 \r
705     RK_U32 mask_stride;\r
706     RK_U32 *bRGA_SRC_VIR_INFO;\r
707 \r
708     bRGA_SRC_FG_COLOR = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);\r
709 \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
714 \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
717 \r
718     bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);\r
719 \r
720     mask_stride = msg->rop_mask_stride;\r
721 \r
722     if(msg->color_fill_mode == 0)\r
723     {\r
724         /* solid color */\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
729 \r
730         *bRGA_SRC_FG_COLOR = msg->fg_color;\r
731     }\r
732     else\r
733     {\r
734         /* patten 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
738     }\r
739         *bRGA_SRC_VIR_INFO = mask_stride << 16;\r
740 }\r
741 \r
742 \r
743 void\r
744 RGA2_set_reg_update_palette_table(RK_U8 *base, struct rga2_req *msg)\r
745 {\r
746     RK_U32 *bRGA_MASK_BASE;\r
747     RK_U32 *bRGA_FADING_CTRL;\r
748 \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
751 \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
755 }\r
756 \r
757 \r
758 void\r
759 RGA2_set_reg_update_patten_buff(RK_U8 *base, struct rga2_req *msg)\r
760 {\r
761     u32 *bRGA_PAT_MST;\r
762     u32 *bRGA_PAT_CON;\r
763     u32 *bRGA_PAT_START_POINT;\r
764     RK_U32 *bRGA_FADING_CTRL;\r
765     u32 reg = 0;\r
766     rga_img_info_t *pat;\r
767 \r
768     RK_U32 num, offset;\r
769 \r
770     pat = &msg->pat;\r
771 \r
772     num = (pat->act_w * pat->act_h) - 1;\r
773 \r
774     offset = pat->act_w * pat->y_offset + pat->x_offset;\r
775 \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
780 \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
783 \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
786 \r
787     *bRGA_FADING_CTRL = (num << 8) | offset;\r
788 }\r
789 \r
790 \r
791 void\r
792 RGA2_set_pat_info(RK_U8 *base, struct rga2_req *msg)\r
793 {\r
794     u32 *bRGA_PAT_CON;\r
795     u32 *bRGA_FADING_CTRL;\r
796     u32 reg = 0;\r
797     rga_img_info_t *pat;\r
798 \r
799     RK_U32 num, offset;\r
800 \r
801     pat = &msg->pat;\r
802 \r
803     num = ((pat->act_w * pat->act_h) - 1) & 0xff;\r
804 \r
805     offset = (pat->act_w * pat->y_offset) + pat->x_offset;\r
806 \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
809 \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
812 \r
813     *bRGA_FADING_CTRL = (num << 8) | offset;  //???pat_addr???\r
814 }\r
815 \r
816 \r
817 void\r
818 RGA2_set_mmu_info(RK_U8 *base, struct rga2_req *msg)\r
819 {\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
825 \r
826     RK_U32 reg;\r
827 \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
833 \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
836 \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
842 }\r
843 \r
844 \r
845 int\r
846 RGA2_gen_reg_info(RK_U8 *base , struct rga2_req *msg)\r
847 {\r
848 \r
849     RGA2_set_mode_ctrl(base, msg);\r
850 \r
851     RGA2_set_pat_info(base, msg);\r
852 \r
853     switch(msg->render_mode)\r
854     {\r
855         case bitblt_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
860             break;\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
865             break;\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
869             break;\r
870         case update_palette_table_mode :\r
871             RGA2_set_reg_update_palette_table(base, msg);\r
872             break;\r
873         case update_patten_buff_mode :\r
874             RGA2_set_reg_update_patten_buff(base, msg);\r
875             break;\r
876         default :\r
877             printk("RGA2 ERROR msg render mode %d \n", msg->render_mode);\r
878             break;\r
879 \r
880     }\r
881 \r
882     RGA2_set_mmu_info(base, msg);\r
883 \r
884     return 0;\r
885 \r
886 }\r
887 \r
888 void format_name_convert(uint32_t *df, uint32_t sf)\r
889 {\r
890     /*\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
899 \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
904 \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
909 \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
922 \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
931     switch(sf)\r
932     {\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
949     }\r
950 }\r
951 \r
952 void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)\r
953 {\r
954     u16 alpha_mode_0, alpha_mode_1;\r
955 \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
962     else\r
963         req->render_mode = req_rga->render_mode;\r
964 \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
969 \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
972 \r
973     if(req_rga->rotate_mode == 1) {\r
974         if(req_rga->sina == 0 && req_rga->cosa == 65536) {\r
975             /* rotate 0 */\r
976             req->rotate_mode = 0;\r
977         }\r
978         else if (req_rga->sina == 65536 && req_rga->cosa == 0) {\r
979             /* rotate 90 */\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
984         }\r
985         else if (req_rga->sina == 0 && req_rga->cosa == -65536) {\r
986             /* rotate 180 */\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
990         }\r
991         else if (req_rga->sina == -65536 && req_rga->cosa == 0) {\r
992             /* totate 270 */\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
997         }\r
998     }\r
999     else if (req_rga->rotate_mode == 2)\r
1000     {\r
1001         //x_mirror\r
1002     }\r
1003     else if (req_rga->rotate_mode == 3)\r
1004     {\r
1005         //y_mirror\r
1006     }\r
1007     else {\r
1008         req->rotate_mode = 0;\r
1009     }\r
1010 \r
1011     req->LUT_addr = req_rga->LUT_addr;\r
1012     req->rop_mask_addr = req_rga->rop_mask_addr;\r
1013 \r
1014     req->bitblt_mode = req_rga->bsfilter_flag;\r
1015 \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
1020 \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
1024 \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
1028 \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
1033 \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
1038 \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
1047 \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
1052             {\r
1053                 case 0: //dst = 0\r
1054                     break;\r
1055                 case 1: //dst = src\r
1056                     break;\r
1057                 case 2: //dst = dst\r
1058                     break;\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
1063                     }\r
1064                     else if ((req_rga->alpha_rop_mode & 3) == 1) {\r
1065                         alpha_mode_0 = 0x381A;\r
1066                         alpha_mode_1 = 0x381A;\r
1067                     }\r
1068                     else if ((req_rga->alpha_rop_mode & 3) == 2) {\r
1069                         alpha_mode_0 = 0x381C;\r
1070                         alpha_mode_1 = 0x381C;\r
1071                     }\r
1072                     else {\r
1073                         alpha_mode_0 = 0x381A;\r
1074                         alpha_mode_1 = 0x381A;\r
1075                     }\r
1076                     req->alpha_mode_0 = alpha_mode_0;\r
1077                     req->alpha_mode_1 = alpha_mode_1;\r
1078                     break;\r
1079                 case 4: //dst = (sc*(256-da) + 256*dc) >> 8\r
1080                     break;\r
1081                 case 5: //dst = (da*sc) >> 8\r
1082                     break;\r
1083                 case 6: //dst = (sa*dc) >> 8\r
1084                     break;\r
1085                 case 7: //dst = ((256-da)*sc) >> 8\r
1086                     break;\r
1087                 case 8: //dst = ((256-sa)*dc) >> 8\r
1088                     break;\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
1092                     break;\r
1093                 case 10://dst = ((256-da)*sc + (sa*dc)) >> 8\r
1094                     break;\r
1095                 case 11://dst = ((256-da)*sc + (256-sa)*dc) >> 8;\r
1096                     break;\r
1097                 default:\r
1098                     break;\r
1099             }\r
1100         }\r
1101         else {\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
1105             }\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
1109             }\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
1113             }\r
1114         }\r
1115     }\r
1116 \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
1120 \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
1126         }\r
1127         else {\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
1133             }\r
1134 \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
1138             }\r
1139         }\r
1140     }\r
1141 }\r
1142 \r
1143 \r
1144 \r