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