modify rga driver for fix bugs
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / rga / rga_reg_info.c
1 \r
2 //#include <linux/kernel.h>\r
3 #include <linux/memory.h>\r
4 #include "rga_reg_info.h"\r
5 #include "rga_rop.h"\r
6 #include "rga.h"\r
7 \r
8 \r
9 /*************************************************************    \r
10 Func:        \r
11     RGA_pixel_width_init    \r
12 Description:        \r
13     select pixel_width form data format    \r
14 Author:        \r
15     ZhangShengqin    \r
16 Date:        \r
17     20012-2-2 10:59:25 \r
18 **************************************************************/\r
19 unsigned char\r
20 RGA_pixel_width_init(unsigned int format)\r
21 {\r
22     unsigned char pixel_width;\r
23 \r
24     pixel_width = 0;\r
25 \r
26     switch(format)\r
27     {\r
28         /* RGB FORMAT */\r
29         case RK_FORMAT_RGBA_8888 :   pixel_width = 4;   break;\r
30         case RK_FORMAT_RGBX_8888 :   pixel_width = 4;   break;\r
31         case RK_FORMAT_RGB_888   :   pixel_width = 3;   break;\r
32         case RK_FORMAT_BGRA_8888 :   pixel_width = 4;   break;\r
33         case RK_FORMAT_RGB_565   :   pixel_width = 2;   break;\r
34         case RK_FORMAT_RGBA_5551 :   pixel_width = 2;   break;\r
35         case RK_FORMAT_RGBA_4444 :   pixel_width = 2;   break;\r
36         case RK_FORMAT_BGR_888   :   pixel_width = 3;   break;\r
37 \r
38         /* YUV FORMAT */    \r
39         case RK_FORMAT_YCbCr_422_SP :   pixel_width = 1;  break;\r
40         case RK_FORMAT_YCbCr_422_P  :   pixel_width = 1;  break;\r
41         case RK_FORMAT_YCbCr_420_SP :   pixel_width = 1;  break;\r
42         case RK_FORMAT_YCbCr_420_P  :   pixel_width = 1;  break;\r
43         case RK_FORMAT_YCrCb_422_SP :   pixel_width = 1;  break;\r
44         case RK_FORMAT_YCrCb_422_P  :   pixel_width = 1;  break;\r
45         case RK_FORMAT_YCrCb_420_SP :   pixel_width = 1;  break;\r
46         case RK_FORMAT_YCrCb_420_P :    pixel_width = 1;  break;\r
47         //case default :                  pixel_width = 0;  break;\r
48     }\r
49 \r
50     return pixel_width;\r
51 }\r
52 \r
53 /*************************************************************    \r
54 Func:        \r
55     dst_ctrl_cal    \r
56 Description:        \r
57     calculate dst act window position / width / height \r
58     and set the tile struct \r
59 Author:        \r
60     ZhangShengqin    \r
61 Date:        \r
62     20012-2-2 10:59:25 \r
63 **************************************************************/\r
64 void\r
65 dst_ctrl_cal(const struct rga_req *msg, TILE_INFO *tile)\r
66 {\r
67     u32 width   = msg->dst.act_w;\r
68     u32 height  = msg->dst.act_h;\r
69     s32 xoff    = msg->dst.x_offset;\r
70     s32 yoff    = msg->dst.y_offset;\r
71 \r
72     s32 x0, y0, x1, y1, x2, y2;\r
73     s32 x00,y00,x10,y10,x20,y20;\r
74     s32 xx, xy, yx, yy;\r
75     s32 pos[8];\r
76 \r
77     s32 xmax, xmin, ymax, ymin;\r
78 \r
79     s32 sina = msg->sina; /* 16.16 */\r
80     s32 cosa = msg->cosa; /* 16.16 */\r
81 \r
82     xmax = xmin = ymax = ymin = 0;\r
83 \r
84     if((msg->rotate_mode == 0)||(msg->rotate_mode == 2)||(msg->rotate_mode == 3))\r
85     {\r
86         pos[0] = xoff;\r
87         pos[1] = yoff;\r
88            \r
89         pos[2] = xoff;\r
90         pos[3] = yoff + height - 1;\r
91             \r
92         pos[4] = xoff + width - 1;\r
93         pos[5] = yoff + height - 1;\r
94 \r
95         pos[6] = xoff + width - 1;\r
96         pos[7] = yoff;\r
97 \r
98         xmax = MIN(MAX(MAX(MAX(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmax);\r
99         xmin = MAX(MIN(MIN(MIN(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmin);\r
100         \r
101         ymax = MIN(MAX(MAX(MAX(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymax);\r
102         ymin = MAX(MIN(MIN(MIN(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymin);\r
103         \r
104         //printk("xmax = %d, xmin = %d, ymin = %d, ymax = %d\n", xmax, xmin, ymin, ymax);\r
105     }\r
106     else if(msg->rotate_mode == 1)\r
107     {\r
108         if((sina == 0) || (cosa == 0))\r
109         {        \r
110             if((sina == 0) && (cosa == -65536))\r
111             {\r
112                 /* 180 */\r
113                 pos[0] = xoff - width + 1;\r
114                 pos[1] = yoff - height + 1;\r
115 \r
116                 pos[2] = xoff - width  + 1;\r
117                 pos[3] = yoff;\r
118 \r
119                 pos[4] = xoff;\r
120                 pos[5] = yoff;\r
121 \r
122                 pos[6] = xoff;\r
123                 pos[7] = yoff - height + 1;\r
124             }\r
125             else if((cosa == 0)&&(sina == 65536))\r
126             {\r
127                 /* 90 */\r
128                 pos[0] = xoff - height + 1;\r
129                 pos[1] = yoff;\r
130 \r
131                 pos[2] = xoff - height + 1;\r
132                 pos[3] = yoff + width - 1;\r
133 \r
134                 pos[4] = xoff;\r
135                 pos[5] = yoff + width - 1;\r
136 \r
137                 pos[6] = xoff;\r
138                 pos[7] = yoff;\r
139             }\r
140             else if((cosa == 0)&&(sina == -65536))\r
141             {\r
142                 /* 270 */\r
143                 pos[0] = xoff;\r
144                 pos[1] = yoff - width + 1;\r
145 \r
146                 pos[2] = xoff;\r
147                 pos[3] = yoff;\r
148 \r
149                 pos[4] = xoff + height - 1;\r
150                 pos[5] = yoff;\r
151 \r
152                 pos[6] = xoff + height - 1;\r
153                 pos[7] = yoff - width + 1;        \r
154             }\r
155             else\r
156             {\r
157                 /* 0 */\r
158                 pos[0] = xoff;\r
159                 pos[1] = yoff;\r
160 \r
161                 pos[2] = xoff;\r
162                 pos[3] = yoff + height - 1;\r
163 \r
164                 pos[4] = xoff + width - 1;\r
165                 pos[5] = yoff + height - 1;\r
166 \r
167                 pos[6] = xoff + width - 1;\r
168                 pos[7] = yoff;\r
169             }\r
170 \r
171             xmax = MIN(MAX(MAX(MAX(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmax);\r
172             xmin = MAX(MIN(MIN(MIN(pos[0], pos[2]), pos[4]), pos[6]), msg->clip.xmin);\r
173             \r
174             ymax = MIN(MAX(MAX(MAX(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymax);\r
175             ymin = MAX(MIN(MIN(MIN(pos[1], pos[3]), pos[5]), pos[7]), msg->clip.ymin);\r
176         }               \r
177         else\r
178         {\r
179             xx = msg->cosa;\r
180             xy = msg->sina;\r
181             yx = xy;\r
182             yy = xx;\r
183 \r
184             x0 = width + xoff;\r
185             y0 = yoff;\r
186 \r
187             x1 = xoff;\r
188             y1 = height + yoff;\r
189 \r
190             x2 = width + xoff;\r
191             y2 = height + yoff;\r
192             \r
193             pos[0] = xoff;\r
194             pos[1] = yoff;\r
195 \r
196             pos[2] = x00 = (((x0 - xoff)*xx - (y0 - yoff)*xy)>>16) + xoff;\r
197             pos[3] = y00 = (((x0 - xoff)*yx + (y0 - yoff)*yy)>>16) + yoff;\r
198 \r
199             pos[4] = x10 = (((x1 - xoff)*xx - (y1 - yoff)*xy)>>16) + xoff;\r
200             pos[5] = y10 = (((x1 - xoff)*yx + (y1 - yoff)*yy)>>16) + yoff;\r
201 \r
202             pos[6] = x20 = (((x2 - xoff)*xx - (y2 - yoff)*xy)>>16) + xoff;\r
203             pos[7] = y20 = (((x2 - xoff)*yx + (y2 - yoff)*yy)>>16) + yoff;\r
204 \r
205             xmax = MAX(MAX(MAX(x00, xoff), x10), x20) + 2;\r
206             xmin = MIN(MIN(MIN(x00, xoff), x10), x20) - 1;\r
207 \r
208             ymax = MAX(MAX(MAX(y00, yoff), y10), y20) + 2;\r
209             ymin = MIN(MIN(MIN(y00, yoff), y10), y20) - 1;\r
210 \r
211             xmax = MIN(xmax, msg->clip.xmax);\r
212             xmin = MAX(xmin, msg->clip.xmin);\r
213 \r
214             ymax = MIN(ymax, msg->clip.ymax);\r
215             ymin = MAX(ymin, msg->clip.ymin);\r
216 \r
217             //printk("xmin = %d, xmax = %d, ymin = %d, ymax = %d\n", xmin, xmax, ymin, ymax);\r
218         }\r
219     }    \r
220    \r
221     if ((xmax < xmin) || (ymax < ymin)) {    \r
222         xmin = xmax;\r
223         ymin = ymax;\r
224     }    \r
225     \r
226     if ((xmin >= msg->dst.vir_w)||(xmax < 0)||(ymin >= msg->dst.vir_h)||(ymax < 0)) {       \r
227         xmin = xmax = ymin = ymax = 0;\r
228     }\r
229 \r
230     //printk("xmin = %d, xmax = %d, ymin = %d, ymax = %d\n", xmin, xmax, ymin, ymax);\r
231     \r
232     tile->dst_ctrl.w = (xmax - xmin);\r
233     tile->dst_ctrl.h = (ymax - ymin);\r
234     tile->dst_ctrl.x_off = xmin;\r
235     tile->dst_ctrl.y_off = ymin;\r
236 \r
237     //printk("tile->dst_ctrl.w = %x, tile->dst_ctrl.h = %x\n", tile->dst_ctrl.w, tile->dst_ctrl.h);\r
238 \r
239     tile->tile_x_num = (xmax - xmin + 1 + 7)>>3;\r
240     tile->tile_y_num = (ymax - ymin + 1 + 7)>>3;\r
241 \r
242     tile->dst_x_tmp = xmin - msg->dst.x_offset;\r
243     tile->dst_y_tmp = ymin - msg->dst.y_offset;\r
244 }\r
245 \r
246 /*************************************************************    \r
247 Func:        \r
248     src_tile_info_cal    \r
249 Description:        \r
250     calculate src remap window position / width / height \r
251     and set the tile struct \r
252 Author:        \r
253     ZhangShengqin    \r
254 Date:        \r
255     20012-2-2 10:59:25 \r
256 **************************************************************/\r
257 \r
258 void\r
259 src_tile_info_cal(const struct rga_req *msg, TILE_INFO *tile)\r
260 {\r
261     s32 x0, x1, x2, x3, y0, y1, y2, y3; \r
262     \r
263     int64_t xx, xy, yx, yy;\r
264 \r
265     int64_t pos[8];\r
266     int64_t epos[8];\r
267 \r
268     int64_t x_dx, x_dy, y_dx, y_dy;\r
269     int64_t x_temp_start, y_temp_start;\r
270     int64_t xmax, xmin, ymax, ymin;\r
271 \r
272     int64_t t_xoff, t_yoff;\r
273 \r
274     xx = tile->matrix[0]; /* 32.32 */\r
275     xy = tile->matrix[1]; /* 32.32 */\r
276     yx = tile->matrix[2]; /* 32.32 */\r
277     yy = tile->matrix[3]; /* 32.32 */\r
278 \r
279     if(msg->rotate_mode == 1)\r
280     {    \r
281         x0 = tile->dst_x_tmp;\r
282         y0 = tile->dst_y_tmp;\r
283      \r
284         x1 = x0;\r
285         y1 = y0 + 8;\r
286 \r
287         x2 = x0 + 8;\r
288         y2 = y0 + 8;\r
289 \r
290         x3 = x0 + 8;\r
291         y3 = y0;\r
292        \r
293         pos[0] = (x0*xx + y0*yx); \r
294         pos[1] = (x0*xy + y0*yy);\r
295 \r
296         pos[2] = (x1*xx + y1*yx);\r
297         pos[3] = (x1*xy + y1*yy);\r
298 \r
299         pos[4] = (x2*xx + y2*yx);\r
300         pos[5] = (x2*xy + y2*yy);\r
301 \r
302         pos[6] = (x3*xx + y3*yx);\r
303         pos[7] = (x3*xy + y3*yy);\r
304 \r
305         y1 = y0 + 7;\r
306         x2 = x0 + 7;\r
307         y2 = y0 + 7;\r
308         x3 = x0 + 7;\r
309 \r
310         epos[0] = pos[0];\r
311         epos[1] = pos[1];\r
312 \r
313         epos[2] = (x1*xx + y1*yx);\r
314         epos[3] = (x1*xy + y1*yy);\r
315 \r
316         epos[4] = (x2*xx + y2*yx);\r
317         epos[5] = (x2*xy + y2*yy);\r
318 \r
319         epos[6] = (x3*xx + y3*yx);\r
320         epos[7] = (x3*xy + y3*yy);\r
321 \r
322         x_dx = pos[6] - pos[0];\r
323         x_dy = pos[7] - pos[1];\r
324 \r
325         y_dx = pos[2] - pos[0];\r
326         y_dy = pos[3] - pos[1];\r
327 \r
328         tile->x_dx = (s32)(x_dx >> 22 ); \r
329         tile->x_dy = (s32)(x_dy >> 22 ); \r
330         tile->y_dx = (s32)(y_dx >> 22 ); \r
331         tile->y_dy = (s32)(y_dy >> 22 ); \r
332         \r
333         x_temp_start = x0*xx + y0*yx;\r
334         y_temp_start = x0*xy + y0*yy;\r
335         \r
336         xmax = (MAX(MAX(MAX(epos[0], epos[2]), epos[4]), epos[6]));   \r
337         xmin = (MIN(MIN(MIN(epos[0], epos[2]), epos[4]), epos[6]));   \r
338 \r
339         ymax = (MAX(MAX(MAX(epos[1], epos[3]), epos[5]), epos[7]));\r
340         ymin = (MIN(MIN(MIN(epos[1], epos[3]), epos[5]), epos[7]));\r
341 \r
342         t_xoff = (x_temp_start - xmin)>>18;\r
343         t_yoff = (y_temp_start - ymin)>>18;\r
344         \r
345         tile->tile_xoff = (s32)t_xoff;\r
346         tile->tile_yoff = (s32)t_yoff;\r
347        \r
348         tile->tile_w = (u16)((xmax - xmin)>>21); //.11\r
349         tile->tile_h = (u16)((ymax - ymin)>>21); //.11\r
350 \r
351         tile->tile_start_x_coor = (s16)(xmin>>29); //.3\r
352         tile->tile_start_y_coor = (s16)(ymin>>29); //.3                    \r
353     }\r
354     else if (msg->rotate_mode == 2)\r
355     {\r
356         tile->x_dx = (s32)((8*xx)>>22);\r
357         tile->x_dy = 0;\r
358         tile->y_dx = 0;\r
359         tile->y_dy = (s32)((8*yy)>>22);\r
360                \r
361         tile->tile_w = ABS((s32)((7*xx)>>21));\r
362         tile->tile_h = ABS((s32)((7*yy)>>21));\r
363 \r
364         tile->tile_xoff = ABS((s32)((7*xx)>>18));\r
365         tile->tile_yoff = 0;\r
366 \r
367         tile->tile_start_x_coor = (((msg->src.act_w - 1)<<11) - (tile->tile_w))>>8;\r
368         tile->tile_start_y_coor = 0;                    \r
369     }\r
370     else if (msg->rotate_mode == 3)\r
371     {\r
372         tile->x_dx = (s32)((8*xx)>>22);\r
373         tile->x_dy = 0;\r
374         tile->y_dx = 0;\r
375         tile->y_dy = (s32)((8*yy)>>22);\r
376         \r
377         tile->tile_w = ABS((s32)((7*xx)>>21));\r
378         tile->tile_h = ABS((s32)((7*yy)>>21));\r
379 \r
380         tile->tile_xoff = 0;\r
381         tile->tile_yoff = ABS((s32)((7*yy)>>18));\r
382 \r
383         tile->tile_start_x_coor = 0;\r
384         tile->tile_start_y_coor = (((msg->src.act_h - 1)<<11) - (tile->tile_h))>>8;\r
385     }        \r
386 \r
387     if ((msg->scale_mode == 2)||(msg->alpha_rop_flag >> 7))\r
388     {\r
389         tile->tile_start_x_coor -= (1<<3);\r
390         tile->tile_start_y_coor -= (1<<3);\r
391         tile->tile_w += (2 << 11);\r
392         tile->tile_h += (2 << 11);\r
393         tile->tile_xoff += (1<<14);\r
394         tile->tile_yoff += (1<<14);\r
395     }\r
396 }\r
397 \r
398 \r
399 /*************************************************************    \r
400 Func:        \r
401     RGA_set_mode_ctrl    \r
402 Description:        \r
403     fill mode ctrl reg info \r
404 Author:        \r
405     ZhangShengqin    \r
406 Date:        \r
407     20012-2-2 10:59:25 \r
408 **************************************************************/\r
409 \r
410 void    \r
411 RGA_set_mode_ctrl(u8 *base, const struct rga_req *msg)\r
412 {\r
413     u32 *bRGA_MODE_CTL;\r
414     u32 reg = 0;\r
415     \r
416     u8 src_rgb_pack = 0;\r
417     u8 src_format = 0;\r
418     u8 src_rb_swp = 0;\r
419     u8 src_a_swp = 0;\r
420     u8 src_cbcr_swp = 0;\r
421 \r
422     u8 dst_rgb_pack = 0;\r
423     u8 dst_format = 0;\r
424     u8 dst_rb_swp = 0;\r
425     u8 dst_a_swp = 0;\r
426             \r
427     bRGA_MODE_CTL = (u32 *)(base + RGA_MODE_CTRL_OFFSET);\r
428     \r
429     reg = ((reg & (~m_RGA_MODE_CTRL_2D_RENDER_MODE)) | (s_RGA_MODE_CTRL_2D_RENDER_MODE(msg->render_mode)));   \r
430 \r
431     /* src info set */\r
432     \r
433     if (msg->render_mode == color_palette_mode || msg->render_mode == update_palette_table_mode)\r
434     {\r
435         src_format = 0x10 | (msg->palette_mode & 3);\r
436     }\r
437     else\r
438     {\r
439         switch (msg->src.format)\r
440         {\r
441             case RK_FORMAT_RGBA_8888    : src_format = 0x0; break;            \r
442             case RK_FORMAT_RGBA_4444    : src_format = 0x3; break;                         \r
443             case RK_FORMAT_RGBA_5551    : src_format = 0x2; break;            \r
444             case RK_FORMAT_BGRA_8888    : src_format = 0x0; src_rb_swp = 0x1; break;           \r
445             case RK_FORMAT_RGBX_8888    : src_format = 0x0; break;            \r
446             case RK_FORMAT_RGB_565      : src_format = 0x1; break;\r
447             case RK_FORMAT_RGB_888      : src_format = 0x0; src_rgb_pack = 1; break;\r
448             case RK_FORMAT_BGR_888      : src_format = 0x0; src_rgb_pack = 1; src_rb_swp = 1; break;\r
449             \r
450             case RK_FORMAT_YCbCr_422_SP : src_format = 0x4; break;            \r
451             case RK_FORMAT_YCbCr_422_P  : src_format = 0x5; break;                \r
452             case RK_FORMAT_YCbCr_420_SP : src_format = 0x6; break;                                \r
453             case RK_FORMAT_YCbCr_420_P  : src_format = 0x7; break;\r
454 \r
455             case RK_FORMAT_YCrCb_422_SP : src_format = 0x4; src_cbcr_swp = 1; break;            \r
456             case RK_FORMAT_YCrCb_422_P  : src_format = 0x5; src_cbcr_swp = 1; break;                \r
457             case RK_FORMAT_YCrCb_420_SP : src_format = 0x6; src_cbcr_swp = 1; break;                                \r
458             case RK_FORMAT_YCrCb_420_P  : src_format = 0x7; src_cbcr_swp = 1; break;\r
459         }                   \r
460     }\r
461 \r
462     src_a_swp = msg->src.alpha_swap & 1;\r
463 \r
464     reg = ((reg & (~m_RGA_MODE_CTRL_SRC_RGB_PACK))      | (s_RGA_MODE_CTRL_SRC_RGB_PACK(src_rgb_pack))); \r
465     reg = ((reg & (~m_RGA_MODE_CTRL_SRC_FORMAT))        | (s_RGA_MODE_CTRL_SRC_FORMAT(src_format)));\r
466     reg = ((reg & (~m_RGA_MODE_CTRL_SRC_RB_SWAP))       | (s_RGA_MODE_CTRL_SRC_RB_SWAP(src_rb_swp)));\r
467     reg = ((reg & (~m_RGA_MODE_CTRL_SRC_ALPHA_SWAP))    | (s_RGA_MODE_CTRL_SRC_ALPHA_SWAP(src_a_swp)));\r
468     reg = ((reg & (~m_RGA_MODE_CTRL_SRC_UV_SWAP_MODE )) | (s_RGA_MODE_CTRL_SRC_UV_SWAP_MODE (src_cbcr_swp)));\r
469     \r
470     \r
471     /* YUV2RGB MODE */    \r
472     reg = ((reg & (~m_RGA_MODE_CTRL_YUV2RGB_CON_MODE)) | (s_RGA_MODE_CTRL_YUV2RGB_CON_MODE(msg->yuv2rgb_mode)));\r
473 \r
474     /* ROTATE MODE */\r
475     reg = ((reg & (~m_RGA_MODE_CTRL_ROTATE_MODE)) | (s_RGA_MODE_CTRL_ROTATE_MODE(msg->rotate_mode)));\r
476 \r
477     /* SCALE MODE */\r
478     reg = ((reg & (~m_RGA_MODE_CTRL_SCALE_MODE)) | (s_RGA_MODE_CTRL_SCALE_MODE(msg->scale_mode)));\r
479 \r
480     /* COLOR FILL MODE */\r
481     reg = ((reg & (~m_RGA_MODE_CTRL_PAT_SEL)) | (s_RGA_MODE_CTRL_PAT_SEL(msg->color_fill_mode)));\r
482 \r
483     \r
484     if ((msg->render_mode == update_palette_table_mode)||(msg->render_mode == update_patten_buff_mode))\r
485     {\r
486         dst_format = msg->pat.format;\r
487     }\r
488     else\r
489     {\r
490         dst_format = (u8)msg->dst.format;\r
491     }\r
492     \r
493     /* dst info set */        \r
494     switch (dst_format)\r
495     {\r
496         case RK_FORMAT_BGRA_8888 : dst_format = 0x0; dst_rb_swp = 0x1; break;\r
497         case RK_FORMAT_RGBA_4444 : dst_format = 0x3; break;\r
498         case RK_FORMAT_RGBA_5551 : dst_format = 0x2; break;\r
499         case RK_FORMAT_RGBA_8888 : dst_format = 0x0; break;\r
500         case RK_FORMAT_RGB_565   : dst_format = 0x1; break;\r
501         case RK_FORMAT_RGB_888   : dst_format = 0x0; dst_rgb_pack = 0x1; break;\r
502         case RK_FORMAT_BGR_888   : dst_format = 0x0; dst_rgb_pack = 0x1; dst_rb_swp = 1; break;\r
503         case RK_FORMAT_RGBX_8888 : dst_format = 0x0; break;\r
504     }\r
505 \r
506     dst_a_swp = msg->dst.alpha_swap & 1;\r
507     \r
508     reg = ((reg & (~m_RGA_MODE_CTRL_DST_FORMAT))       | (s_RGA_MODE_CTRL_DST_FORMAT(dst_format))); \r
509     reg = ((reg & (~m_RGA_MODE_CTRL_DST_RGB_PACK))     | (s_RGA_MODE_CTRL_DST_RGB_PACK(dst_rgb_pack)));\r
510     reg = ((reg & (~m_RGA_MODE_CTRL_DST_RB_SWAP))      | (s_RGA_MODE_CTRL_DST_RB_SWAP(dst_rb_swp)));\r
511     reg = ((reg & (~m_RGA_MODE_CTRL_DST_ALPHA_SWAP))   | (s_RGA_MODE_CTRL_DST_ALPHA_SWAP(dst_a_swp)));\r
512     reg = ((reg & (~m_RGA_MODE_CTRL_LUT_ENDIAN_MODE))  | (s_RGA_MODE_CTRL_LUT_ENDIAN_MODE(msg->endian_mode & 1)));       \r
513     reg = ((reg & (~m_RGA_MODE_CTRL_SRC_TRANS_MODE))   | (s_RGA_MODE_CTRL_SRC_TRANS_MODE(msg->src_trans_mode)));\r
514     reg = ((reg & (~m_RGA_MODE_CTRL_ZERO_MODE_ENABLE)) | (s_RGA_MODE_CTRL_ZERO_MODE_ENABLE(msg->alpha_rop_mode >> 4)));\r
515     reg = ((reg & (~m_RGA_MODE_CTRL_DST_ALPHA_ENABLE)) | (s_RGA_MODE_CTRL_DST_ALPHA_ENABLE(msg->alpha_rop_mode >> 5)));\r
516 \r
517     *bRGA_MODE_CTL = reg;\r
518        \r
519 }\r
520 \r
521 \r
522 \r
523 /*************************************************************    \r
524 Func:        \r
525     RGA_set_src    \r
526 Description:        \r
527     fill src relate reg info \r
528 Author:        \r
529     ZhangShengqin    \r
530 Date:        \r
531     20012-2-2 10:59:25 \r
532 **************************************************************/\r
533 \r
534 void\r
535 RGA_set_src(u8 *base, const struct rga_req *msg)\r
536 {  \r
537     u32 *bRGA_SRC_VIR_INFO;\r
538     u32 *bRGA_SRC_ACT_INFO;\r
539     u32 *bRGA_SRC_Y_MST;\r
540     u32 *bRGA_SRC_CB_MST;\r
541     u32 *bRGA_SRC_CR_MST;\r
542 \r
543     s16 x_off, y_off, stride;\r
544     s16 uv_x_off, uv_y_off, uv_stride;\r
545     u32 pixel_width;\r
546 \r
547     uv_x_off = uv_y_off = uv_stride = 0;\r
548         \r
549     bRGA_SRC_Y_MST = (u32 *)(base + RGA_SRC_Y_MST_OFFSET);\r
550     bRGA_SRC_CB_MST = (u32 *)(base + RGA_SRC_CB_MST_OFFSET);\r
551     bRGA_SRC_CR_MST = (u32 *)(base + RGA_SRC_CR_MST_OFFSET);\r
552     bRGA_SRC_VIR_INFO = (u32 *)(base + RGA_SRC_VIR_INFO_OFFSET);\r
553     bRGA_SRC_ACT_INFO = (u32 *)(base + RGA_SRC_ACT_INFO_OFFSET);\r
554 \r
555     x_off  = msg->src.x_offset;\r
556     y_off  = msg->src.y_offset;\r
557 \r
558     pixel_width = RGA_pixel_width_init(msg->src.format);\r
559     \r
560     stride = ((msg->src.vir_w * pixel_width) + 3) & (~3);\r
561 \r
562     switch(msg->src.format)\r
563     {\r
564         case RK_FORMAT_YCbCr_422_SP : \r
565             uv_stride = stride; \r
566             uv_x_off = x_off; \r
567             uv_y_off = y_off; \r
568             break;\r
569         case RK_FORMAT_YCbCr_422_P  :\r
570             uv_stride = stride >> 1;\r
571             uv_x_off = x_off >> 1;\r
572             uv_y_off = y_off;\r
573             break;\r
574         case RK_FORMAT_YCbCr_420_SP :\r
575             uv_stride = stride;\r
576             uv_x_off = x_off;\r
577             uv_y_off = y_off >> 1;\r
578             break;\r
579         case RK_FORMAT_YCbCr_420_P :\r
580             uv_stride = stride >> 1;\r
581             uv_x_off = x_off >> 1;\r
582             uv_y_off = y_off >> 1;\r
583             break;\r
584         case RK_FORMAT_YCrCb_422_SP :\r
585             uv_stride = stride;\r
586             uv_x_off = x_off;\r
587             uv_y_off = y_off;\r
588             break;\r
589         case RK_FORMAT_YCrCb_422_P  :\r
590             uv_stride = stride >> 1;\r
591             uv_x_off = x_off >> 1;\r
592             uv_y_off = y_off;\r
593             break;\r
594         case RK_FORMAT_YCrCb_420_SP :\r
595             uv_stride = stride;\r
596             uv_x_off = x_off;\r
597             uv_y_off = y_off >> 1;\r
598             break;\r
599         case RK_FORMAT_YCrCb_420_P :\r
600             uv_stride = stride >> 1;\r
601             uv_x_off = x_off >> 1;\r
602             uv_y_off = y_off >> 1;\r
603             break;            \r
604     }        \r
605 \r
606 \r
607     /* src addr set */          \r
608     *bRGA_SRC_Y_MST = msg->src.yrgb_addr + (y_off * stride) + (x_off * pixel_width);\r
609     *bRGA_SRC_CB_MST = msg->src.uv_addr + uv_y_off * uv_stride + uv_x_off;\r
610     *bRGA_SRC_CR_MST = msg->src.v_addr + uv_y_off * uv_stride + uv_x_off;\r
611 \r
612     if((msg->alpha_rop_flag >> 1) & 1)\r
613         *bRGA_SRC_CB_MST = (u32)msg->rop_mask_addr;\r
614 \r
615     if (msg->render_mode == color_palette_mode)\r
616     {\r
617         u8 shift;\r
618         u16 sw, byte_num;\r
619         shift = 3 - (msg->palette_mode & 3);\r
620         sw = msg->src.vir_w;\r
621 \r
622         byte_num = sw >> shift;\r
623         stride = (byte_num + 3) & (~3);\r
624     }    \r
625 \r
626     /* src act window / vir window set */ \r
627     *bRGA_SRC_VIR_INFO = ((stride >> 2) | (msg->src.vir_h)<<16);\r
628     *bRGA_SRC_ACT_INFO = ((msg->src.act_w-1) | (msg->src.act_h-1)<<16);\r
629 }\r
630 \r
631 \r
632 /*************************************************************    \r
633 Func:        \r
634     RGA_set_dst    \r
635 Description:        \r
636     fill dst relate reg info \r
637 Author:        \r
638     ZhangShengqin    \r
639 Date:        \r
640     20012-2-2 10:59:25 \r
641 **************************************************************/\r
642 \r
643 s32 RGA_set_dst(u8 *base, const struct rga_req *msg)\r
644 {\r
645     u32 *bRGA_DST_MST;\r
646     u32 *bRGA_DST_VIR_INFO;\r
647     u32 *bRGA_DST_CTR_INFO;\r
648     u32 *bRGA_PRESCL_CB_MST;\r
649     u32 *bRGA_PRESCL_CR_MST;\r
650     u32 reg = 0;\r
651 \r
652     u8 pw;\r
653     s16 x_off = msg->dst.x_offset;\r
654     s16 y_off = msg->dst.y_offset;\r
655     u16 stride, rop_mask_stride;\r
656 \r
657     bRGA_DST_MST = (u32 *)(base + RGA_DST_MST_OFFSET);\r
658     bRGA_DST_VIR_INFO = (u32 *)(base + RGA_DST_VIR_INFO_OFFSET);\r
659     bRGA_DST_CTR_INFO = (u32 *)(base + RGA_DST_CTR_INFO_OFFSET);\r
660     bRGA_PRESCL_CB_MST = (u32 *)(base + RGA_PRESCL_CB_MST_OFFSET);\r
661     bRGA_PRESCL_CR_MST = (u32 *)(base + RGA_PRESCL_CR_MST_OFFSET);\r
662 \r
663     pw = RGA_pixel_width_init(msg->dst.format);\r
664 \r
665     stride = (msg->dst.vir_w * pw + 3) & (~3);\r
666 \r
667     *bRGA_DST_MST = (u32)msg->dst.yrgb_addr + (y_off * stride) + (x_off * pw);\r
668 \r
669     if (msg->render_mode == pre_scaling_mode)\r
670     {\r
671         switch(msg->dst.format)\r
672         {\r
673             case RK_FORMAT_YCbCr_422_SP : \r
674                 *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off) * pw);\r
675                 break;\r
676             case RK_FORMAT_YCbCr_422_P  :\r
677                 *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off>>1) * pw);\r
678                 *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr  + ((y_off) * stride) + ((x_off>>1) * pw);\r
679                 break;\r
680             case RK_FORMAT_YCbCr_420_SP :\r
681                 *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off) * pw);\r
682                 break;\r
683             case RK_FORMAT_YCbCr_420_P :\r
684                 *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off>>1) * pw);\r
685                 *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr  + ((y_off>>1) * stride) + ((x_off>>1) * pw);\r
686                 break;\r
687             case RK_FORMAT_YCrCb_422_SP :\r
688                 *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off) * pw);\r
689                 break;\r
690             case RK_FORMAT_YCrCb_422_P  :\r
691                 *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off) * stride) + ((x_off>>1) * pw);\r
692                 *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr  + ((y_off) * stride) + ((x_off>>1) * pw);\r
693                 break;\r
694             case RK_FORMAT_YCrCb_420_SP :\r
695                 *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off) * pw);\r
696                 break;\r
697             case RK_FORMAT_YCrCb_420_P :\r
698                 *bRGA_PRESCL_CB_MST = (u32)msg->dst.uv_addr + ((y_off>>1) * stride) + ((x_off>>1) * pw);\r
699                 *bRGA_PRESCL_CR_MST = (u32)msg->dst.v_addr  + ((y_off>>1) * stride) + ((x_off>>1) * pw);\r
700                 break;            \r
701         }             \r
702     }\r
703 \r
704     rop_mask_stride = (((msg->src.vir_w + 7)>>3) + 3) & (~3);//not dst_vir.w,hxx,2011.7.21\r
705     \r
706     reg = (stride >> 2) & 0xffff;\r
707     reg = reg | ((rop_mask_stride>>2) << 16);    \r
708 \r
709     if (msg->render_mode == line_point_drawing_mode)\r
710     {\r
711         reg &= 0xffff;\r
712         reg = reg | (msg->dst.vir_h << 16);        \r
713     }\r
714 \r
715     *bRGA_DST_VIR_INFO = reg;\r
716     *bRGA_DST_CTR_INFO = (msg->dst.act_w - 1) | ((msg->dst.act_h - 1) << 16);\r
717 \r
718     return 0;    \r
719 }\r
720 \r
721 \r
722 /*************************************************************    \r
723 Func:        \r
724     RGA_set_alpha_rop    \r
725 Description:        \r
726     fill alpha rop some relate reg bit \r
727 Author:        \r
728     ZhangShengqin    \r
729 Date:        \r
730     20012-2-2 10:59:25 \r
731 **************************************************************/\r
732 void\r
733 RGA_set_alpha_rop(u8 *base, const struct rga_req *msg)\r
734 {\r
735     u32 *bRGA_ALPHA_CON;\r
736     u32 *bRGA_ROP_CON0;\r
737     u32 *bRGA_ROP_CON1;\r
738     u32 reg = 0;\r
739     u32 rop_con0, rop_con1;\r
740     \r
741     u8 rop_mode = (msg->alpha_rop_mode) & 3;\r
742     u8 alpha_mode = msg->alpha_rop_mode & 3;\r
743 \r
744     rop_con0 = rop_con1 = 0;\r
745     \r
746     bRGA_ALPHA_CON = (u32 *)(base + RGA_ALPHA_CON_OFFSET);\r
747 \r
748     reg = ((reg & (~m_RGA_ALPHA_CON_ENABLE) )| (s_RGA_ALPHA_CON_ENABLE(msg->alpha_rop_flag & 1)));\r
749     reg = ((reg & (~m_RGA_ALPHA_CON_A_OR_R_SEL)) | (s_RGA_ALPHA_CON_A_OR_R_SEL((msg->alpha_rop_flag >> 1) & 1)));\r
750     reg = ((reg & (~m_RGA_ALPHA_CON_ALPHA_MODE)) | (s_RGA_ALPHA_CON_ALPHA_MODE(alpha_mode)));\r
751     reg = ((reg & (~m_RGA_ALPHA_CON_PD_MODE)) | (s_RGA_ALPHA_CON_PD_MODE(msg->PD_mode)));\r
752     reg = ((reg & (~m_RGA_ALPHA_CON_SET_CONSTANT_VALUE)) | (s_RGA_ALPHA_CON_SET_CONSTANT_VALUE(msg->alpha_global_value)));\r
753     reg = ((reg & (~m_RGA_ALPHA_CON_PD_M_SEL)) | (s_RGA_ALPHA_CON_PD_M_SEL(msg->alpha_rop_flag >> 3)));\r
754     reg = ((reg & (~m_RGA_ALPHA_CON_FADING_ENABLE)) | (s_RGA_ALPHA_CON_FADING_ENABLE(msg->alpha_rop_flag >> 2)));\r
755     reg = ((reg & (~m_RGA_ALPHA_CON_ROP_MODE_SEL)) | (s_RGA_ALPHA_CON_ROP_MODE_SEL(rop_mode)));\r
756     reg = ((reg & (~m_RGA_ALPHA_CON_CAL_MODE_SEL)) | (s_RGA_ALPHA_CON_CAL_MODE_SEL(msg->alpha_rop_flag >> 4)));\r
757     reg = ((reg & (~m_RGA_ALPHA_CON_DITHER_ENABLE)) | (s_RGA_ALPHA_CON_DITHER_ENABLE(msg->alpha_rop_flag >> 5)));\r
758     reg = ((reg & (~m_RGA_ALPHA_CON_GRADIENT_CAL_MODE)) | (s_RGA_ALPHA_CON_GRADIENT_CAL_MODE(msg->alpha_rop_flag >> 6)));\r
759     reg = ((reg & (~m_RGA_ALPHA_CON_AA_SEL)) | (s_RGA_ALPHA_CON_AA_SEL(msg->alpha_rop_flag >> 7)));\r
760     \r
761     *bRGA_ALPHA_CON = reg;\r
762 \r
763     if(rop_mode == 0) {  \r
764         rop_con0 =  ROP3_code[(msg->rop_code & 0xff)];\r
765     }\r
766     else if(rop_mode == 1) {\r
767         rop_con0 =  ROP3_code[(msg->rop_code & 0xff)];\r
768     }\r
769     else if(rop_mode == 2) {\r
770         rop_con0 =  ROP3_code[(msg->rop_code & 0xff)];\r
771         rop_con1 =  ROP3_code[(msg->rop_code & 0xff00)>>8];\r
772     }\r
773         \r
774     bRGA_ROP_CON0 = (u32 *)(base + RGA_ROP_CON0_OFFSET);\r
775     bRGA_ROP_CON1 = (u32 *)(base + RGA_ROP_CON1_OFFSET);\r
776 \r
777     *bRGA_ROP_CON0 = (u32)rop_con0;\r
778     *bRGA_ROP_CON1 = (u32)rop_con1;            \r
779 }\r
780 \r
781 \r
782 /*************************************************************    \r
783 Func:        \r
784     RGA_set_color    \r
785 Description:        \r
786     fill color some relate reg bit\r
787     bg_color/fg_color\r
788 Author:        \r
789     ZhangShengqin    \r
790 Date:        \r
791     20012-2-2 10:59:25 \r
792 **************************************************************/\r
793 \r
794 void\r
795 RGA_set_color(u8 *base, const struct rga_req *msg)\r
796 {\r
797     u32 *bRGA_SRC_TR_COLOR0;\r
798     u32 *bRGA_SRC_TR_COLOR1;\r
799     u32 *bRGA_SRC_BG_COLOR;\r
800     u32 *bRGA_SRC_FG_COLOR;\r
801     \r
802         \r
803     bRGA_SRC_BG_COLOR  = (u32 *)(base + RGA_SRC_BG_COLOR_OFFSET);\r
804     bRGA_SRC_FG_COLOR  = (u32 *)(base + RGA_SRC_FG_COLOR_OFFSET);\r
805     \r
806     *bRGA_SRC_BG_COLOR = msg->bg_color;    /* 1bpp 0 */\r
807     *bRGA_SRC_FG_COLOR = msg->fg_color;    /* 1bpp 1 */\r
808     \r
809     bRGA_SRC_TR_COLOR0 = (u32 *)(base + RGA_SRC_TR_COLOR0_OFFSET);    \r
810     bRGA_SRC_TR_COLOR1 = (u32 *)(base + RGA_SRC_TR_COLOR1_OFFSET);\r
811 \r
812     *bRGA_SRC_TR_COLOR0 = msg->color_key_min;\r
813     *bRGA_SRC_TR_COLOR1 = msg->color_key_max;\r
814 }\r
815 \r
816 \r
817 /*************************************************************    \r
818 Func:        \r
819     RGA_set_fading    \r
820 Description:        \r
821     fill fading some relate reg bit\r
822 Author:        \r
823     ZhangShengqin    \r
824 Date:        \r
825     20012-2-2 10:59:25 \r
826 **************************************************************/\r
827 \r
828 s32\r
829 RGA_set_fading(u8 *base, const struct rga_req *msg)\r
830 {\r
831     u32 *bRGA_FADING_CON;\r
832     u8 r, g, b;\r
833     u32 reg = 0;\r
834 \r
835     bRGA_FADING_CON = (u32 *)(base + RGA_FADING_CON_OFFSET);\r
836 \r
837     b = msg->fading.b;\r
838     g = msg->fading.g;\r
839     r = msg->fading.r;\r
840 \r
841     reg = (r<<8) | (g<<16) | (b<<24) | reg;\r
842 \r
843     *bRGA_FADING_CON = reg; \r
844     \r
845     return 0;\r
846 }\r
847 \r
848 \r
849 /*************************************************************    \r
850 Func:        \r
851     RGA_set_pat    \r
852 Description:        \r
853     fill patten some relate reg bit\r
854 Author:        \r
855     ZhangShengqin    \r
856 Date:        \r
857     20012-2-2 10:59:25 \r
858 **************************************************************/\r
859 \r
860 s32\r
861 RGA_set_pat(u8 *base, const struct rga_req *msg)\r
862 {\r
863     u32 *bRGA_PAT_CON;\r
864     u32 *bRGA_PAT_START_POINT;\r
865     u32 reg = 0;\r
866 \r
867     bRGA_PAT_START_POINT = (u32 *)(base + RGA_PAT_START_POINT_OFFSET);\r
868 \r
869     bRGA_PAT_CON = (u32 *)(base + RGA_PAT_CON_OFFSET);\r
870     \r
871     *bRGA_PAT_START_POINT = (msg->pat.act_w * msg->pat.y_offset) + msg->pat.x_offset;\r
872 \r
873     reg = (msg->pat.act_w - 1) | ((msg->pat.act_h - 1) << 8) | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24);\r
874     *bRGA_PAT_CON = reg;\r
875 \r
876     return 0;\r
877 }\r
878 \r
879 \r
880 \r
881 \r
882 /*************************************************************    \r
883 Func:        \r
884     RGA_set_bitblt_reg_info    \r
885 Description:        \r
886     fill bitblt mode relate ren info\r
887 Author:        \r
888     ZhangShengqin    \r
889 Date:        \r
890     20012-2-2 10:59:25 \r
891 **************************************************************/\r
892 \r
893 void   \r
894 RGA_set_bitblt_reg_info(u8 *base, const struct rga_req * msg, TILE_INFO *tile)\r
895 {\r
896     u32 *bRGA_SRC_Y_MST;\r
897     u32 *bRGA_SRC_CB_MST;\r
898     u32 *bRGA_SRC_CR_MST;\r
899     u32 *bRGA_SRC_X_PARA;\r
900     u32 *bRGA_SRC_Y_PARA;\r
901     u32 *bRGA_SRC_TILE_XINFO;\r
902     u32 *bRGA_SRC_TILE_YINFO;\r
903     u32 *bRGA_SRC_TILE_H_INCR;\r
904     u32 *bRGA_SRC_TILE_V_INCR;\r
905     u32 *bRGA_SRC_TILE_OFFSETX;\r
906     u32 *bRGA_SRC_TILE_OFFSETY;\r
907 \r
908     u32 *bRGA_DST_MST;\r
909     u32 *bRGA_DST_CTR_INFO;\r
910 \r
911     s32 m0, m1, m2, m3;\r
912     s32 pos[8];\r
913     //s32 x_dx, x_dy, y_dx, y_dy;\r
914     s32 xmin, xmax, ymin, ymax;\r
915     s32 xp, yp;\r
916     u32 y_addr, u_addr, v_addr;\r
917     u32 pixel_width, stride;\r
918 \r
919     u_addr = v_addr = 0;\r
920 \r
921     /* src info */\r
922 \r
923     bRGA_SRC_Y_MST = (u32 *)(base + RGA_SRC_Y_MST_OFFSET);\r
924     bRGA_SRC_CB_MST = (u32 *)(base + RGA_SRC_CB_MST_OFFSET);\r
925     bRGA_SRC_CR_MST = (u32 *)(base + RGA_SRC_CR_MST_OFFSET);\r
926 \r
927     bRGA_SRC_X_PARA = (u32 *)(base + RGA_SRC_X_PARA_OFFSET);\r
928     bRGA_SRC_Y_PARA = (u32 *)(base + RGA_SRC_Y_PARA_OFFSET);\r
929         \r
930     bRGA_SRC_TILE_XINFO = (u32 *)(base + RGA_SRC_TILE_XINFO_OFFSET);\r
931     bRGA_SRC_TILE_YINFO = (u32 *)(base + RGA_SRC_TILE_YINFO_OFFSET);\r
932     bRGA_SRC_TILE_H_INCR = (u32 *)(base + RGA_SRC_TILE_H_INCR_OFFSET);\r
933     bRGA_SRC_TILE_V_INCR = (u32 *)(base + RGA_SRC_TILE_V_INCR_OFFSET);    \r
934     bRGA_SRC_TILE_OFFSETX = (u32 *)(base + RGA_SRC_TILE_OFFSETX_OFFSET);\r
935     bRGA_SRC_TILE_OFFSETY = (u32 *)(base + RGA_SRC_TILE_OFFSETY_OFFSET);\r
936 \r
937     bRGA_DST_MST = (u32 *)(base + RGA_DST_MST_OFFSET);\r
938     bRGA_DST_CTR_INFO = (u32 *)(base + RGA_DST_CTR_INFO_OFFSET);\r
939 \r
940     /* Matrix reg fill */   \r
941     m0 = (s32)(tile->matrix[0] >> 18);\r
942     m1 = (s32)(tile->matrix[1] >> 18);\r
943     m2 = (s32)(tile->matrix[2] >> 18);\r
944     m3 = (s32)(tile->matrix[3] >> 18);\r
945 \r
946     *bRGA_SRC_X_PARA = (m0 & 0xffff) | (m2 << 16);\r
947     *bRGA_SRC_Y_PARA = (m1 & 0xffff) | (m3 << 16);\r
948     \r
949     /* src tile information setting */    \r
950     if(msg->rotate_mode != 0)//add by hxx,2011.7.12,for rtl0707,when line scanning ,do not calc src tile info\r
951     {\r
952         *bRGA_SRC_TILE_XINFO = (tile->tile_start_x_coor & 0xffff) | (tile->tile_w << 16);\r
953         *bRGA_SRC_TILE_YINFO = (tile->tile_start_y_coor & 0xffff) | (tile->tile_h << 16);\r
954 \r
955         *bRGA_SRC_TILE_H_INCR = ((tile->x_dx) & 0xffff) | ((tile->x_dy) << 16);\r
956         *bRGA_SRC_TILE_V_INCR = ((tile->y_dx) & 0xffff) | ((tile->y_dy) << 16);\r
957 \r
958         *bRGA_SRC_TILE_OFFSETX = tile->tile_xoff;\r
959         *bRGA_SRC_TILE_OFFSETY = tile->tile_yoff;\r
960     }\r
961 \r
962     pixel_width = RGA_pixel_width_init(msg->src.format);\r
963     \r
964     stride = ((msg->src.vir_w * pixel_width) + 3) & (~3);\r
965 \r
966     if ((msg->rotate_mode == 1)||(msg->rotate_mode == 2)||(msg->rotate_mode == 3))\r
967     {\r
968         pos[0] = tile->tile_start_x_coor<<8;\r
969         pos[1] = tile->tile_start_y_coor<<8;\r
970 \r
971         pos[2] = pos[0];\r
972         pos[3] = pos[1] + tile->tile_h;\r
973 \r
974         pos[4] = pos[0] + tile->tile_w;\r
975         pos[5] = pos[1] + tile->tile_h;\r
976 \r
977         pos[6] = pos[0] + tile->tile_w;\r
978         pos[7] = pos[1];\r
979 \r
980         pos[0] >>= 11;\r
981         pos[1] >>= 11;\r
982 \r
983         pos[2] >>= 11;\r
984         pos[3] >>= 11;\r
985 \r
986         pos[4] >>= 11;\r
987         pos[5] >>= 11;\r
988 \r
989         pos[6] >>= 11;\r
990         pos[7] >>= 11;\r
991 \r
992         xmax = (MAX(MAX(MAX(pos[0], pos[2]), pos[4]), pos[6]) + 1);        \r
993         xmin = (MIN(MIN(MIN(pos[0], pos[2]), pos[4]), pos[6]));        \r
994 \r
995         ymax = (MAX(MAX(MAX(pos[1], pos[3]), pos[5]), pos[7]) + 1);        \r
996         ymin = (MIN(MIN(MIN(pos[1], pos[3]), pos[5]), pos[7])); \r
997 \r
998         xp = xmin + msg->src.x_offset;\r
999         yp = ymin + msg->src.y_offset;\r
1000 \r
1001         if (!((xmax < 0)||(xmin > msg->src.act_w - 1)||(ymax < 0)||(ymin > msg->src.act_h - 1)))\r
1002         {\r
1003             xp = CLIP(xp, msg->src.x_offset, msg->src.x_offset + msg->src.act_w - 1);\r
1004             yp = CLIP(yp, msg->src.y_offset, msg->src.y_offset + msg->src.act_h - 1);\r
1005         }\r
1006         \r
1007         switch(msg->src.format)\r
1008         {        \r
1009             case RK_FORMAT_YCbCr_420_P :\r
1010                 y_addr = msg->src.yrgb_addr + yp*stride + xp;\r
1011                 u_addr = msg->src.uv_addr + (yp>>1)*(stride>>1) + (xp>>1);\r
1012                 v_addr = msg->src.v_addr  + (yp>>1)*(stride>>1) + (xp>>1);\r
1013                 break;\r
1014             case RK_FORMAT_YCbCr_420_SP :\r
1015                 y_addr = msg->src.yrgb_addr + yp*stride + xp;\r
1016                 u_addr = msg->src.uv_addr + (yp>>1)*stride + ((xp>>1)<<1);                        \r
1017                 break;\r
1018             case RK_FORMAT_YCbCr_422_P : \r
1019                 y_addr = msg->src.yrgb_addr + yp*stride + xp;\r
1020                 u_addr = msg->src.uv_addr + (yp)*(stride>>1) + (xp>>1);\r
1021                 v_addr = msg->src.v_addr  + (yp)*(stride>>1) + (xp>>1);\r
1022                 break;\r
1023             case RK_FORMAT_YCbCr_422_SP:\r
1024                 y_addr = msg->src.yrgb_addr + yp*stride + xp;\r
1025                 u_addr = msg->src.uv_addr  + yp*stride + ((xp>>1)<<1);\r
1026                 break;\r
1027             case RK_FORMAT_YCrCb_420_P :\r
1028                 y_addr = msg->src.yrgb_addr + yp*stride + xp;\r
1029                 u_addr = msg->src.uv_addr + (yp>>1)*(stride>>1) + (xp>>1);\r
1030                 v_addr = msg->src.v_addr  + (yp>>1)*(stride>>1) + (xp>>1);\r
1031                 break;\r
1032             case RK_FORMAT_YCrCb_420_SP :\r
1033                 y_addr = msg->src.yrgb_addr + yp*stride + xp;\r
1034                 u_addr = msg->src.uv_addr + (yp>>1)*stride + ((xp>>1)<<1);                        \r
1035                 break;\r
1036             case RK_FORMAT_YCrCb_422_P : \r
1037                 y_addr = msg->src.yrgb_addr + yp*stride + xp;\r
1038                 u_addr = msg->src.uv_addr + (yp)*(stride>>1) + (xp>>1);\r
1039                 v_addr = msg->src.v_addr  + (yp)*(stride>>1) + (xp>>1);\r
1040                 break;\r
1041             case RK_FORMAT_YCrCb_422_SP:\r
1042                 y_addr = msg->src.yrgb_addr + yp*stride + xp;\r
1043                 u_addr = msg->src.uv_addr  + yp*stride + ((xp>>1)<<1);\r
1044                 break;                    \r
1045             default :\r
1046                 y_addr = msg->src.yrgb_addr + yp*stride + xp*pixel_width;\r
1047                 break;\r
1048         }\r
1049 \r
1050         *bRGA_SRC_Y_MST = y_addr;\r
1051         *bRGA_SRC_CB_MST = u_addr;\r
1052         *bRGA_SRC_CR_MST = v_addr;\r
1053     }\r
1054     \r
1055     /*dst info*/\r
1056     pixel_width = RGA_pixel_width_init(msg->dst.format);\r
1057     stride = (msg->dst.vir_w * pixel_width + 3) & (~3);\r
1058     *bRGA_DST_MST = (u32)msg->dst.yrgb_addr + (tile->dst_ctrl.y_off * stride) + (tile->dst_ctrl.x_off * pixel_width);\r
1059     *bRGA_DST_CTR_INFO = (tile->dst_ctrl.w) | ((tile->dst_ctrl.h) << 16);\r
1060 }\r
1061 \r
1062 \r
1063 \r
1064 \r
1065 /*************************************************************    \r
1066 Func:        \r
1067     RGA_set_color_palette_reg_info    \r
1068 Description:        \r
1069     fill color palette process some relate reg bit\r
1070 Author:        \r
1071     ZhangShengqin    \r
1072 Date:        \r
1073     20012-2-2 10:59:25 \r
1074 **************************************************************/\r
1075 \r
1076 void\r
1077 RGA_set_color_palette_reg_info(u8 *base, const struct rga_req *msg)\r
1078 {\r
1079     u32 *bRGA_SRC_Y_MST;\r
1080     u32 p;\r
1081     s16 x_off, y_off;\r
1082     u16 src_stride;\r
1083     u8  shift;\r
1084     u16 sw, byte_num;\r
1085 \r
1086     x_off = msg->src.x_offset;\r
1087     y_off = msg->src.y_offset;\r
1088 \r
1089     sw = msg->src.vir_w;\r
1090     shift = 3 - (msg->palette_mode & 3);    \r
1091     byte_num = sw >> shift;\r
1092     src_stride = (byte_num + 3) & (~3);\r
1093    \r
1094     p = msg->src.yrgb_addr;        \r
1095     p = p + (x_off>>shift) + y_off*src_stride;\r
1096 \r
1097     bRGA_SRC_Y_MST = (u32 *)(base + RGA_SRC_Y_MST_OFFSET); \r
1098     *bRGA_SRC_Y_MST = (u32)p;        \r
1099 }\r
1100 \r
1101 \r
1102 /*************************************************************    \r
1103 Func:        \r
1104     RGA_set_color_fill_reg_info    \r
1105 Description:        \r
1106     fill color fill process some relate reg bit\r
1107 Author:        \r
1108     ZhangShengqin    \r
1109 Date:        \r
1110     20012-2-2 10:59:25 \r
1111 **************************************************************/\r
1112 void\r
1113 RGA_set_color_fill_reg_info(u8 *base, const struct rga_req *msg)\r
1114 {\r
1115 \r
1116     u32 *bRGA_CP_GR_A;\r
1117     u32 *bRGA_CP_GR_B;\r
1118     u32 *bRGA_CP_GR_G;\r
1119     u32 *bRGA_CP_GR_R;\r
1120 \r
1121     u32 *bRGA_PAT_CON;\r
1122 \r
1123     bRGA_CP_GR_A = (u32 *)(base + RGA_CP_GR_A_OFFSET);\r
1124     bRGA_CP_GR_B = (u32 *)(base + RGA_CP_GR_B_OFFSET);\r
1125     bRGA_CP_GR_G = (u32 *)(base + RGA_CP_GR_G_OFFSET);\r
1126     bRGA_CP_GR_R = (u32 *)(base + RGA_CP_GR_R_OFFSET);\r
1127 \r
1128     bRGA_PAT_CON = (u32 *)(base + RGA_PAT_CON_OFFSET);\r
1129 \r
1130     *bRGA_CP_GR_A = (msg->gr_color.gr_x_a & 0xffff) | (msg->gr_color.gr_y_a << 16);\r
1131     *bRGA_CP_GR_B = (msg->gr_color.gr_x_b & 0xffff) | (msg->gr_color.gr_y_b << 16);\r
1132     *bRGA_CP_GR_G = (msg->gr_color.gr_x_g & 0xffff) | (msg->gr_color.gr_y_g << 16);\r
1133     *bRGA_CP_GR_R = (msg->gr_color.gr_x_r & 0xffff) | (msg->gr_color.gr_y_r << 16);\r
1134 \r
1135     *bRGA_PAT_CON = (msg->pat.vir_w-1) | ((msg->pat.vir_h-1) << 8) | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24);\r
1136     \r
1137 }\r
1138 \r
1139 \r
1140 /*************************************************************    \r
1141 Func:        \r
1142     RGA_set_line_drawing_reg_info    \r
1143 Description:        \r
1144     fill line drawing process some relate reg bit\r
1145 Author:        \r
1146     ZhangShengqin    \r
1147 Date:        \r
1148     20012-2-2 10:59:25 \r
1149 **************************************************************/\r
1150 \r
1151 s32 RGA_set_line_drawing_reg_info(u8 *base, const struct rga_req *msg)\r
1152 {\r
1153     u32 *bRGA_LINE_DRAW;\r
1154     u32 *bRGA_DST_VIR_INFO;\r
1155     u32 *bRGA_LINE_DRAW_XY_INFO;\r
1156     u32 *bRGA_LINE_DRAW_WIDTH;\r
1157     u32 *bRGA_LINE_DRAWING_COLOR;    \r
1158     u32 *bRGA_LINE_DRAWING_MST;\r
1159     \r
1160     u32  reg = 0;\r
1161 \r
1162     s16 x_width, y_width;\r
1163     u16 abs_x, abs_y, delta;\r
1164     u16 stride;\r
1165     u8 pw;\r
1166     u32 start_addr;\r
1167     u8 line_dir, dir_major, dir_semi_major;\r
1168     u16 major_width;\r
1169     \r
1170     bRGA_LINE_DRAW = (u32 *)(base + RGA_LINE_DRAW_OFFSET);\r
1171     bRGA_DST_VIR_INFO = (u32 *)(base + RGA_DST_VIR_INFO_OFFSET);\r
1172     bRGA_LINE_DRAW_XY_INFO = (u32 *)(base + RGA_LINE_DRAW_XY_INFO_OFFSET);\r
1173     bRGA_LINE_DRAW_WIDTH = (u32 *)(base + RGA_LINE_DRAWING_WIDTH_OFFSET);\r
1174     bRGA_LINE_DRAWING_COLOR = (u32 *)(base + RGA_LINE_DRAWING_COLOR_OFFSET);\r
1175     bRGA_LINE_DRAWING_MST = (u32 *)(base + RGA_LINE_DRAWING_MST_OFFSET);\r
1176 \r
1177     pw = RGA_pixel_width_init(msg->dst.format);\r
1178 \r
1179     stride = (msg->dst.vir_w * pw + 3) & (~3);\r
1180 \r
1181     start_addr = msg->dst.yrgb_addr \r
1182                 + (msg->line_draw_info.start_point.y * stride) \r
1183                 + (msg->line_draw_info.start_point.x * pw);\r
1184 \r
1185     x_width = msg->line_draw_info.start_point.x - msg->line_draw_info.end_point.x;\r
1186     y_width = msg->line_draw_info.start_point.y - msg->line_draw_info.end_point.y;\r
1187 \r
1188     abs_x = abs(x_width);\r
1189     abs_y = abs(y_width); \r
1190     \r
1191     if (abs_x >= abs_y)\r
1192     {\r
1193         if (y_width > 0)\r
1194             dir_semi_major = 1;\r
1195         else\r
1196             dir_semi_major = 0;\r
1197 \r
1198         if (x_width > 0)        \r
1199             dir_major = 1;        \r
1200         else\r
1201             dir_major = 0;\r
1202 \r
1203         if((abs_x == 0)||(abs_y == 0))        \r
1204             delta = 0;        \r
1205         else        \r
1206             delta = (abs_y<<12)/abs_x;\r
1207 \r
1208         if (delta >> 12)\r
1209             delta -= 1;\r
1210                         \r
1211         major_width = abs_x;        \r
1212         line_dir = 0;\r
1213     }\r
1214     else\r
1215     {\r
1216         if (x_width > 0)\r
1217             dir_semi_major = 1;\r
1218         else\r
1219             dir_semi_major = 0;\r
1220 \r
1221         if (y_width > 0)\r
1222             dir_major = 1;\r
1223         else\r
1224             dir_major = 0;\r
1225         \r
1226         delta = (abs_x<<12)/abs_y;        \r
1227         major_width = abs_y;\r
1228         line_dir = 1;\r
1229     }\r
1230  \r
1231     reg = (reg & (~m_RGA_LINE_DRAW_MAJOR_WIDTH))     | (s_RGA_LINE_DRAW_MAJOR_WIDTH(major_width));\r
1232     reg = (reg & (~m_RGA_LINE_DRAW_LINE_DIRECTION))  | (s_RGA_LINE_DRAW_LINE_DIRECTION(line_dir));\r
1233     reg = (reg & (~m_RGA_LINE_DRAW_LINE_WIDTH))      | (s_RGA_LINE_DRAW_LINE_WIDTH(msg->line_draw_info.line_width - 1));\r
1234     reg = (reg & (~m_RGA_LINE_DRAW_INCR_VALUE))      | (s_RGA_LINE_DRAW_INCR_VALUE(delta));    \r
1235     reg = (reg & (~m_RGA_LINE_DRAW_DIR_SEMI_MAJOR))  | (s_RGA_LINE_DRAW_DIR_SEMI_MAJOR(dir_semi_major));\r
1236     reg = (reg & (~m_RGA_LINE_DRAW_DIR_MAJOR))       | (s_RGA_LINE_DRAW_DIR_MAJOR(dir_major));\r
1237     reg = (reg & (~m_RGA_LINE_DRAW_LAST_POINT))      | (s_RGA_LINE_DRAW_LAST_POINT(msg->line_draw_info.flag >> 1));\r
1238     reg = (reg & (~m_RGA_LINE_DRAW_ANTI_ALISING))    | (s_RGA_LINE_DRAW_ANTI_ALISING(msg->line_draw_info.flag));    \r
1239 \r
1240     *bRGA_LINE_DRAW = reg;\r
1241     \r
1242     reg = (msg->line_draw_info.start_point.x & 0xfff) | ((msg->line_draw_info.start_point.y & 0xfff) << 16);\r
1243     *bRGA_LINE_DRAW_XY_INFO = reg;\r
1244     \r
1245     *bRGA_LINE_DRAW_WIDTH = msg->dst.vir_w;\r
1246 \r
1247     *bRGA_LINE_DRAWING_COLOR = msg->line_draw_info.color;\r
1248 \r
1249     *bRGA_LINE_DRAWING_MST = (u32)start_addr;\r
1250            \r
1251     return 0;\r
1252 }\r
1253 \r
1254 \r
1255 /*full*/\r
1256 s32\r
1257 RGA_set_filter_reg_info(u8 *base, const struct rga_req *msg)\r
1258 {    \r
1259     u32 *bRGA_BLUR_SHARP_INFO;\r
1260     u32  reg = 0;\r
1261     \r
1262     bRGA_BLUR_SHARP_INFO = (u32 *)(base + RGA_ALPHA_CON_OFFSET);\r
1263 \r
1264     reg = *bRGA_BLUR_SHARP_INFO;\r
1265 \r
1266     reg = ((reg & (~m_RGA_BLUR_SHARP_FILTER_TYPE)) | (s_RGA_BLUR_SHARP_FILTER_TYPE(msg->bsfilter_flag & 3)));\r
1267     reg = ((reg & (~m_RGA_BLUR_SHARP_FILTER_MODE)) | (s_RGA_BLUR_SHARP_FILTER_MODE(msg->bsfilter_flag >>2)));\r
1268 \r
1269     *bRGA_BLUR_SHARP_INFO = reg;\r
1270        \r
1271     return 0; \r
1272 }\r
1273 \r
1274 \r
1275 /*full*/\r
1276 s32\r
1277 RGA_set_pre_scale_reg_info(u8 *base, const struct rga_req *msg)\r
1278 {\r
1279    u32 *bRGA_PRE_SCALE_INFO; \r
1280    u32 reg = 0;\r
1281    u32 h_ratio = 0;\r
1282    u32 v_ratio = 0;\r
1283    u32 ps_yuv_flag = 0;\r
1284    u32 src_width, src_height;\r
1285    u32 dst_width, dst_height;\r
1286 \r
1287    src_width = msg->src.act_w;\r
1288    src_height = msg->src.act_h;\r
1289 \r
1290    dst_width = msg->dst.act_w;\r
1291    dst_height = msg->dst.act_h;\r
1292 \r
1293    h_ratio = (src_width <<16) / dst_width;\r
1294    v_ratio = (src_height<<16) / dst_height;\r
1295 \r
1296    if (h_ratio <= (1<<16))    \r
1297        h_ratio = 0;\r
1298    else if (h_ratio <= (2<<16))\r
1299        h_ratio = 1;\r
1300    else if (h_ratio <= (4<<16))\r
1301        h_ratio = 2;\r
1302    else if (h_ratio <= (8<<16))\r
1303        h_ratio = 3;\r
1304 \r
1305    if (v_ratio <= (1<<16))    \r
1306        v_ratio = 0;\r
1307    else if (v_ratio <= (2<<16))\r
1308        v_ratio = 1;\r
1309    else if (v_ratio <= (4<<16))\r
1310        v_ratio = 2;\r
1311    else if (v_ratio <= (8<<16))\r
1312        v_ratio = 3;\r
1313 \r
1314    if(msg->src.format == msg->dst.format)\r
1315         ps_yuv_flag = 0;    \r
1316     else    \r
1317         ps_yuv_flag = 1;   \r
1318 \r
1319    bRGA_PRE_SCALE_INFO = (u32 *)(base + RGA_ALPHA_CON_OFFSET);\r
1320    \r
1321    reg = *bRGA_PRE_SCALE_INFO;\r
1322    reg = ((reg & (~m_RGA_PRE_SCALE_HOR_RATIO)) | (s_RGA_PRE_SCALE_HOR_RATIO((u8)h_ratio)));\r
1323    reg = ((reg & (~m_RGA_PRE_SCALE_VER_RATIO)) | (s_RGA_PRE_SCALE_VER_RATIO((u8)v_ratio)));\r
1324    reg = ((reg & (~m_RGA_PRE_SCALE_OUTPUT_FORMAT)) | (s_RGA_PRE_SCALE_OUTPUT_FORMAT(ps_yuv_flag)));\r
1325 \r
1326    *bRGA_PRE_SCALE_INFO = reg;\r
1327        \r
1328    return 0; \r
1329 }\r
1330 \r
1331 \r
1332 \r
1333 /*full*/\r
1334 int \r
1335 RGA_set_update_palette_table_reg_info(u8 *base, const struct rga_req *msg)\r
1336 {\r
1337     u32 *bRGA_LUT_MST;\r
1338 \r
1339     if (!msg->LUT_addr) {        \r
1340         return -1;\r
1341     }        \r
1342 \r
1343     bRGA_LUT_MST  = (u32 *)(base + RGA_LUT_MST_OFFSET);\r
1344     \r
1345     *bRGA_LUT_MST = (u32)msg->LUT_addr;    \r
1346 \r
1347     return 0;\r
1348 }\r
1349 \r
1350 \r
1351 \r
1352 /*full*/\r
1353 int\r
1354 RGA_set_update_patten_buff_reg_info(u8 *base, const struct rga_req *msg)\r
1355 {\r
1356     u32 *bRGA_PAT_MST;\r
1357     u32 *bRGA_PAT_CON;\r
1358     u32 *bRGA_PAT_START_POINT;\r
1359     u32 reg = 0;\r
1360     rga_img_info_t *pat;\r
1361 \r
1362     pat = (rga_img_info_t *)&msg->pat;\r
1363 \r
1364     bRGA_PAT_START_POINT = (u32 *)(base + RGA_PAT_START_POINT_OFFSET);\r
1365     bRGA_PAT_MST = (u32 *)(base + RGA_PAT_MST_OFFSET);\r
1366     bRGA_PAT_CON = (u32 *)(base + RGA_PAT_CON_OFFSET);\r
1367 \r
1368     if ( !pat->yrgb_addr ) {\r
1369         return -1;\r
1370     }    \r
1371     *bRGA_PAT_MST = (u32)pat->yrgb_addr;\r
1372 \r
1373     if ((pat->vir_w > 256)||(pat->x_offset > 256)||(pat->y_offset > 256)) {\r
1374         return -1;\r
1375     }\r
1376     *bRGA_PAT_START_POINT = (pat->vir_w * pat->y_offset) + pat->x_offset;\r
1377 \r
1378     reg = (pat->vir_w-1) | ((pat->vir_h-1) << 8) | (pat->x_offset << 16) | (pat->y_offset << 24);\r
1379     *bRGA_PAT_CON = reg;    \r
1380     \r
1381     return 0;\r
1382 }\r
1383 \r
1384 \r
1385 /*************************************************************    \r
1386 Func:        \r
1387     RGA_set_mmu_ctrl_reg_info    \r
1388 Description:        \r
1389     fill mmu relate some reg info    \r
1390 Author:        \r
1391     ZhangShengqin    \r
1392 Date:        \r
1393     20012-2-2 10:59:25 \r
1394 **************************************************************/\r
1395 \r
1396 s32\r
1397 RGA_set_mmu_ctrl_reg_info(u8 *base, const struct rga_req *msg)\r
1398 {\r
1399     u32 *RGA_MMU_TLB, *RGA_MMU_CTRL_ADDR;\r
1400     u32  mmu_addr;\r
1401     u8   TLB_size, mmu_enable, src_flag, dst_flag, CMD_flag;\r
1402     u32  reg = 0;\r
1403 \r
1404     mmu_addr = (u32)msg->mmu_info.base_addr;\r
1405     TLB_size = (msg->mmu_info.mmu_flag >> 4) & 0x3;\r
1406     mmu_enable = msg->mmu_info.mmu_flag & 0x1;\r
1407     \r
1408     src_flag = (msg->mmu_info.mmu_flag >> 1) & 0x1;\r
1409     dst_flag = (msg->mmu_info.mmu_flag >> 2) & 0x1;\r
1410     CMD_flag = (msg->mmu_info.mmu_flag >> 3) & 0x1;\r
1411 \r
1412     RGA_MMU_TLB = (u32 *)(base + RGA_MMU_TLB_OFFSET);\r
1413     RGA_MMU_CTRL_ADDR = (u32 *)(base + RGA_FADING_CON_OFFSET);\r
1414 \r
1415     reg = ((reg & (~m_RGA_MMU_CTRL_TLB_ADDR)) | s_RGA_MMU_CTRL_TLB_ADDR(mmu_addr));\r
1416     *RGA_MMU_TLB = reg;\r
1417 \r
1418     reg = *RGA_MMU_CTRL_ADDR;    \r
1419     reg = ((reg & (~m_RGA_MMU_CTRL_PAGE_TABLE_SIZE)) | s_RGA_MMU_CTRL_PAGE_TABLE_SIZE(TLB_size));\r
1420     reg = ((reg & (~m_RGA_MMU_CTRL_MMU_ENABLE)) | s_RGA_MMU_CTRL_MMU_ENABLE(mmu_enable));\r
1421     reg = ((reg & (~m_RGA_MMU_CTRL_SRC_FLUSH)) | s_RGA_MMU_CTRL_SRC_FLUSH(1));\r
1422     reg = ((reg & (~m_RGA_MMU_CTRL_DST_FLUSH)) | s_RGA_MMU_CTRL_DST_FLUSH(1));\r
1423     reg = ((reg & (~m_RGA_MMU_CTRL_CMD_CHAN_FLUSH)) | s_RGA_MMU_CTRL_CMD_CHAN_FLUSH(CMD_flag));\r
1424     *RGA_MMU_CTRL_ADDR = reg;\r
1425 \r
1426     return 0;\r
1427 }\r
1428 \r
1429 \r
1430 \r
1431 /*************************************************************    \r
1432 Func:        \r
1433     RGA_gen_reg_info    \r
1434 Description:        \r
1435     Generate RGA command reg list from rga_req struct.    \r
1436 Author:        \r
1437     ZhangShengqin    \r
1438 Date:        \r
1439     20012-2-2 10:59:25 \r
1440 **************************************************************/\r
1441 unsigned int\r
1442 RGA_gen_reg_info(const struct rga_req *msg, unsigned char *base)\r
1443 {\r
1444     TILE_INFO tile;\r
1445 \r
1446     memset(base, 0x0, 28*4);    \r
1447     RGA_set_mode_ctrl(base, msg);\r
1448     \r
1449     switch(msg->render_mode)\r
1450     {\r
1451         case bitblt_mode :\r
1452             RGA_set_alpha_rop(base, msg);\r
1453             RGA_set_src(base, msg);\r
1454             RGA_set_dst(base, msg);    \r
1455             RGA_set_color(base, msg);\r
1456             RGA_set_fading(base, msg);\r
1457             RGA_set_pat(base, msg);            \r
1458             matrix_cal(msg, &tile);\r
1459             dst_ctrl_cal(msg, &tile);\r
1460             src_tile_info_cal(msg, &tile);\r
1461             RGA_set_bitblt_reg_info(base, msg, &tile); \r
1462             break;\r
1463         case color_palette_mode :\r
1464             RGA_set_src(base, msg);\r
1465             RGA_set_dst(base, msg);    \r
1466             RGA_set_color(base, msg);\r
1467             RGA_set_color_palette_reg_info(base, msg);\r
1468             break;\r
1469         case color_fill_mode :\r
1470             RGA_set_dst(base, msg);    \r
1471             RGA_set_color(base, msg);\r
1472             RGA_set_pat(base, msg);\r
1473             RGA_set_color_fill_reg_info(base, msg);\r
1474             break;\r
1475         case line_point_drawing_mode :\r
1476             RGA_set_alpha_rop(base, msg);\r
1477             RGA_set_dst(base, msg);\r
1478             RGA_set_color(base, msg);\r
1479             RGA_set_line_drawing_reg_info(base, msg);\r
1480             break;\r
1481         case blur_sharp_filter_mode :\r
1482             RGA_set_src(base, msg);\r
1483             RGA_set_dst(base, msg);\r
1484             RGA_set_filter_reg_info(base, msg);\r
1485             break;\r
1486         case pre_scaling_mode :\r
1487             RGA_set_src(base, msg);\r
1488             RGA_set_dst(base, msg); \r
1489             RGA_set_pre_scale_reg_info(base, msg);\r
1490             break;\r
1491         case update_palette_table_mode :\r
1492             if (RGA_set_update_palette_table_reg_info(base, msg)) {\r
1493                 return -1;\r
1494             }\r
1495                         break;\r
1496         case update_patten_buff_mode:\r
1497             if (RGA_set_update_patten_buff_reg_info(base, msg)){                \r
1498                 return -1;\r
1499             }\r
1500                 \r
1501             break;\r
1502     }\r
1503 \r
1504     RGA_set_mmu_ctrl_reg_info(base, msg);\r
1505 \r
1506     return 0;\r
1507 }\r
1508 \r
1509 \r
1510 \r