xref: /OK3568_Linux_fs/kernel/drivers/video/rockchip/rga2/rga2_reg_info.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun //#include <linux/kernel.h>
4*4882a593Smuzhiyun #include <linux/memory.h>
5*4882a593Smuzhiyun #include <linux/kernel.h>
6*4882a593Smuzhiyun #include <linux/init.h>
7*4882a593Smuzhiyun #include <linux/module.h>
8*4882a593Smuzhiyun #include <linux/platform_device.h>
9*4882a593Smuzhiyun #include <linux/sched.h>
10*4882a593Smuzhiyun #include <linux/mutex.h>
11*4882a593Smuzhiyun #include <linux/err.h>
12*4882a593Smuzhiyun #include <linux/clk.h>
13*4882a593Smuzhiyun #include <asm/delay.h>
14*4882a593Smuzhiyun #include <linux/dma-mapping.h>
15*4882a593Smuzhiyun #include <linux/delay.h>
16*4882a593Smuzhiyun #include <asm/io.h>
17*4882a593Smuzhiyun #include <linux/irq.h>
18*4882a593Smuzhiyun #include <linux/interrupt.h>
19*4882a593Smuzhiyun #include <linux/fs.h>
20*4882a593Smuzhiyun #include <linux/uaccess.h>
21*4882a593Smuzhiyun #include <linux/miscdevice.h>
22*4882a593Smuzhiyun #include <linux/poll.h>
23*4882a593Smuzhiyun #include <linux/delay.h>
24*4882a593Smuzhiyun #include <linux/wait.h>
25*4882a593Smuzhiyun #include <linux/syscalls.h>
26*4882a593Smuzhiyun #include <linux/timer.h>
27*4882a593Smuzhiyun #include <linux/time.h>
28*4882a593Smuzhiyun #include <asm/cacheflush.h>
29*4882a593Smuzhiyun #include <linux/slab.h>
30*4882a593Smuzhiyun #include <linux/fb.h>
31*4882a593Smuzhiyun #include <linux/wakelock.h>
32*4882a593Smuzhiyun #include <linux/version.h>
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include "rga2_reg_info.h"
35*4882a593Smuzhiyun #include "rga2_type.h"
36*4882a593Smuzhiyun #include "rga2_rop.h"
37*4882a593Smuzhiyun #include "rga2.h"
38*4882a593Smuzhiyun 
RGA2_reg_get_param(unsigned char * base,struct rga2_req * msg)39*4882a593Smuzhiyun static void RGA2_reg_get_param(unsigned char *base, struct rga2_req *msg)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun     RK_U32 *bRGA_SRC_INFO;
42*4882a593Smuzhiyun     RK_U32 *bRGA_SRC_X_FACTOR;
43*4882a593Smuzhiyun     RK_U32 *bRGA_SRC_Y_FACTOR;
44*4882a593Smuzhiyun     RK_U32 sw, sh;
45*4882a593Smuzhiyun     RK_U32 dw, dh;
46*4882a593Smuzhiyun     RK_U32 param_x, param_y;
47*4882a593Smuzhiyun     RK_U8 x_flag, y_flag;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun     RK_U32 reg;
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun     bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);
52*4882a593Smuzhiyun     reg = *bRGA_SRC_INFO;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun     bRGA_SRC_X_FACTOR = (RK_U32 *)(base + RGA2_SRC_X_FACTOR_OFFSET);
55*4882a593Smuzhiyun     bRGA_SRC_Y_FACTOR = (RK_U32 *)(base + RGA2_SRC_Y_FACTOR_OFFSET);
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun     x_flag = y_flag = 0;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun     if(((msg->rotate_mode & 0x3) == 1) || ((msg->rotate_mode & 0x3) == 3))
60*4882a593Smuzhiyun     {
61*4882a593Smuzhiyun         dw = msg->dst.act_h;
62*4882a593Smuzhiyun         dh = msg->dst.act_w;
63*4882a593Smuzhiyun     }
64*4882a593Smuzhiyun     else
65*4882a593Smuzhiyun     {
66*4882a593Smuzhiyun         dw = msg->dst.act_w;
67*4882a593Smuzhiyun         dh = msg->dst.act_h;
68*4882a593Smuzhiyun     }
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun     sw = msg->src.act_w;
71*4882a593Smuzhiyun     sh = msg->src.act_h;
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun     if (sw > dw)
74*4882a593Smuzhiyun     {
75*4882a593Smuzhiyun         x_flag = 1;
76*4882a593Smuzhiyun         #if SCALE_DOWN_LARGE
77*4882a593Smuzhiyun         param_x = ((dw) << 16) / (sw) + 1;
78*4882a593Smuzhiyun 		#else
79*4882a593Smuzhiyun         param_x = ((dw) << 16) / (sw);
80*4882a593Smuzhiyun         #endif
81*4882a593Smuzhiyun         *bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 0 );
82*4882a593Smuzhiyun     }
83*4882a593Smuzhiyun     else if (sw < dw)
84*4882a593Smuzhiyun     {
85*4882a593Smuzhiyun         x_flag = 2;
86*4882a593Smuzhiyun         #if 1//SCALE_MINUS1
87*4882a593Smuzhiyun         param_x = ((sw - 1) << 16) / (dw - 1);
88*4882a593Smuzhiyun         #else
89*4882a593Smuzhiyun         param_x = ((sw) << 16) / (dw);
90*4882a593Smuzhiyun 		#endif
91*4882a593Smuzhiyun         *bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 16);
92*4882a593Smuzhiyun     }
93*4882a593Smuzhiyun     else
94*4882a593Smuzhiyun     {
95*4882a593Smuzhiyun         *bRGA_SRC_X_FACTOR = 0;//((1 << 14) << 16) | (1 << 14);
96*4882a593Smuzhiyun     }
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun     if (sh > dh)
99*4882a593Smuzhiyun     {
100*4882a593Smuzhiyun         y_flag = 1;
101*4882a593Smuzhiyun         #if SCALE_DOWN_LARGE
102*4882a593Smuzhiyun         param_y = ((dh) << 16) / (sh) + 1;
103*4882a593Smuzhiyun 		#else
104*4882a593Smuzhiyun         param_y = ((dh) << 16) / (sh);
105*4882a593Smuzhiyun         #endif
106*4882a593Smuzhiyun         *bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 0 );
107*4882a593Smuzhiyun     }
108*4882a593Smuzhiyun     else if (sh < dh)
109*4882a593Smuzhiyun     {
110*4882a593Smuzhiyun         y_flag = 2;
111*4882a593Smuzhiyun         #if 1//SCALE_MINUS1
112*4882a593Smuzhiyun         param_y = ((sh - 1) << 16) / (dh - 1);
113*4882a593Smuzhiyun         #else
114*4882a593Smuzhiyun         param_y = ((sh) << 16) / (dh);
115*4882a593Smuzhiyun 		#endif
116*4882a593Smuzhiyun         *bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 16);
117*4882a593Smuzhiyun     }
118*4882a593Smuzhiyun     else
119*4882a593Smuzhiyun     {
120*4882a593Smuzhiyun         *bRGA_SRC_Y_FACTOR = 0;//((1 << 14) << 16) | (1 << 14);
121*4882a593Smuzhiyun     }
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE(x_flag)));
124*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE(y_flag)));
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun 
RGA2_set_mode_ctrl(u8 * base,struct rga2_req * msg)127*4882a593Smuzhiyun static void RGA2_set_mode_ctrl(u8 *base, struct rga2_req *msg)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun     RK_U32 *bRGA_MODE_CTL;
130*4882a593Smuzhiyun     RK_U32 reg = 0;
131*4882a593Smuzhiyun     RK_U32 render_mode = msg->render_mode;
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun     bRGA_MODE_CTL = (u32 *)(base + RGA2_MODE_CTRL_OFFSET);
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun     if(msg->render_mode == 4)
136*4882a593Smuzhiyun     {
137*4882a593Smuzhiyun         render_mode = 3;
138*4882a593Smuzhiyun     }
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_MODE_CTRL_SW_RENDER_MODE)) | (s_RGA2_MODE_CTRL_SW_RENDER_MODE(render_mode)));
141*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_MODE_CTRL_SW_BITBLT_MODE)) | (s_RGA2_MODE_CTRL_SW_BITBLT_MODE(msg->bitblt_mode)));
142*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_MODE_CTRL_SW_CF_ROP4_PAT)) | (s_RGA2_MODE_CTRL_SW_CF_ROP4_PAT(msg->color_fill_mode)));
143*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_MODE_CTRL_SW_ALPHA_ZERO_KET)) | (s_RGA2_MODE_CTRL_SW_ALPHA_ZERO_KET(msg->alpha_zero_key)));
144*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_MODE_CTRL_SW_GRADIENT_SAT)) | (s_RGA2_MODE_CTRL_SW_GRADIENT_SAT(msg->alpha_rop_flag >> 7)));
145*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_MODE_CTRL_SW_INTR_CF_E)) | (s_RGA2_MODE_CTRL_SW_INTR_CF_E(msg->CMD_fin_int_enable)));
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun     *bRGA_MODE_CTL = reg;
148*4882a593Smuzhiyun }
149*4882a593Smuzhiyun 
RGA2_set_reg_src_info(RK_U8 * base,struct rga2_req * msg)150*4882a593Smuzhiyun static void RGA2_set_reg_src_info(RK_U8 *base, struct rga2_req *msg)
151*4882a593Smuzhiyun {
152*4882a593Smuzhiyun     RK_U32 *bRGA_SRC_INFO;
153*4882a593Smuzhiyun     RK_U32 *bRGA_SRC_BASE0, *bRGA_SRC_BASE1, *bRGA_SRC_BASE2;
154*4882a593Smuzhiyun     RK_U32 *bRGA_SRC_VIR_INFO;
155*4882a593Smuzhiyun     RK_U32 *bRGA_SRC_ACT_INFO;
156*4882a593Smuzhiyun     RK_U32 *bRGA_MASK_ADDR;
157*4882a593Smuzhiyun 	RK_U32 *bRGA_SRC_TR_COLOR0, *bRGA_SRC_TR_COLOR1;
158*4882a593Smuzhiyun 	RK_U8 src_fmt_yuv400_en = 0;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun     RK_U32 reg = 0;
161*4882a593Smuzhiyun     RK_U8 src0_format = 0;
162*4882a593Smuzhiyun 
163*4882a593Smuzhiyun     RK_U8 src0_rb_swp = 0;
164*4882a593Smuzhiyun     RK_U8 src0_rgb_pack = 0;
165*4882a593Smuzhiyun     RK_U8 src0_alpha_swp = 0;
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun     RK_U8 src0_cbcr_swp = 0;
168*4882a593Smuzhiyun     RK_U8 pixel_width = 1;
169*4882a593Smuzhiyun     RK_U32 stride = 0;
170*4882a593Smuzhiyun     RK_U32 uv_stride = 0;
171*4882a593Smuzhiyun     RK_U32 mask_stride = 0;
172*4882a593Smuzhiyun     RK_U32 ydiv = 1, xdiv = 2;
173*4882a593Smuzhiyun     RK_U8  yuv10 = 0;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun     RK_U32 sw, sh;
176*4882a593Smuzhiyun     RK_U32 dw, dh;
177*4882a593Smuzhiyun     RK_U8 rotate_mode;
178*4882a593Smuzhiyun     RK_U8 scale_w_flag, scale_h_flag;
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun     bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun     bRGA_SRC_BASE0 = (RK_U32 *)(base + RGA2_SRC_BASE0_OFFSET);
183*4882a593Smuzhiyun     bRGA_SRC_BASE1 = (RK_U32 *)(base + RGA2_SRC_BASE1_OFFSET);
184*4882a593Smuzhiyun     bRGA_SRC_BASE2 = (RK_U32 *)(base + RGA2_SRC_BASE2_OFFSET);
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun     bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);
187*4882a593Smuzhiyun     bRGA_SRC_ACT_INFO = (RK_U32 *)(base + RGA2_SRC_ACT_INFO_OFFSET);
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun     bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun     bRGA_SRC_TR_COLOR0 = (RK_U32 *)(base + RGA2_SRC_TR_COLOR0_OFFSET);
192*4882a593Smuzhiyun     bRGA_SRC_TR_COLOR1 = (RK_U32 *)(base + RGA2_SRC_TR_COLOR1_OFFSET);
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun     if (msg->src.format == RGA2_FORMAT_YCbCr_420_SP_10B ||
195*4882a593Smuzhiyun         msg->src.format == RGA2_FORMAT_YCrCb_420_SP_10B) {
196*4882a593Smuzhiyun        if ((msg->src.act_w == msg->dst.act_w) &&
197*4882a593Smuzhiyun            (msg->src.act_h == msg->dst.act_h) &&
198*4882a593Smuzhiyun            (msg->rotate_mode == 0))
199*4882a593Smuzhiyun            msg->rotate_mode = 1 << 6;
200*4882a593Smuzhiyun     }
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun     {
203*4882a593Smuzhiyun         rotate_mode = msg->rotate_mode & 0x3;
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun         sw = msg->src.act_w;
206*4882a593Smuzhiyun         sh = msg->src.act_h;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun         if((rotate_mode == 1) | (rotate_mode == 3))
209*4882a593Smuzhiyun         {
210*4882a593Smuzhiyun             dw = msg->dst.act_h;
211*4882a593Smuzhiyun             dh = msg->dst.act_w;
212*4882a593Smuzhiyun         }
213*4882a593Smuzhiyun         else
214*4882a593Smuzhiyun         {
215*4882a593Smuzhiyun             dw = msg->dst.act_w;
216*4882a593Smuzhiyun             dh = msg->dst.act_h;
217*4882a593Smuzhiyun         }
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun         if(sw > dw)
220*4882a593Smuzhiyun             scale_w_flag = 1;
221*4882a593Smuzhiyun         else if (sw < dw)
222*4882a593Smuzhiyun             scale_w_flag = 2;
223*4882a593Smuzhiyun         else {
224*4882a593Smuzhiyun             scale_w_flag = 0;
225*4882a593Smuzhiyun             if(msg->rotate_mode >> 6)
226*4882a593Smuzhiyun                 scale_w_flag = 3;
227*4882a593Smuzhiyun         }
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun         if(sh > dh)
230*4882a593Smuzhiyun             scale_h_flag = 1;
231*4882a593Smuzhiyun         else if (sh < dh)
232*4882a593Smuzhiyun             scale_h_flag = 2;
233*4882a593Smuzhiyun         else {
234*4882a593Smuzhiyun             scale_h_flag = 0;
235*4882a593Smuzhiyun             if(msg->rotate_mode >> 6)
236*4882a593Smuzhiyun                 scale_h_flag = 3;
237*4882a593Smuzhiyun         }
238*4882a593Smuzhiyun     }
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun     switch (msg->src.format)
241*4882a593Smuzhiyun     {
242*4882a593Smuzhiyun         case RGA2_FORMAT_RGBA_8888    : src0_format = 0x0; pixel_width = 4; break;
243*4882a593Smuzhiyun         case RGA2_FORMAT_BGRA_8888    : src0_format = 0x0; src0_rb_swp = 0x1; pixel_width = 4; break;
244*4882a593Smuzhiyun         case RGA2_FORMAT_RGBX_8888    : src0_format = 0x1; pixel_width = 4; msg->src_trans_mode &= 0x07; break;
245*4882a593Smuzhiyun         case RGA2_FORMAT_BGRX_8888    : src0_format = 0x1; src0_rb_swp = 0x1; pixel_width = 4; msg->src_trans_mode &= 0x07; break;
246*4882a593Smuzhiyun         case RGA2_FORMAT_RGB_888      : src0_format = 0x2; src0_rgb_pack = 1; pixel_width = 3; msg->src_trans_mode &= 0x07; break;
247*4882a593Smuzhiyun         case RGA2_FORMAT_BGR_888      : src0_format = 0x2; src0_rgb_pack = 1; src0_rb_swp = 1; pixel_width = 3; msg->src_trans_mode &= 0x07; break;
248*4882a593Smuzhiyun         case RGA2_FORMAT_RGB_565      : src0_format = 0x4; pixel_width = 2; msg->src_trans_mode &= 0x07; break;
249*4882a593Smuzhiyun         case RGA2_FORMAT_RGBA_5551    : src0_format = 0x5; pixel_width = 2; src0_rb_swp = 0x1; break;
250*4882a593Smuzhiyun         case RGA2_FORMAT_RGBA_4444    : src0_format = 0x6; pixel_width = 2; src0_rb_swp = 0x1; break;
251*4882a593Smuzhiyun         case RGA2_FORMAT_BGR_565      : src0_format = 0x4; pixel_width = 2; msg->src_trans_mode &= 0x07; src0_rb_swp = 0x1; break;
252*4882a593Smuzhiyun         case RGA2_FORMAT_BGRA_5551    : src0_format = 0x5; pixel_width = 2; break;
253*4882a593Smuzhiyun         case RGA2_FORMAT_BGRA_4444    : src0_format = 0x6; pixel_width = 2; break;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun         /* ARGB */
256*4882a593Smuzhiyun         /* In colorkey mode, xrgb/xbgr does not need to enable the alpha channel */
257*4882a593Smuzhiyun         case RGA2_FORMAT_ARGB_8888    : src0_format = 0x0; pixel_width = 4; src0_alpha_swp = 1; break;
258*4882a593Smuzhiyun         case RGA2_FORMAT_ABGR_8888    : src0_format = 0x0; pixel_width = 4; src0_alpha_swp = 1; src0_rb_swp = 0x1; break;
259*4882a593Smuzhiyun         case RGA2_FORMAT_XRGB_8888    : src0_format = 0x1; pixel_width = 4; src0_alpha_swp = 1; msg->src_trans_mode &= 0x07; break;
260*4882a593Smuzhiyun         case RGA2_FORMAT_XBGR_8888    : src0_format = 0x1; pixel_width = 4; src0_alpha_swp = 1; src0_rb_swp = 0x1; msg->src_trans_mode &= 0x07; break;
261*4882a593Smuzhiyun         case RGA2_FORMAT_ARGB_5551    : src0_format = 0x5; pixel_width = 2; src0_alpha_swp = 1; break;
262*4882a593Smuzhiyun         case RGA2_FORMAT_ABGR_5551    : src0_format = 0x5; pixel_width = 2; src0_alpha_swp = 1; src0_rb_swp = 0x1; break;
263*4882a593Smuzhiyun         case RGA2_FORMAT_ARGB_4444    : src0_format = 0x6; pixel_width = 2; src0_alpha_swp = 1; break;
264*4882a593Smuzhiyun         case RGA2_FORMAT_ABGR_4444    : src0_format = 0x6; pixel_width = 2; src0_alpha_swp = 1; src0_rb_swp = 0x1; break;
265*4882a593Smuzhiyun 
266*4882a593Smuzhiyun 		case RGA2_FORMAT_YVYU_422     : src0_format = 0x7; pixel_width = 2; src0_cbcr_swp = 1; src0_rb_swp = 0x1; break;//rbswap=ycswap
267*4882a593Smuzhiyun 		case RGA2_FORMAT_VYUY_422     : src0_format = 0x7; pixel_width = 2; src0_cbcr_swp = 1; src0_rb_swp = 0x0; break;
268*4882a593Smuzhiyun 		case RGA2_FORMAT_YUYV_422     : src0_format = 0x7; pixel_width = 2; src0_cbcr_swp = 0; src0_rb_swp = 0x1; break;
269*4882a593Smuzhiyun 		case RGA2_FORMAT_UYVY_422     : src0_format = 0x7; pixel_width = 2; src0_cbcr_swp = 0; src0_rb_swp = 0x0; break;
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun         case RGA2_FORMAT_YCbCr_422_SP : src0_format = 0x8; xdiv = 1; ydiv = 1; break;
272*4882a593Smuzhiyun         case RGA2_FORMAT_YCbCr_422_P  : src0_format = 0x9; xdiv = 2; ydiv = 1; break;
273*4882a593Smuzhiyun         case RGA2_FORMAT_YCbCr_420_SP : src0_format = 0xa; xdiv = 1; ydiv = 2; break;
274*4882a593Smuzhiyun         case RGA2_FORMAT_YCbCr_420_P  : src0_format = 0xb; xdiv = 2; ydiv = 2; break;
275*4882a593Smuzhiyun         case RGA2_FORMAT_YCrCb_422_SP : src0_format = 0x8; xdiv = 1; ydiv = 1; src0_cbcr_swp = 1; break;
276*4882a593Smuzhiyun         case RGA2_FORMAT_YCrCb_422_P  : src0_format = 0x9; xdiv = 2; ydiv = 1; src0_cbcr_swp = 1; break;
277*4882a593Smuzhiyun         case RGA2_FORMAT_YCrCb_420_SP : src0_format = 0xa; xdiv = 1; ydiv = 2; src0_cbcr_swp = 1; break;
278*4882a593Smuzhiyun         case RGA2_FORMAT_YCrCb_420_P  : src0_format = 0xb; xdiv = 2; ydiv = 2; src0_cbcr_swp = 1; break;
279*4882a593Smuzhiyun 
280*4882a593Smuzhiyun         case RGA2_FORMAT_YCbCr_420_SP_10B : src0_format = 0xa; xdiv = 1; ydiv = 2; yuv10 = 1; break;
281*4882a593Smuzhiyun         case RGA2_FORMAT_YCrCb_420_SP_10B : src0_format = 0xa; xdiv = 1; ydiv = 2; src0_cbcr_swp = 1; yuv10 = 1; break;
282*4882a593Smuzhiyun 		case RGA2_FORMAT_YCbCr_422_SP_10B : src0_format = 0x8; xdiv = 1; ydiv = 1; yuv10 = 1; break;
283*4882a593Smuzhiyun 		case RGA2_FORMAT_YCrCb_422_SP_10B : src0_format = 0x8; xdiv = 1; ydiv = 1; src0_cbcr_swp = 1; yuv10 = 1; break;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 		case RGA2_FORMAT_YCbCr_400 : src0_format = 0x8; src_fmt_yuv400_en = 1; xdiv = 1; ydiv = 1; break;
286*4882a593Smuzhiyun     };
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) | (s_RGA2_SRC_INFO_SW_SRC_FMT(src0_format)));
289*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP(src0_rb_swp)));
290*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP(src0_alpha_swp)));
291*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP)) | (s_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP(src0_cbcr_swp)));
292*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(msg->yuv2rgb_mode)));
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ROT_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_ROT_MODE(msg->rotate_mode & 0x3)));
295*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_MIR_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_MIR_MODE((msg->rotate_mode >> 4) & 0x3)));
296*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE((scale_w_flag))));
297*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE((scale_h_flag))));
298*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_SCL_FILTER)) | (s_RGA2_SRC_INFO_SW_SW_SRC_SCL_FILTER((msg->scale_bicu_mode))));
299*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_TRANS_MODE)) | (s_RGA2_SRC_INFO_SW_SW_SRC_TRANS_MODE(msg->src_trans_mode)));
300*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_TRANS_E)) | (s_RGA2_SRC_INFO_SW_SW_SRC_TRANS_E(msg->src_trans_mode >> 1)));
301*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_DITHER_UP_E)) | (s_RGA2_SRC_INFO_SW_SW_SRC_DITHER_UP_E((msg->alpha_rop_flag >> 4) & 0x1)));
302*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL)) | (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL((msg->scale_bicu_mode>>4))));
303*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_E)) | (s_RGA2_SRC_INFO_SW_SW_YUV10_E((yuv10))));
304*4882a593Smuzhiyun #if 1
305*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_ROUND_E)) | (s_RGA2_SRC_INFO_SW_SW_YUV10_ROUND_E((yuv10))));
306*4882a593Smuzhiyun #else
307*4882a593Smuzhiyun 	reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_ROUND_E)) | (s_RGA2_SRC_INFO_SW_SW_YUV10_ROUND_E(((msg->yuv2rgb_mode >> 6)&1))));
308*4882a593Smuzhiyun #endif
309*4882a593Smuzhiyun     RGA2_reg_get_param(base, msg);
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun     stride = (((msg->src.vir_w * pixel_width) + 3) & ~3) >> 2;
312*4882a593Smuzhiyun     uv_stride = ((msg->src.vir_w / xdiv + 3) & ~3);
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	/* 10bit code */
315*4882a593Smuzhiyun #if 0
316*4882a593Smuzhiyun 	switch (msg->src.format)
317*4882a593Smuzhiyun 	{
318*4882a593Smuzhiyun 		case RGA2_FORMAT_YCbCr_422_SP_10B:
319*4882a593Smuzhiyun 		case RGA2_FORMAT_YCbCr_420_SP_10B:
320*4882a593Smuzhiyun 		case RGA2_FORMAT_YCrCb_422_SP_10B:
321*4882a593Smuzhiyun 		case RGA2_FORMAT_YCrCb_420_SP_10B:
322*4882a593Smuzhiyun 			stride = (((msg->src.vir_w * 10 + 31) & (~31)) >> 3) >> 2;
323*4882a593Smuzhiyun 			uv_stride = stride;
324*4882a593Smuzhiyun 			break;
325*4882a593Smuzhiyun 	}
326*4882a593Smuzhiyun #endif
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun     if (src_fmt_yuv400_en == 1) {
329*4882a593Smuzhiyun         /*
330*4882a593Smuzhiyun          * When Y400 as the input format, because the current RGA does not support closing
331*4882a593Smuzhiyun          * the access of the UV channel, the address of the UV channel access is equal to
332*4882a593Smuzhiyun          * the address of the Y channel access to ensure that the UV channel can access,
333*4882a593Smuzhiyun          * preventing the RGA hardware from reporting errors.
334*4882a593Smuzhiyun          */
335*4882a593Smuzhiyun         *bRGA_SRC_BASE0 = (RK_U32)(msg->src.yrgb_addr + msg->src.y_offset * (stride<<2) + msg->src.x_offset * pixel_width);
336*4882a593Smuzhiyun         *bRGA_SRC_BASE1 = *bRGA_SRC_BASE0;
337*4882a593Smuzhiyun         *bRGA_SRC_BASE2 = *bRGA_SRC_BASE0;
338*4882a593Smuzhiyun     } else {
339*4882a593Smuzhiyun         *bRGA_SRC_BASE0 = (RK_U32)(msg->src.yrgb_addr + msg->src.y_offset * (stride<<2) + msg->src.x_offset * pixel_width);
340*4882a593Smuzhiyun         *bRGA_SRC_BASE1 = (RK_U32)(msg->src.uv_addr + (msg->src.y_offset / ydiv) * uv_stride + (msg->src.x_offset / xdiv));
341*4882a593Smuzhiyun         *bRGA_SRC_BASE2 = (RK_U32)(msg->src.v_addr + (msg->src.y_offset / ydiv) * uv_stride + (msg->src.x_offset / xdiv));
342*4882a593Smuzhiyun     }
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun     //mask_stride = ((msg->src0_act.width + 31) & ~31) >> 5;
345*4882a593Smuzhiyun     mask_stride = msg->rop_mask_stride;
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun     *bRGA_SRC_VIR_INFO = stride | (mask_stride << 16);
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun     *bRGA_SRC_ACT_INFO = (msg->src.act_w - 1) | ((msg->src.act_h - 1) << 16);
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun     *bRGA_MASK_ADDR = (RK_U32)msg->rop_mask_addr;
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun     *bRGA_SRC_INFO = reg;
354*4882a593Smuzhiyun 
355*4882a593Smuzhiyun 	*bRGA_SRC_TR_COLOR0 = msg->color_key_min;
356*4882a593Smuzhiyun     *bRGA_SRC_TR_COLOR1 = msg->color_key_max;
357*4882a593Smuzhiyun }
358*4882a593Smuzhiyun 
RGA2_set_reg_dst_info(u8 * base,struct rga2_req * msg)359*4882a593Smuzhiyun static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
360*4882a593Smuzhiyun {
361*4882a593Smuzhiyun     RK_U32 *bRGA_DST_INFO;
362*4882a593Smuzhiyun     RK_U32 *bRGA_DST_BASE0, *bRGA_DST_BASE1, *bRGA_DST_BASE2, *bRGA_SRC_BASE3;
363*4882a593Smuzhiyun     RK_U32 *bRGA_DST_VIR_INFO;
364*4882a593Smuzhiyun     RK_U32 *bRGA_DST_ACT_INFO;
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	RK_U32 *RGA_DST_Y4MAP_LUT0;//Y4 LUT0
367*4882a593Smuzhiyun 	RK_U32 *RGA_DST_Y4MAP_LUT1;//Y4 LUT1
368*4882a593Smuzhiyun 	RK_U32 *RGA_DST_NN_QUANTIZE_SCALE;
369*4882a593Smuzhiyun 	RK_U32 *RGA_DST_NN_QUANTIZE_OFFSET;
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	RK_U32 line_width_real;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun 	RK_U8 ydither_en = 0;
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun     RK_U8 src1_format = 0;
376*4882a593Smuzhiyun     RK_U8 src1_rb_swp = 0;
377*4882a593Smuzhiyun     RK_U8 src1_rgb_pack = 0;
378*4882a593Smuzhiyun     RK_U8 src1_alpha_swp = 0;
379*4882a593Smuzhiyun     RK_U8 dst_format = 0;
380*4882a593Smuzhiyun     RK_U8 dst_rb_swp = 0;
381*4882a593Smuzhiyun     RK_U8 dst_rgb_pack = 0;
382*4882a593Smuzhiyun     RK_U8 dst_cbcr_swp = 0;
383*4882a593Smuzhiyun     RK_U8 dst_alpha_swp = 0;
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	RK_U8 dst_fmt_yuv400_en = 0;
386*4882a593Smuzhiyun 	RK_U8 dst_fmt_y4_en   = 0;
387*4882a593Smuzhiyun 	RK_U8 dst_nn_quantize_en   = 0;
388*4882a593Smuzhiyun 
389*4882a593Smuzhiyun     RK_U32 reg = 0;
390*4882a593Smuzhiyun     RK_U8 spw, dpw;
391*4882a593Smuzhiyun     RK_U32 s_stride, d_stride;
392*4882a593Smuzhiyun     RK_U32 x_mirr, y_mirr, rot_90_flag;
393*4882a593Smuzhiyun     RK_U32 yrgb_addr, u_addr, v_addr, s_yrgb_addr;
394*4882a593Smuzhiyun     RK_U32 d_uv_stride, x_div, y_div;
395*4882a593Smuzhiyun     RK_U32 y_lt_addr, y_ld_addr, y_rt_addr, y_rd_addr;
396*4882a593Smuzhiyun     RK_U32 u_lt_addr, u_ld_addr, u_rt_addr, u_rd_addr;
397*4882a593Smuzhiyun     RK_U32 v_lt_addr, v_ld_addr, v_rt_addr, v_rd_addr;
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun     dpw = 1;
400*4882a593Smuzhiyun     x_div = y_div = 1;
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun 	dst_nn_quantize_en = (msg->alpha_rop_flag >> 8)&0x1;
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun     bRGA_DST_INFO = (RK_U32 *)(base + RGA2_DST_INFO_OFFSET);
405*4882a593Smuzhiyun     bRGA_DST_BASE0 = (RK_U32 *)(base + RGA2_DST_BASE0_OFFSET);
406*4882a593Smuzhiyun     bRGA_DST_BASE1 = (RK_U32 *)(base + RGA2_DST_BASE1_OFFSET);
407*4882a593Smuzhiyun     bRGA_DST_BASE2 = (RK_U32 *)(base + RGA2_DST_BASE2_OFFSET);
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun     bRGA_SRC_BASE3 = (RK_U32 *)(base + RGA2_SRC_BASE3_OFFSET);
410*4882a593Smuzhiyun 
411*4882a593Smuzhiyun     bRGA_DST_VIR_INFO = (RK_U32 *)(base + RGA2_DST_VIR_INFO_OFFSET);
412*4882a593Smuzhiyun     bRGA_DST_ACT_INFO = (RK_U32 *)(base + RGA2_DST_ACT_INFO_OFFSET);
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun 	RGA_DST_Y4MAP_LUT0 = (RK_U32 *)(base + RGA2_DST_Y4MAP_LUT0_OFFSET);
415*4882a593Smuzhiyun 	RGA_DST_Y4MAP_LUT1 = (RK_U32 *)(base + RGA2_DST_Y4MAP_LUT1_OFFSET);
416*4882a593Smuzhiyun 	RGA_DST_NN_QUANTIZE_SCALE = (RK_U32 *)(base + RGA2_DST_QUANTIZE_SCALE_OFFSET);
417*4882a593Smuzhiyun 	RGA_DST_NN_QUANTIZE_OFFSET = (RK_U32 *)(base + RGA2_DST_QUANTIZE_OFFSET_OFFSET);
418*4882a593Smuzhiyun 
419*4882a593Smuzhiyun     switch (msg->src1.format)
420*4882a593Smuzhiyun     {
421*4882a593Smuzhiyun         case RGA2_FORMAT_RGBA_8888    : src1_format = 0x0; spw = 4; break;
422*4882a593Smuzhiyun         case RGA2_FORMAT_BGRA_8888    : src1_format = 0x0; src1_rb_swp = 0x1; spw = 4; break;
423*4882a593Smuzhiyun         case RGA2_FORMAT_RGBX_8888    : src1_format = 0x1; spw = 4; break;
424*4882a593Smuzhiyun         case RGA2_FORMAT_BGRX_8888    : src1_format = 0x1; src1_rb_swp = 0x1; spw = 4; break;
425*4882a593Smuzhiyun         case RGA2_FORMAT_RGB_888      : src1_format = 0x2; src1_rgb_pack = 1; spw = 3; break;
426*4882a593Smuzhiyun         case RGA2_FORMAT_BGR_888      : src1_format = 0x2; src1_rgb_pack = 1; src1_rb_swp = 1; spw = 3; break;
427*4882a593Smuzhiyun         case RGA2_FORMAT_RGB_565      : src1_format = 0x4; spw = 2; break;
428*4882a593Smuzhiyun         case RGA2_FORMAT_RGBA_5551    : src1_format = 0x5; spw = 2; src1_rb_swp = 0x1; break;
429*4882a593Smuzhiyun         case RGA2_FORMAT_RGBA_4444    : src1_format = 0x6; spw = 2; src1_rb_swp = 0x1; break;
430*4882a593Smuzhiyun         case RGA2_FORMAT_BGR_565      : src1_format = 0x4; spw = 2; src1_rb_swp = 0x1; break;
431*4882a593Smuzhiyun         case RGA2_FORMAT_BGRA_5551    : src1_format = 0x5; spw = 2; break;
432*4882a593Smuzhiyun         case RGA2_FORMAT_BGRA_4444    : src1_format = 0x6; spw = 2; break;
433*4882a593Smuzhiyun 
434*4882a593Smuzhiyun         /* ARGB */
435*4882a593Smuzhiyun         case RGA2_FORMAT_ARGB_8888    : src1_format = 0x0; spw = 4; src1_alpha_swp = 1; break;
436*4882a593Smuzhiyun         case RGA2_FORMAT_ABGR_8888    : src1_format = 0x0; spw = 4; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
437*4882a593Smuzhiyun         case RGA2_FORMAT_XRGB_8888    : src1_format = 0x1; spw = 4; src1_alpha_swp = 1; break;
438*4882a593Smuzhiyun         case RGA2_FORMAT_XBGR_8888    : src1_format = 0x1; spw = 4; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
439*4882a593Smuzhiyun         case RGA2_FORMAT_ARGB_5551    : src1_format = 0x5; spw = 2; src1_alpha_swp = 1; break;
440*4882a593Smuzhiyun         case RGA2_FORMAT_ABGR_5551    : src1_format = 0x5; spw = 2; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
441*4882a593Smuzhiyun         case RGA2_FORMAT_ARGB_4444    : src1_format = 0x6; spw = 2; src1_alpha_swp = 1; break;
442*4882a593Smuzhiyun         case RGA2_FORMAT_ABGR_4444    : src1_format = 0x6; spw = 2; src1_alpha_swp = 1; src1_rb_swp = 0x1; break;
443*4882a593Smuzhiyun         default                       : spw = 4; break;
444*4882a593Smuzhiyun     };
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_FMT)) | (s_RGA2_DST_INFO_SW_SRC1_FMT(src1_format)));
447*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_RB_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_RB_SWP(src1_rb_swp)));
448*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP)) | (s_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP(src1_alpha_swp)));
449*4882a593Smuzhiyun 
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun     switch (msg->dst.format)
452*4882a593Smuzhiyun     {
453*4882a593Smuzhiyun         case RGA2_FORMAT_RGBA_8888    : dst_format = 0x0; dpw = 4; break;
454*4882a593Smuzhiyun         case RGA2_FORMAT_BGRA_8888    : dst_format = 0x0; dst_rb_swp = 0x1; dpw = 4; break;
455*4882a593Smuzhiyun         case RGA2_FORMAT_RGBX_8888    : dst_format = 0x1; dpw = 4; break;
456*4882a593Smuzhiyun         case RGA2_FORMAT_BGRX_8888    : dst_format = 0x1; dst_rb_swp = 0x1; dpw = 4; break;
457*4882a593Smuzhiyun         case RGA2_FORMAT_RGB_888      : dst_format = 0x2; dst_rgb_pack = 1; dpw = 3; break;
458*4882a593Smuzhiyun         case RGA2_FORMAT_BGR_888      : dst_format = 0x2; dst_rgb_pack = 1; dst_rb_swp = 1; dpw = 3; break;
459*4882a593Smuzhiyun         case RGA2_FORMAT_RGB_565      : dst_format = 0x4; dpw = 2; break;
460*4882a593Smuzhiyun         case RGA2_FORMAT_RGBA_5551    : dst_format = 0x5; dpw = 2; dst_rb_swp = 0x1; break;
461*4882a593Smuzhiyun         case RGA2_FORMAT_RGBA_4444    : dst_format = 0x6; dpw = 2; dst_rb_swp = 0x1; break;
462*4882a593Smuzhiyun         case RGA2_FORMAT_BGR_565      : dst_format = 0x4; dpw = 2; dst_rb_swp = 0x1; break;
463*4882a593Smuzhiyun         case RGA2_FORMAT_BGRA_5551    : dst_format = 0x5; dpw = 2; break;
464*4882a593Smuzhiyun         case RGA2_FORMAT_BGRA_4444    : dst_format = 0x6; dpw = 2; break;
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun         /* ARGB */
467*4882a593Smuzhiyun         case RGA2_FORMAT_ARGB_8888    : dst_format = 0x0; dpw = 4; dst_alpha_swp = 1; break;
468*4882a593Smuzhiyun         case RGA2_FORMAT_ABGR_8888    : dst_format = 0x0; dpw = 4; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
469*4882a593Smuzhiyun         case RGA2_FORMAT_XRGB_8888    : dst_format = 0x1; dpw = 4; dst_alpha_swp = 1; break;
470*4882a593Smuzhiyun         case RGA2_FORMAT_XBGR_8888    : dst_format = 0x1; dpw = 4; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
471*4882a593Smuzhiyun         case RGA2_FORMAT_ARGB_5551    : dst_format = 0x5; dpw = 2; dst_alpha_swp = 1; break;
472*4882a593Smuzhiyun         case RGA2_FORMAT_ABGR_5551    : dst_format = 0x5; dpw = 2; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
473*4882a593Smuzhiyun         case RGA2_FORMAT_ARGB_4444    : dst_format = 0x6; dpw = 2; dst_alpha_swp = 1; break;
474*4882a593Smuzhiyun         case RGA2_FORMAT_ABGR_4444    : dst_format = 0x6; dpw = 2; dst_alpha_swp = 1; dst_rb_swp = 0x1; break;
475*4882a593Smuzhiyun 
476*4882a593Smuzhiyun         case RGA2_FORMAT_YCbCr_422_SP : dst_format = 0x8; x_div = 1; y_div = 1; break;
477*4882a593Smuzhiyun         case RGA2_FORMAT_YCbCr_422_P  : dst_format = 0x9; x_div = 2; y_div = 1; break;
478*4882a593Smuzhiyun         case RGA2_FORMAT_YCbCr_420_SP : dst_format = 0xa; x_div = 1; y_div = 2; break;
479*4882a593Smuzhiyun         case RGA2_FORMAT_YCbCr_420_P  : dst_format = 0xb; dst_cbcr_swp = 1; x_div = 2; y_div = 2; break;
480*4882a593Smuzhiyun         case RGA2_FORMAT_YCrCb_422_SP : dst_format = 0x8; dst_cbcr_swp = 1; x_div = 1; y_div = 1; break;
481*4882a593Smuzhiyun         case RGA2_FORMAT_YCrCb_422_P  : dst_format = 0x9; dst_cbcr_swp = 1; x_div = 2; y_div = 1; break;
482*4882a593Smuzhiyun         case RGA2_FORMAT_YCrCb_420_SP : dst_format = 0xa; dst_cbcr_swp = 1; x_div = 1; y_div = 2; break;
483*4882a593Smuzhiyun         case RGA2_FORMAT_YCrCb_420_P  : dst_format = 0xb; x_div = 2; y_div = 2; break;
484*4882a593Smuzhiyun 
485*4882a593Smuzhiyun 		case RGA2_FORMAT_YCbCr_400    : dst_format = 0x8; dst_fmt_yuv400_en = 1; x_div = 1; y_div = 1; break;
486*4882a593Smuzhiyun 		case RGA2_FORMAT_Y4           : dst_format = 0x8; dst_fmt_y4_en = 1; dst_fmt_yuv400_en = 1; x_div = 1; y_div = 1; break;
487*4882a593Smuzhiyun 
488*4882a593Smuzhiyun 		case RGA2_FORMAT_YUYV_422     : dst_format = 0xe; dpw = 2; dst_cbcr_swp = 1; break;
489*4882a593Smuzhiyun 		case RGA2_FORMAT_YVYU_422     : dst_format = 0xe; dpw = 2; break;
490*4882a593Smuzhiyun 		case RGA2_FORMAT_YUYV_420     : dst_format = 0xf; dpw = 2; dst_cbcr_swp = 1; break;
491*4882a593Smuzhiyun 		case RGA2_FORMAT_YVYU_420     : dst_format = 0xf; dpw = 2; break;
492*4882a593Smuzhiyun 		case RGA2_FORMAT_UYVY_422     : dst_format = 0xc; dpw = 2; dst_cbcr_swp = 1; break;
493*4882a593Smuzhiyun 		case RGA2_FORMAT_VYUY_422     : dst_format = 0xc; dpw = 2; break;
494*4882a593Smuzhiyun 		case RGA2_FORMAT_UYVY_420     : dst_format = 0xd; dpw = 2; dst_cbcr_swp = 1; break;
495*4882a593Smuzhiyun 		case RGA2_FORMAT_VYUY_420     : dst_format = 0xd; dpw = 2; break;
496*4882a593Smuzhiyun     };
497*4882a593Smuzhiyun 
498*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_FMT)) | (s_RGA2_DST_INFO_SW_DST_FMT(dst_format)));
499*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_RB_SWAP)) | (s_RGA2_DST_INFO_SW_DST_RB_SWAP(dst_rb_swp)));
500*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_ALPHA_SWAP)) | (s_RGA2_DST_INFO_SW_ALPHA_SWAP(dst_alpha_swp)));
501*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_UV_SWAP)) | (s_RGA2_DST_INFO_SW_DST_UV_SWAP(dst_cbcr_swp)));
502*4882a593Smuzhiyun 
503*4882a593Smuzhiyun 	reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_FMT_YUV400_EN)) | (s_RGA2_DST_INFO_SW_DST_FMT_YUV400_EN(dst_fmt_yuv400_en)));
504*4882a593Smuzhiyun 	reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_FMT_Y4_EN)) | (s_RGA2_DST_INFO_SW_DST_FMT_Y4_EN(dst_fmt_y4_en)));
505*4882a593Smuzhiyun 	reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_NN_QUANTIZE_EN)) | (s_RGA2_DST_INFO_SW_DST_NN_QUANTIZE_EN(dst_nn_quantize_en)));
506*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_UP_E)) | (s_RGA2_DST_INFO_SW_DITHER_UP_E(msg->alpha_rop_flag >> 5)));
507*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_DOWN_E)) | (s_RGA2_DST_INFO_SW_DITHER_DOWN_E(msg->alpha_rop_flag >> 6)));
508*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_DITHER_MODE)) | (s_RGA2_DST_INFO_SW_DITHER_MODE(msg->dither_mode)));
509*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_CSC_MODE)) | (s_RGA2_DST_INFO_SW_DST_CSC_MODE(msg->yuv2rgb_mode >> 2)));
510*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_CSC_CLIP_MODE)) | (s_RGA2_DST_INFO_SW_CSC_CLIP_MODE(msg->yuv2rgb_mode >> 4)));
511*4882a593Smuzhiyun     /* full csc enable */
512*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_CSC_MODE_2)) | (s_RGA2_DST_INFO_SW_DST_CSC_MODE_2(msg->full_csc.flag)));
513*4882a593Smuzhiyun     /* Some older chips do not support src1 csc mode, they do not have these two registers. */
514*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_CSC_MODE)) | (s_RGA2_DST_INFO_SW_SRC1_CSC_MODE(msg->yuv2rgb_mode >> 5)));
515*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_DST_INFO_SW_SRC1_CSC_CLIP_MODE)) | (s_RGA2_DST_INFO_SW_SRC1_CSC_CLIP_MODE(msg->yuv2rgb_mode >> 7)));
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun 	ydither_en = (msg->dst.format == RGA2_FORMAT_Y4) && ((msg->alpha_rop_flag >> 6)&0x1);
518*4882a593Smuzhiyun 
519*4882a593Smuzhiyun     *bRGA_DST_INFO = reg;
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun     s_stride = ((msg->src1.vir_w * spw + 3) & ~3) >> 2;
522*4882a593Smuzhiyun     d_stride = ((msg->dst.vir_w * dpw + 3) & ~3) >> 2;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	if (dst_fmt_y4_en) {
525*4882a593Smuzhiyun 		/* Y4 output will HALF */
526*4882a593Smuzhiyun 		d_stride = ((d_stride+1)&~1) >> 1;
527*4882a593Smuzhiyun 	}
528*4882a593Smuzhiyun 
529*4882a593Smuzhiyun     d_uv_stride = (d_stride << 2) / x_div;
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun     *bRGA_DST_VIR_INFO = d_stride | (s_stride << 16);
532*4882a593Smuzhiyun 	if ((msg->dst.vir_w % 2 != 0) &&
533*4882a593Smuzhiyun 		(msg->dst.act_w == msg->src.act_w) && (msg->dst.act_h == msg->src.act_h) &&
534*4882a593Smuzhiyun 		(msg->dst.format == RGA2_FORMAT_BGR_888 || msg->dst.format == RGA2_FORMAT_RGB_888))
535*4882a593Smuzhiyun 		*bRGA_DST_ACT_INFO = (msg->dst.act_w) | ((msg->dst.act_h - 1) << 16);
536*4882a593Smuzhiyun 	else
537*4882a593Smuzhiyun 		*bRGA_DST_ACT_INFO = (msg->dst.act_w - 1) | ((msg->dst.act_h - 1) << 16);
538*4882a593Smuzhiyun     s_stride <<= 2;
539*4882a593Smuzhiyun 	d_stride <<= 2;
540*4882a593Smuzhiyun 
541*4882a593Smuzhiyun     if(((msg->rotate_mode & 0xf) == 0) || ((msg->rotate_mode & 0xf) == 1))
542*4882a593Smuzhiyun     {
543*4882a593Smuzhiyun         x_mirr = 0;
544*4882a593Smuzhiyun         y_mirr = 0;
545*4882a593Smuzhiyun     }
546*4882a593Smuzhiyun     else
547*4882a593Smuzhiyun     {
548*4882a593Smuzhiyun         x_mirr = 1;
549*4882a593Smuzhiyun         y_mirr = 1;
550*4882a593Smuzhiyun     }
551*4882a593Smuzhiyun 
552*4882a593Smuzhiyun     rot_90_flag = msg->rotate_mode & 1;
553*4882a593Smuzhiyun     x_mirr = (x_mirr + ((msg->rotate_mode >> 4) & 1)) & 1;
554*4882a593Smuzhiyun     y_mirr = (y_mirr + ((msg->rotate_mode >> 5) & 1)) & 1;
555*4882a593Smuzhiyun 
556*4882a593Smuzhiyun 	if (ydither_en) {
557*4882a593Smuzhiyun 		if (x_mirr && y_mirr) {
558*4882a593Smuzhiyun 			printk(KERN_ERR "rga: [ERROR] YDITHER MODE DO NOT SUPPORT ROTATION !!x_mirr=%d,y_mirr=%d \n", x_mirr, y_mirr);
559*4882a593Smuzhiyun 		}
560*4882a593Smuzhiyun 		if (msg->dst.act_w != msg->src.act_w) {
561*4882a593Smuzhiyun 			printk(KERN_ERR "rga: [ERROR] YDITHER MODE DO NOT SUPPORT SCL !!src0.act_w=%d,dst.act_w=%d \n", msg->src.act_w, msg->dst.act_w);
562*4882a593Smuzhiyun 		}
563*4882a593Smuzhiyun 		if (msg->dst.act_h != msg->src.act_h) {
564*4882a593Smuzhiyun 			printk(KERN_ERR "rga: [ERROR] YDITHER MODE DO NOT SUPPORT SCL !!src0.act_h=%d,dst.act_h=%d \n", msg->src.act_h, msg->dst.act_h);
565*4882a593Smuzhiyun 		}
566*4882a593Smuzhiyun 	}
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun 	if (dst_fmt_y4_en) {
569*4882a593Smuzhiyun 		*RGA_DST_Y4MAP_LUT0 = (msg->gr_color.gr_x_r & 0xffff) | (msg->gr_color.gr_x_g << 16);
570*4882a593Smuzhiyun 		*RGA_DST_Y4MAP_LUT1 = (msg->gr_color.gr_y_r & 0xffff) | (msg->gr_color.gr_y_g << 16);
571*4882a593Smuzhiyun 	}
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun 	if (dst_nn_quantize_en) {
574*4882a593Smuzhiyun 		*RGA_DST_NN_QUANTIZE_SCALE = (msg->gr_color.gr_x_r & 0xffff) | (msg->gr_color.gr_x_g << 10) | (msg->gr_color.gr_x_b << 20);
575*4882a593Smuzhiyun 		*RGA_DST_NN_QUANTIZE_OFFSET = (msg->gr_color.gr_y_r & 0xffff) | (msg->gr_color.gr_y_g << 10) | (msg->gr_color.gr_y_b << 20);
576*4882a593Smuzhiyun 	}
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun     s_yrgb_addr = (RK_U32)msg->src1.yrgb_addr + (msg->src1.y_offset * s_stride) + (msg->src1.x_offset * spw);
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun     *bRGA_SRC_BASE3 = s_yrgb_addr;
581*4882a593Smuzhiyun 
582*4882a593Smuzhiyun 	if (dst_fmt_y4_en) {
583*4882a593Smuzhiyun 		yrgb_addr = (RK_U32)msg->dst.yrgb_addr + (msg->dst.y_offset * d_stride) + ((msg->dst.x_offset * dpw)>>1);
584*4882a593Smuzhiyun 	} else {
585*4882a593Smuzhiyun 		yrgb_addr = (RK_U32)msg->dst.yrgb_addr + (msg->dst.y_offset * d_stride) + (msg->dst.x_offset * dpw);
586*4882a593Smuzhiyun 	}
587*4882a593Smuzhiyun     u_addr = (RK_U32)msg->dst.uv_addr + (msg->dst.y_offset / y_div) * d_uv_stride + msg->dst.x_offset / x_div;
588*4882a593Smuzhiyun     v_addr = (RK_U32)msg->dst.v_addr + (msg->dst.y_offset / y_div) * d_uv_stride + msg->dst.x_offset / x_div;
589*4882a593Smuzhiyun 
590*4882a593Smuzhiyun     y_lt_addr = yrgb_addr;
591*4882a593Smuzhiyun     u_lt_addr = u_addr;
592*4882a593Smuzhiyun     v_lt_addr = v_addr;
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun 	/* Warning */
595*4882a593Smuzhiyun 	line_width_real = dst_fmt_y4_en ? ((msg->dst.act_w) >>1) : msg->dst.act_w;
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	if (msg->dst.format < 0x18 ||
598*4882a593Smuzhiyun 	    (msg->dst.format >= RGA2_FORMAT_ARGB_8888 &&
599*4882a593Smuzhiyun 	     msg->dst.format <= RGA2_FORMAT_ABGR_4444)) {
600*4882a593Smuzhiyun 		/* 270 degree & Mirror V*/
601*4882a593Smuzhiyun 		y_ld_addr = yrgb_addr + (msg->dst.act_h - 1) * (d_stride);
602*4882a593Smuzhiyun 		/* 90 degree & Mirror H  */
603*4882a593Smuzhiyun 		y_rt_addr = yrgb_addr + (line_width_real - 1) * dpw;
604*4882a593Smuzhiyun 		/* 180 degree */
605*4882a593Smuzhiyun 		y_rd_addr = y_ld_addr + (line_width_real - 1) * dpw;
606*4882a593Smuzhiyun 	} else {
607*4882a593Smuzhiyun 		if (msg->dst.format == RGA2_FORMAT_YUYV_422 ||
608*4882a593Smuzhiyun 		    msg->dst.format == RGA2_FORMAT_YVYU_422 ||
609*4882a593Smuzhiyun 		    msg->dst.format == RGA2_FORMAT_UYVY_422 ||
610*4882a593Smuzhiyun 		    msg->dst.format == RGA2_FORMAT_VYUY_422) {
611*4882a593Smuzhiyun 			y_ld_addr = yrgb_addr + (msg->dst.act_h - 1) * (d_stride);
612*4882a593Smuzhiyun 			y_rt_addr = yrgb_addr + (msg->dst.act_w * 2 - 1);
613*4882a593Smuzhiyun 			y_rd_addr = y_ld_addr + (msg->dst.act_w * 2 - 1);
614*4882a593Smuzhiyun 		} else {
615*4882a593Smuzhiyun 			y_ld_addr = (RK_U32)msg->dst.yrgb_addr +
616*4882a593Smuzhiyun 			((msg->dst.y_offset + (msg->dst.act_h -1)) * d_stride) +
617*4882a593Smuzhiyun 			msg->dst.x_offset;
618*4882a593Smuzhiyun 			y_rt_addr = yrgb_addr + (msg->dst.act_w * 2 - 1);
619*4882a593Smuzhiyun 			y_rd_addr = y_ld_addr + (msg->dst.act_w - 1);
620*4882a593Smuzhiyun 		}
621*4882a593Smuzhiyun 	}
622*4882a593Smuzhiyun 
623*4882a593Smuzhiyun 	u_ld_addr = u_addr + ((msg->dst.act_h / y_div) - 1) * (d_uv_stride);
624*4882a593Smuzhiyun 	v_ld_addr = v_addr + ((msg->dst.act_h / y_div) - 1) * (d_uv_stride);
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun 	u_rt_addr = u_addr + (msg->dst.act_w / x_div) - 1;
627*4882a593Smuzhiyun 	v_rt_addr = v_addr + (msg->dst.act_w / x_div) - 1;
628*4882a593Smuzhiyun 
629*4882a593Smuzhiyun 	u_rd_addr = u_ld_addr + (msg->dst.act_w / x_div) - 1;
630*4882a593Smuzhiyun 	v_rd_addr = v_ld_addr + (msg->dst.act_w / x_div) - 1;
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun     if(rot_90_flag == 0)
633*4882a593Smuzhiyun     {
634*4882a593Smuzhiyun         if(y_mirr == 1)
635*4882a593Smuzhiyun         {
636*4882a593Smuzhiyun             if(x_mirr == 1)
637*4882a593Smuzhiyun             {
638*4882a593Smuzhiyun                 yrgb_addr = y_rd_addr;
639*4882a593Smuzhiyun                 u_addr = u_rd_addr;
640*4882a593Smuzhiyun                 v_addr = v_rd_addr;
641*4882a593Smuzhiyun             }
642*4882a593Smuzhiyun             else
643*4882a593Smuzhiyun             {
644*4882a593Smuzhiyun                 yrgb_addr = y_ld_addr;
645*4882a593Smuzhiyun                 u_addr = u_ld_addr;
646*4882a593Smuzhiyun                 v_addr = v_ld_addr;
647*4882a593Smuzhiyun             }
648*4882a593Smuzhiyun         }
649*4882a593Smuzhiyun         else
650*4882a593Smuzhiyun         {
651*4882a593Smuzhiyun             if(x_mirr == 1)
652*4882a593Smuzhiyun             {
653*4882a593Smuzhiyun                 yrgb_addr = y_rt_addr;
654*4882a593Smuzhiyun                 u_addr = u_rt_addr;
655*4882a593Smuzhiyun                 v_addr = v_rt_addr;
656*4882a593Smuzhiyun             }
657*4882a593Smuzhiyun             else
658*4882a593Smuzhiyun             {
659*4882a593Smuzhiyun                 yrgb_addr = y_lt_addr;
660*4882a593Smuzhiyun                 u_addr = u_lt_addr;
661*4882a593Smuzhiyun                 v_addr = v_lt_addr;
662*4882a593Smuzhiyun             }
663*4882a593Smuzhiyun         }
664*4882a593Smuzhiyun     }
665*4882a593Smuzhiyun     else
666*4882a593Smuzhiyun     {
667*4882a593Smuzhiyun         if(y_mirr == 1)
668*4882a593Smuzhiyun         {
669*4882a593Smuzhiyun             if(x_mirr == 1)
670*4882a593Smuzhiyun             {
671*4882a593Smuzhiyun                 yrgb_addr = y_ld_addr;
672*4882a593Smuzhiyun                 u_addr = u_ld_addr;
673*4882a593Smuzhiyun                 v_addr = v_ld_addr;
674*4882a593Smuzhiyun             }
675*4882a593Smuzhiyun             else
676*4882a593Smuzhiyun             {
677*4882a593Smuzhiyun                 yrgb_addr = y_rd_addr;
678*4882a593Smuzhiyun                 u_addr = u_rd_addr;
679*4882a593Smuzhiyun                 v_addr = v_rd_addr;
680*4882a593Smuzhiyun             }
681*4882a593Smuzhiyun         }
682*4882a593Smuzhiyun         else
683*4882a593Smuzhiyun         {
684*4882a593Smuzhiyun             if(x_mirr == 1)
685*4882a593Smuzhiyun             {
686*4882a593Smuzhiyun                 yrgb_addr = y_lt_addr;
687*4882a593Smuzhiyun                 u_addr = u_lt_addr;
688*4882a593Smuzhiyun                 v_addr = v_lt_addr;
689*4882a593Smuzhiyun             }
690*4882a593Smuzhiyun             else
691*4882a593Smuzhiyun             {
692*4882a593Smuzhiyun                 yrgb_addr = y_rt_addr;
693*4882a593Smuzhiyun                 u_addr = u_rt_addr;
694*4882a593Smuzhiyun                 v_addr = v_rt_addr;
695*4882a593Smuzhiyun             }
696*4882a593Smuzhiyun         }
697*4882a593Smuzhiyun     }
698*4882a593Smuzhiyun 
699*4882a593Smuzhiyun     *bRGA_DST_BASE0 = (RK_U32)yrgb_addr;
700*4882a593Smuzhiyun 
701*4882a593Smuzhiyun     if((msg->dst.format == RGA2_FORMAT_YCbCr_420_P) || (msg->dst.format == RGA2_FORMAT_YCrCb_420_P))
702*4882a593Smuzhiyun     {
703*4882a593Smuzhiyun         if(dst_cbcr_swp == 0) {
704*4882a593Smuzhiyun             *bRGA_DST_BASE1 = (RK_U32)v_addr;
705*4882a593Smuzhiyun             *bRGA_DST_BASE2 = (RK_U32)u_addr;
706*4882a593Smuzhiyun         }
707*4882a593Smuzhiyun         else {
708*4882a593Smuzhiyun             *bRGA_DST_BASE1 = (RK_U32)u_addr;
709*4882a593Smuzhiyun             *bRGA_DST_BASE2 = (RK_U32)v_addr;
710*4882a593Smuzhiyun         }
711*4882a593Smuzhiyun     }
712*4882a593Smuzhiyun     else {
713*4882a593Smuzhiyun         *bRGA_DST_BASE1 = (RK_U32)u_addr;
714*4882a593Smuzhiyun         *bRGA_DST_BASE2 = (RK_U32)v_addr;
715*4882a593Smuzhiyun     }
716*4882a593Smuzhiyun 
717*4882a593Smuzhiyun 	//if (msg->dst.format >= 0x18) {
718*4882a593Smuzhiyun 	//	*bRGA_DST_BASE1 = msg->dst.x_offset;
719*4882a593Smuzhiyun 	//}
720*4882a593Smuzhiyun }
721*4882a593Smuzhiyun 
RGA2_set_reg_alpha_info(u8 * base,struct rga2_req * msg)722*4882a593Smuzhiyun static void RGA2_set_reg_alpha_info(u8 *base, struct rga2_req *msg)
723*4882a593Smuzhiyun {
724*4882a593Smuzhiyun     RK_U32 *bRGA_ALPHA_CTRL0;
725*4882a593Smuzhiyun     RK_U32 *bRGA_ALPHA_CTRL1;
726*4882a593Smuzhiyun     RK_U32 *bRGA_FADING_CTRL;
727*4882a593Smuzhiyun     RK_U32 reg0 = 0;
728*4882a593Smuzhiyun     RK_U32 reg1 = 0;
729*4882a593Smuzhiyun 
730*4882a593Smuzhiyun     bRGA_ALPHA_CTRL0 = (RK_U32 *)(base + RGA2_ALPHA_CTRL0_OFFSET);
731*4882a593Smuzhiyun     bRGA_ALPHA_CTRL1 = (RK_U32 *)(base + RGA2_ALPHA_CTRL1_OFFSET);
732*4882a593Smuzhiyun     bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
733*4882a593Smuzhiyun 
734*4882a593Smuzhiyun     reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0)) | (s_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0(msg->alpha_rop_flag)));
735*4882a593Smuzhiyun     reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL)) | (s_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL(msg->alpha_rop_flag >> 1)));
736*4882a593Smuzhiyun     reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ROP_MODE)) | (s_RGA2_ALPHA_CTRL0_SW_ROP_MODE(msg->rop_mode)));
737*4882a593Smuzhiyun     reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA)) | (s_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA(msg->src_a_global_val)));
738*4882a593Smuzhiyun     reg0 = ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA)) | (s_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA(msg->dst_a_global_val)));
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_COLOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_COLOR_M0(msg->alpha_mode_0 >> 15)));
741*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_COLOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_COLOR_M0(msg->alpha_mode_0 >> 7)));
742*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M0(msg->alpha_mode_0 >> 12)));
743*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M0(msg->alpha_mode_0 >> 4)));
744*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M0(msg->alpha_mode_0 >> 11)));
745*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M0(msg->alpha_mode_0 >> 3)));
746*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M0(msg->alpha_mode_0 >> 9)));
747*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M0(msg->alpha_mode_0 >> 1)));
748*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M0)) | (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M0(msg->alpha_mode_0 >> 8)));
749*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M0)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M0(msg->alpha_mode_0 >> 0)));
750*4882a593Smuzhiyun 
751*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M1(msg->alpha_mode_1 >> 12)));
752*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M1(msg->alpha_mode_1 >> 4)));
753*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M1(msg->alpha_mode_1 >> 11)));
754*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M1(msg->alpha_mode_1 >> 3)));
755*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M1(msg->alpha_mode_1 >> 9)));
756*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M1(msg->alpha_mode_1 >> 1)));
757*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M1)) | (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M1(msg->alpha_mode_1 >> 8)));
758*4882a593Smuzhiyun     reg1 = ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M1)) | (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M1(msg->alpha_mode_1 >> 0)));
759*4882a593Smuzhiyun 
760*4882a593Smuzhiyun     *bRGA_ALPHA_CTRL0 = reg0;
761*4882a593Smuzhiyun     *bRGA_ALPHA_CTRL1 = reg1;
762*4882a593Smuzhiyun 
763*4882a593Smuzhiyun     if((msg->alpha_rop_flag>>2)&1)
764*4882a593Smuzhiyun     {
765*4882a593Smuzhiyun         *bRGA_FADING_CTRL = (1<<24) | (msg->fading_b_value<<16) | (msg->fading_g_value<<8) | (msg->fading_r_value);
766*4882a593Smuzhiyun     }
767*4882a593Smuzhiyun }
768*4882a593Smuzhiyun 
RGA2_set_reg_rop_info(u8 * base,struct rga2_req * msg)769*4882a593Smuzhiyun static void RGA2_set_reg_rop_info(u8 *base, struct rga2_req *msg)
770*4882a593Smuzhiyun {
771*4882a593Smuzhiyun     RK_U32 *bRGA_ALPHA_CTRL0;
772*4882a593Smuzhiyun     RK_U32 *bRGA_ROP_CTRL0;
773*4882a593Smuzhiyun     RK_U32 *bRGA_ROP_CTRL1;
774*4882a593Smuzhiyun     RK_U32 *bRGA_MASK_ADDR;
775*4882a593Smuzhiyun     RK_U32 *bRGA_FG_COLOR;
776*4882a593Smuzhiyun     RK_U32 *bRGA_PAT_CON;
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun     RK_U32 rop_code0 = 0;
779*4882a593Smuzhiyun     RK_U32 rop_code1 = 0;
780*4882a593Smuzhiyun 
781*4882a593Smuzhiyun     bRGA_ALPHA_CTRL0 = (RK_U32 *)(base + RGA2_ALPHA_CTRL0_OFFSET);
782*4882a593Smuzhiyun     bRGA_ROP_CTRL0 = (RK_U32 *)(base + RGA2_ROP_CTRL0_OFFSET);
783*4882a593Smuzhiyun     bRGA_ROP_CTRL1 = (RK_U32 *)(base + RGA2_ROP_CTRL1_OFFSET);
784*4882a593Smuzhiyun 	bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
785*4882a593Smuzhiyun     bRGA_FG_COLOR  = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);
786*4882a593Smuzhiyun     bRGA_PAT_CON   = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun     if(msg->rop_mode == 0) {
789*4882a593Smuzhiyun 	rop_code0 = RGA2_ROP3_code[(msg->rop_code & 0xff)];
790*4882a593Smuzhiyun     }
791*4882a593Smuzhiyun     else if(msg->rop_mode == 1) {
792*4882a593Smuzhiyun 	rop_code0 = RGA2_ROP3_code[(msg->rop_code & 0xff)];
793*4882a593Smuzhiyun     }
794*4882a593Smuzhiyun     else if(msg->rop_mode == 2) {
795*4882a593Smuzhiyun 	rop_code0 = RGA2_ROP3_code[(msg->rop_code & 0xff)];
796*4882a593Smuzhiyun 	rop_code1 = RGA2_ROP3_code[(msg->rop_code & 0xff00)>>8];
797*4882a593Smuzhiyun     }
798*4882a593Smuzhiyun 
799*4882a593Smuzhiyun     *bRGA_ROP_CTRL0 = rop_code0;
800*4882a593Smuzhiyun     *bRGA_ROP_CTRL1 = rop_code1;
801*4882a593Smuzhiyun     *bRGA_FG_COLOR = msg->fg_color;
802*4882a593Smuzhiyun     *bRGA_MASK_ADDR = (RK_U32)msg->rop_mask_addr;
803*4882a593Smuzhiyun     *bRGA_PAT_CON = (msg->pat.act_w-1) | ((msg->pat.act_h-1) << 8)
804*4882a593Smuzhiyun                      | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24);
805*4882a593Smuzhiyun     *bRGA_ALPHA_CTRL0 = *bRGA_ALPHA_CTRL0 | (((msg->endian_mode >> 1) & 1) << 20);
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun }
808*4882a593Smuzhiyun 
RGA2_set_reg_full_csc(u8 * base,struct rga2_req * msg)809*4882a593Smuzhiyun static void RGA2_set_reg_full_csc(u8 *base, struct rga2_req *msg)
810*4882a593Smuzhiyun {
811*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_00;
812*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_01;
813*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_02;
814*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_OFF0;
815*4882a593Smuzhiyun 
816*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_10;
817*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_11;
818*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_12;
819*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_OFF1;
820*4882a593Smuzhiyun 
821*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_20;
822*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_21;
823*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_22;
824*4882a593Smuzhiyun 	RK_U32 *bRGA2_DST_CSC_OFF2;
825*4882a593Smuzhiyun 
826*4882a593Smuzhiyun 	bRGA2_DST_CSC_00 = (RK_U32 *)(base + RGA2_DST_CSC_00_OFFSET);
827*4882a593Smuzhiyun 	bRGA2_DST_CSC_01 = (RK_U32 *)(base + RGA2_DST_CSC_01_OFFSET);
828*4882a593Smuzhiyun 	bRGA2_DST_CSC_02 = (RK_U32 *)(base + RGA2_DST_CSC_02_OFFSET);
829*4882a593Smuzhiyun 	bRGA2_DST_CSC_OFF0 = (RK_U32 *)(base + RGA2_DST_CSC_OFF0_OFFSET);
830*4882a593Smuzhiyun 
831*4882a593Smuzhiyun 	bRGA2_DST_CSC_10 = (RK_U32 *)(base + RGA2_DST_CSC_10_OFFSET);
832*4882a593Smuzhiyun 	bRGA2_DST_CSC_11 = (RK_U32 *)(base + RGA2_DST_CSC_11_OFFSET);
833*4882a593Smuzhiyun 	bRGA2_DST_CSC_12 = (RK_U32 *)(base + RGA2_DST_CSC_12_OFFSET);
834*4882a593Smuzhiyun 	bRGA2_DST_CSC_OFF1 = (RK_U32 *)(base + RGA2_DST_CSC_OFF1_OFFSET);
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun 	bRGA2_DST_CSC_20 = (RK_U32 *)(base + RGA2_DST_CSC_20_OFFSET);
837*4882a593Smuzhiyun 	bRGA2_DST_CSC_21 = (RK_U32 *)(base + RGA2_DST_CSC_21_OFFSET);
838*4882a593Smuzhiyun 	bRGA2_DST_CSC_22 = (RK_U32 *)(base + RGA2_DST_CSC_22_OFFSET);
839*4882a593Smuzhiyun 	bRGA2_DST_CSC_OFF2 = (RK_U32 *)(base + RGA2_DST_CSC_OFF2_OFFSET);
840*4882a593Smuzhiyun 
841*4882a593Smuzhiyun 	/* full csc coefficient */
842*4882a593Smuzhiyun 	/* Y coefficient */
843*4882a593Smuzhiyun 	*bRGA2_DST_CSC_00 = msg->full_csc.coe_y.r_v;
844*4882a593Smuzhiyun 	*bRGA2_DST_CSC_01 = msg->full_csc.coe_y.g_y;
845*4882a593Smuzhiyun 	*bRGA2_DST_CSC_02 = msg->full_csc.coe_y.b_u;
846*4882a593Smuzhiyun 	*bRGA2_DST_CSC_OFF0 = msg->full_csc.coe_y.off;
847*4882a593Smuzhiyun 	/* U coefficient */
848*4882a593Smuzhiyun 	*bRGA2_DST_CSC_10 = msg->full_csc.coe_u.r_v;
849*4882a593Smuzhiyun 	*bRGA2_DST_CSC_11 = msg->full_csc.coe_u.g_y;
850*4882a593Smuzhiyun 	*bRGA2_DST_CSC_12 = msg->full_csc.coe_u.b_u;
851*4882a593Smuzhiyun 	*bRGA2_DST_CSC_OFF1 = msg->full_csc.coe_u.off;
852*4882a593Smuzhiyun 	/* V coefficient */
853*4882a593Smuzhiyun 	*bRGA2_DST_CSC_20 = msg->full_csc.coe_v.r_v;
854*4882a593Smuzhiyun 	*bRGA2_DST_CSC_21 = msg->full_csc.coe_v.g_y;
855*4882a593Smuzhiyun 	*bRGA2_DST_CSC_22 = msg->full_csc.coe_v.b_u;
856*4882a593Smuzhiyun 	*bRGA2_DST_CSC_OFF2 = msg->full_csc.coe_v.off;
857*4882a593Smuzhiyun }
858*4882a593Smuzhiyun 
RGA2_set_reg_color_palette(RK_U8 * base,struct rga2_req * msg)859*4882a593Smuzhiyun static void RGA2_set_reg_color_palette(RK_U8 *base, struct rga2_req *msg)
860*4882a593Smuzhiyun {
861*4882a593Smuzhiyun     RK_U32 *bRGA_SRC_BASE0, *bRGA_SRC_INFO, *bRGA_SRC_VIR_INFO, *bRGA_SRC_ACT_INFO, *bRGA_SRC_FG_COLOR, *bRGA_SRC_BG_COLOR;
862*4882a593Smuzhiyun     RK_U32  *p;
863*4882a593Smuzhiyun     RK_S16  x_off, y_off;
864*4882a593Smuzhiyun     RK_U16  src_stride;
865*4882a593Smuzhiyun     RK_U8   shift;
866*4882a593Smuzhiyun     RK_U32  sw;
867*4882a593Smuzhiyun     RK_U32  byte_num;
868*4882a593Smuzhiyun     RK_U32 reg;
869*4882a593Smuzhiyun 
870*4882a593Smuzhiyun     bRGA_SRC_BASE0 = (RK_U32 *)(base + RGA2_SRC_BASE0_OFFSET);
871*4882a593Smuzhiyun 	bRGA_SRC_INFO = (RK_U32 *)(base + RGA2_SRC_INFO_OFFSET);
872*4882a593Smuzhiyun     bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);
873*4882a593Smuzhiyun     bRGA_SRC_ACT_INFO = (RK_U32 *)(base + RGA2_SRC_ACT_INFO_OFFSET);
874*4882a593Smuzhiyun     bRGA_SRC_FG_COLOR = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);
875*4882a593Smuzhiyun     bRGA_SRC_BG_COLOR = (RK_U32 *)(base + RGA2_SRC_BG_COLOR_OFFSET);
876*4882a593Smuzhiyun 
877*4882a593Smuzhiyun     reg = 0;
878*4882a593Smuzhiyun 
879*4882a593Smuzhiyun     shift = 3 - msg->palette_mode;
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun     x_off = msg->src.x_offset;
882*4882a593Smuzhiyun     y_off = msg->src.y_offset;
883*4882a593Smuzhiyun 
884*4882a593Smuzhiyun     sw = msg->src.vir_w;
885*4882a593Smuzhiyun     byte_num = sw >> shift;
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun     src_stride = (byte_num + 3) & (~3);
888*4882a593Smuzhiyun 
889*4882a593Smuzhiyun     p = (RK_U32 *)((unsigned long)msg->src.yrgb_addr);
890*4882a593Smuzhiyun 
891*4882a593Smuzhiyun     #if 0
892*4882a593Smuzhiyun     if(endian_mode)
893*4882a593Smuzhiyun     {
894*4882a593Smuzhiyun         p = p + (x_off>>shift) + y_off*src_stride;
895*4882a593Smuzhiyun     }
896*4882a593Smuzhiyun     else
897*4882a593Smuzhiyun     {
898*4882a593Smuzhiyun         p = p + (((x_off>>shift)>>2)<<2) + (3 - ((x_off>>shift) & 3)) + y_off*src_stride;
899*4882a593Smuzhiyun     }
900*4882a593Smuzhiyun     #endif
901*4882a593Smuzhiyun 
902*4882a593Smuzhiyun     p = p + (x_off>>shift) + y_off*src_stride;
903*4882a593Smuzhiyun 
904*4882a593Smuzhiyun 
905*4882a593Smuzhiyun     *bRGA_SRC_BASE0 = (unsigned long)p;
906*4882a593Smuzhiyun 
907*4882a593Smuzhiyun 	reg = ((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) | (s_RGA2_SRC_INFO_SW_SRC_FMT((msg->palette_mode | 0xc))));
908*4882a593Smuzhiyun     reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_CP_ENDAIN)) | (s_RGA2_SRC_INFO_SW_SW_CP_ENDAIN(msg->endian_mode & 1)));
909*4882a593Smuzhiyun     *bRGA_SRC_VIR_INFO = src_stride >> 2;
910*4882a593Smuzhiyun     *bRGA_SRC_ACT_INFO = (msg->src.act_w - 1) | ((msg->src.act_h - 1) << 16);
911*4882a593Smuzhiyun     *bRGA_SRC_INFO = reg;
912*4882a593Smuzhiyun 
913*4882a593Smuzhiyun     *bRGA_SRC_FG_COLOR = msg->fg_color;
914*4882a593Smuzhiyun     *bRGA_SRC_BG_COLOR = msg->bg_color;
915*4882a593Smuzhiyun 
916*4882a593Smuzhiyun }
917*4882a593Smuzhiyun 
RGA2_set_reg_color_fill(u8 * base,struct rga2_req * msg)918*4882a593Smuzhiyun static void RGA2_set_reg_color_fill(u8 *base, struct rga2_req *msg)
919*4882a593Smuzhiyun {
920*4882a593Smuzhiyun     RK_U32 *bRGA_CF_GR_A;
921*4882a593Smuzhiyun     RK_U32 *bRGA_CF_GR_B;
922*4882a593Smuzhiyun     RK_U32 *bRGA_CF_GR_G;
923*4882a593Smuzhiyun     RK_U32 *bRGA_CF_GR_R;
924*4882a593Smuzhiyun     RK_U32 *bRGA_SRC_FG_COLOR;
925*4882a593Smuzhiyun     RK_U32 *bRGA_MASK_ADDR;
926*4882a593Smuzhiyun     RK_U32 *bRGA_PAT_CON;
927*4882a593Smuzhiyun 
928*4882a593Smuzhiyun     RK_U32 mask_stride;
929*4882a593Smuzhiyun     RK_U32 *bRGA_SRC_VIR_INFO;
930*4882a593Smuzhiyun 
931*4882a593Smuzhiyun     bRGA_SRC_FG_COLOR = (RK_U32 *)(base + RGA2_SRC_FG_COLOR_OFFSET);
932*4882a593Smuzhiyun 
933*4882a593Smuzhiyun     bRGA_CF_GR_A = (RK_U32 *)(base + RGA2_CF_GR_A_OFFSET);
934*4882a593Smuzhiyun     bRGA_CF_GR_B = (RK_U32 *)(base + RGA2_CF_GR_B_OFFSET);
935*4882a593Smuzhiyun     bRGA_CF_GR_G = (RK_U32 *)(base + RGA2_CF_GR_G_OFFSET);
936*4882a593Smuzhiyun     bRGA_CF_GR_R = (RK_U32 *)(base + RGA2_CF_GR_R_OFFSET);
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun     bRGA_MASK_ADDR = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
939*4882a593Smuzhiyun     bRGA_PAT_CON = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
940*4882a593Smuzhiyun 
941*4882a593Smuzhiyun     bRGA_SRC_VIR_INFO = (RK_U32 *)(base + RGA2_SRC_VIR_INFO_OFFSET);
942*4882a593Smuzhiyun 
943*4882a593Smuzhiyun     mask_stride = msg->rop_mask_stride;
944*4882a593Smuzhiyun 
945*4882a593Smuzhiyun     if(msg->color_fill_mode == 0)
946*4882a593Smuzhiyun     {
947*4882a593Smuzhiyun         /* solid color */
948*4882a593Smuzhiyun         *bRGA_CF_GR_A = (msg->gr_color.gr_x_a & 0xffff) | (msg->gr_color.gr_y_a << 16);
949*4882a593Smuzhiyun         *bRGA_CF_GR_B = (msg->gr_color.gr_x_b & 0xffff) | (msg->gr_color.gr_y_b << 16);
950*4882a593Smuzhiyun         *bRGA_CF_GR_G = (msg->gr_color.gr_x_g & 0xffff) | (msg->gr_color.gr_y_g << 16);
951*4882a593Smuzhiyun         *bRGA_CF_GR_R = (msg->gr_color.gr_x_r & 0xffff) | (msg->gr_color.gr_y_r << 16);
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun         *bRGA_SRC_FG_COLOR = msg->fg_color;
954*4882a593Smuzhiyun     }
955*4882a593Smuzhiyun     else
956*4882a593Smuzhiyun     {
957*4882a593Smuzhiyun         /* patten color */
958*4882a593Smuzhiyun         *bRGA_MASK_ADDR = (RK_U32)msg->pat.yrgb_addr;
959*4882a593Smuzhiyun         *bRGA_PAT_CON = (msg->pat.act_w - 1) | ((msg->pat.act_h - 1) << 8)
960*4882a593Smuzhiyun                        | (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24);
961*4882a593Smuzhiyun     }
962*4882a593Smuzhiyun 	*bRGA_SRC_VIR_INFO = mask_stride << 16;
963*4882a593Smuzhiyun }
964*4882a593Smuzhiyun 
RGA2_set_reg_update_palette_table(RK_U8 * base,struct rga2_req * msg)965*4882a593Smuzhiyun static void RGA2_set_reg_update_palette_table(RK_U8 *base, struct rga2_req *msg)
966*4882a593Smuzhiyun {
967*4882a593Smuzhiyun     RK_U32 *bRGA_MASK_BASE;
968*4882a593Smuzhiyun     RK_U32 *bRGA_FADING_CTRL;
969*4882a593Smuzhiyun 
970*4882a593Smuzhiyun     bRGA_MASK_BASE  = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
971*4882a593Smuzhiyun     bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
972*4882a593Smuzhiyun 
973*4882a593Smuzhiyun     *bRGA_FADING_CTRL = msg->fading_g_value << 8;
974*4882a593Smuzhiyun     *bRGA_MASK_BASE = (RK_U32)msg->pat.yrgb_addr;
975*4882a593Smuzhiyun }
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun 
RGA2_set_reg_update_patten_buff(RK_U8 * base,struct rga2_req * msg)978*4882a593Smuzhiyun static void RGA2_set_reg_update_patten_buff(RK_U8 *base, struct rga2_req *msg)
979*4882a593Smuzhiyun {
980*4882a593Smuzhiyun     u32 *bRGA_PAT_MST;
981*4882a593Smuzhiyun     u32 *bRGA_PAT_CON;
982*4882a593Smuzhiyun     u32 *bRGA_PAT_START_POINT;
983*4882a593Smuzhiyun     RK_U32 *bRGA_FADING_CTRL;
984*4882a593Smuzhiyun     u32 reg = 0;
985*4882a593Smuzhiyun     rga_img_info_t *pat;
986*4882a593Smuzhiyun 
987*4882a593Smuzhiyun     RK_U32 num, offset;
988*4882a593Smuzhiyun 
989*4882a593Smuzhiyun     pat = &msg->pat;
990*4882a593Smuzhiyun 
991*4882a593Smuzhiyun     num = (pat->act_w * pat->act_h) - 1;
992*4882a593Smuzhiyun 
993*4882a593Smuzhiyun     offset = pat->act_w * pat->y_offset + pat->x_offset;
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun     bRGA_PAT_START_POINT = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
996*4882a593Smuzhiyun     bRGA_PAT_MST = (RK_U32 *)(base + RGA2_MASK_BASE_OFFSET);
997*4882a593Smuzhiyun     bRGA_PAT_CON = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
998*4882a593Smuzhiyun     bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
999*4882a593Smuzhiyun 
1000*4882a593Smuzhiyun     *bRGA_PAT_MST = (RK_U32)msg->pat.yrgb_addr;
1001*4882a593Smuzhiyun     *bRGA_PAT_START_POINT = (pat->act_w * pat->y_offset) + pat->x_offset;
1002*4882a593Smuzhiyun 
1003*4882a593Smuzhiyun     reg = (pat->act_w-1) | ((pat->act_h-1) << 8) | (pat->x_offset << 16) | (pat->y_offset << 24);
1004*4882a593Smuzhiyun     *bRGA_PAT_CON = reg;
1005*4882a593Smuzhiyun 
1006*4882a593Smuzhiyun     *bRGA_FADING_CTRL = (num << 8) | offset;
1007*4882a593Smuzhiyun }
1008*4882a593Smuzhiyun 
RGA2_set_pat_info(RK_U8 * base,struct rga2_req * msg)1009*4882a593Smuzhiyun static void RGA2_set_pat_info(RK_U8 *base, struct rga2_req *msg)
1010*4882a593Smuzhiyun {
1011*4882a593Smuzhiyun     u32 *bRGA_PAT_CON;
1012*4882a593Smuzhiyun     u32 *bRGA_FADING_CTRL;
1013*4882a593Smuzhiyun     u32 reg = 0;
1014*4882a593Smuzhiyun     rga_img_info_t *pat;
1015*4882a593Smuzhiyun 
1016*4882a593Smuzhiyun     RK_U32 num, offset;
1017*4882a593Smuzhiyun 
1018*4882a593Smuzhiyun     pat = &msg->pat;
1019*4882a593Smuzhiyun 
1020*4882a593Smuzhiyun     num = ((pat->act_w * pat->act_h) - 1) & 0xff;
1021*4882a593Smuzhiyun 
1022*4882a593Smuzhiyun     offset = (pat->act_w * pat->y_offset) + pat->x_offset;
1023*4882a593Smuzhiyun 
1024*4882a593Smuzhiyun     bRGA_PAT_CON     = (RK_U32 *)(base + RGA2_PAT_CON_OFFSET);
1025*4882a593Smuzhiyun     bRGA_FADING_CTRL = (RK_U32 *)(base + RGA2_FADING_CTRL_OFFSET);
1026*4882a593Smuzhiyun 
1027*4882a593Smuzhiyun     reg = (pat->act_w-1) | ((pat->act_h-1) << 8) | (pat->x_offset << 16) | (pat->y_offset << 24);
1028*4882a593Smuzhiyun     *bRGA_PAT_CON = reg;
1029*4882a593Smuzhiyun     *bRGA_FADING_CTRL = (num << 8) | offset;
1030*4882a593Smuzhiyun }
1031*4882a593Smuzhiyun 
RGA2_set_mmu_info(RK_U8 * base,struct rga2_req * msg)1032*4882a593Smuzhiyun static void RGA2_set_mmu_info(RK_U8 *base, struct rga2_req *msg)
1033*4882a593Smuzhiyun {
1034*4882a593Smuzhiyun     RK_U32 *bRGA_MMU_CTRL1;
1035*4882a593Smuzhiyun     RK_U32 *bRGA_MMU_SRC_BASE;
1036*4882a593Smuzhiyun     RK_U32 *bRGA_MMU_SRC1_BASE;
1037*4882a593Smuzhiyun     RK_U32 *bRGA_MMU_DST_BASE;
1038*4882a593Smuzhiyun     RK_U32 *bRGA_MMU_ELS_BASE;
1039*4882a593Smuzhiyun 
1040*4882a593Smuzhiyun     RK_U32 reg;
1041*4882a593Smuzhiyun 
1042*4882a593Smuzhiyun     bRGA_MMU_CTRL1 = (RK_U32 *)(base + RGA2_MMU_CTRL1_OFFSET);
1043*4882a593Smuzhiyun     bRGA_MMU_SRC_BASE = (RK_U32 *)(base + RGA2_MMU_SRC_BASE_OFFSET);
1044*4882a593Smuzhiyun     bRGA_MMU_SRC1_BASE = (RK_U32 *)(base + RGA2_MMU_SRC1_BASE_OFFSET);
1045*4882a593Smuzhiyun     bRGA_MMU_DST_BASE = (RK_U32 *)(base + RGA2_MMU_DST_BASE_OFFSET);
1046*4882a593Smuzhiyun     bRGA_MMU_ELS_BASE = (RK_U32 *)(base + RGA2_MMU_ELS_BASE_OFFSET);
1047*4882a593Smuzhiyun 
1048*4882a593Smuzhiyun     reg = (msg->mmu_info.src0_mmu_flag & 0xf) | ((msg->mmu_info.src1_mmu_flag & 0xf) << 4)
1049*4882a593Smuzhiyun          | ((msg->mmu_info.dst_mmu_flag & 0xf) << 8) | ((msg->mmu_info.els_mmu_flag & 0x3) << 12);
1050*4882a593Smuzhiyun 
1051*4882a593Smuzhiyun     *bRGA_MMU_CTRL1 = reg;
1052*4882a593Smuzhiyun     *bRGA_MMU_SRC_BASE  = (RK_U32)(msg->mmu_info.src0_base_addr) >> 4;
1053*4882a593Smuzhiyun     *bRGA_MMU_SRC1_BASE = (RK_U32)(msg->mmu_info.src1_base_addr) >> 4;
1054*4882a593Smuzhiyun     *bRGA_MMU_DST_BASE  = (RK_U32)(msg->mmu_info.dst_base_addr)  >> 4;
1055*4882a593Smuzhiyun     *bRGA_MMU_ELS_BASE  = (RK_U32)(msg->mmu_info.els_base_addr)  >> 4;
1056*4882a593Smuzhiyun }
1057*4882a593Smuzhiyun 
1058*4882a593Smuzhiyun int
RGA2_gen_reg_info(RK_U8 * base,RK_U8 * csc_base,struct rga2_req * msg)1059*4882a593Smuzhiyun RGA2_gen_reg_info(RK_U8 *base, RK_U8 *csc_base, struct rga2_req *msg)
1060*4882a593Smuzhiyun {
1061*4882a593Smuzhiyun 	RK_U8 dst_nn_quantize_en = 0;
1062*4882a593Smuzhiyun 
1063*4882a593Smuzhiyun     RGA2_set_mode_ctrl(base, msg);
1064*4882a593Smuzhiyun 
1065*4882a593Smuzhiyun     RGA2_set_pat_info(base, msg);
1066*4882a593Smuzhiyun 
1067*4882a593Smuzhiyun     switch(msg->render_mode)
1068*4882a593Smuzhiyun     {
1069*4882a593Smuzhiyun         case bitblt_mode:
1070*4882a593Smuzhiyun             RGA2_set_reg_src_info(base, msg);
1071*4882a593Smuzhiyun             RGA2_set_reg_dst_info(base, msg);
1072*4882a593Smuzhiyun 			dst_nn_quantize_en = (msg->alpha_rop_flag >> 8)&0x1 ;
1073*4882a593Smuzhiyun 			if (dst_nn_quantize_en != 1) {
1074*4882a593Smuzhiyun 				if ((msg->dst.format != RGA2_FORMAT_Y4)) {
1075*4882a593Smuzhiyun 					RGA2_set_reg_alpha_info(base, msg);
1076*4882a593Smuzhiyun 					RGA2_set_reg_rop_info(base, msg);
1077*4882a593Smuzhiyun 				}
1078*4882a593Smuzhiyun 			}
1079*4882a593Smuzhiyun 
1080*4882a593Smuzhiyun 			if (msg->full_csc.flag) {
1081*4882a593Smuzhiyun 				RGA2_set_reg_full_csc(csc_base, msg);
1082*4882a593Smuzhiyun 			}
1083*4882a593Smuzhiyun             break;
1084*4882a593Smuzhiyun         case color_fill_mode :
1085*4882a593Smuzhiyun             RGA2_set_reg_color_fill(base, msg);
1086*4882a593Smuzhiyun             RGA2_set_reg_dst_info(base, msg);
1087*4882a593Smuzhiyun             RGA2_set_reg_alpha_info(base, msg);
1088*4882a593Smuzhiyun             break;
1089*4882a593Smuzhiyun         case color_palette_mode :
1090*4882a593Smuzhiyun             RGA2_set_reg_color_palette(base, msg);
1091*4882a593Smuzhiyun             RGA2_set_reg_dst_info(base, msg);
1092*4882a593Smuzhiyun             break;
1093*4882a593Smuzhiyun         case update_palette_table_mode :
1094*4882a593Smuzhiyun             RGA2_set_reg_update_palette_table(base, msg);
1095*4882a593Smuzhiyun             break;
1096*4882a593Smuzhiyun         case update_patten_buff_mode :
1097*4882a593Smuzhiyun             RGA2_set_reg_update_patten_buff(base, msg);
1098*4882a593Smuzhiyun             break;
1099*4882a593Smuzhiyun         default :
1100*4882a593Smuzhiyun             printk("RGA2 ERROR msg render mode %d \n", msg->render_mode);
1101*4882a593Smuzhiyun             break;
1102*4882a593Smuzhiyun 
1103*4882a593Smuzhiyun     }
1104*4882a593Smuzhiyun 
1105*4882a593Smuzhiyun     RGA2_set_mmu_info(base, msg);
1106*4882a593Smuzhiyun 
1107*4882a593Smuzhiyun     return 0;
1108*4882a593Smuzhiyun 
1109*4882a593Smuzhiyun }
1110*4882a593Smuzhiyun 
format_name_convert(uint32_t * df,uint32_t sf)1111*4882a593Smuzhiyun static void format_name_convert(uint32_t *df, uint32_t sf)
1112*4882a593Smuzhiyun {
1113*4882a593Smuzhiyun     switch(sf)
1114*4882a593Smuzhiyun     {
1115*4882a593Smuzhiyun         case 0x0: *df = RGA2_FORMAT_RGBA_8888; break;
1116*4882a593Smuzhiyun         case 0x1: *df = RGA2_FORMAT_RGBX_8888; break;
1117*4882a593Smuzhiyun         case 0x2: *df = RGA2_FORMAT_RGB_888; break;
1118*4882a593Smuzhiyun         case 0x3: *df = RGA2_FORMAT_BGRA_8888; break;
1119*4882a593Smuzhiyun         case 0x4: *df = RGA2_FORMAT_RGB_565; break;
1120*4882a593Smuzhiyun         case 0x5: *df = RGA2_FORMAT_RGBA_5551; break;
1121*4882a593Smuzhiyun         case 0x6: *df = RGA2_FORMAT_RGBA_4444; break;
1122*4882a593Smuzhiyun         case 0x7: *df = RGA2_FORMAT_BGR_888; break;
1123*4882a593Smuzhiyun         case 0x16: *df = RGA2_FORMAT_BGRX_8888; break;
1124*4882a593Smuzhiyun         case 0x8: *df = RGA2_FORMAT_YCbCr_422_SP; break;
1125*4882a593Smuzhiyun         case 0x9: *df = RGA2_FORMAT_YCbCr_422_P; break;
1126*4882a593Smuzhiyun         case 0xa: *df = RGA2_FORMAT_YCbCr_420_SP; break;
1127*4882a593Smuzhiyun         case 0xb: *df = RGA2_FORMAT_YCbCr_420_P; break;
1128*4882a593Smuzhiyun         case 0xc: *df = RGA2_FORMAT_YCrCb_422_SP; break;
1129*4882a593Smuzhiyun         case 0xd: *df = RGA2_FORMAT_YCrCb_422_P; break;
1130*4882a593Smuzhiyun         case 0xe: *df = RGA2_FORMAT_YCrCb_420_SP; break;
1131*4882a593Smuzhiyun         case 0xf: *df = RGA2_FORMAT_YCrCb_420_P; break;
1132*4882a593Smuzhiyun 
1133*4882a593Smuzhiyun         case 0x10: *df = RGA2_FORMAT_BPP_1; break;
1134*4882a593Smuzhiyun         case 0x11: *df = RGA2_FORMAT_BPP_2; break;
1135*4882a593Smuzhiyun         case 0x12: *df = RGA2_FORMAT_BPP_4; break;
1136*4882a593Smuzhiyun         case 0x13: *df = RGA2_FORMAT_BPP_8; break;
1137*4882a593Smuzhiyun 
1138*4882a593Smuzhiyun         case 0x14: *df = RGA2_FORMAT_Y4; break;
1139*4882a593Smuzhiyun         case 0x15: *df = RGA2_FORMAT_YCbCr_400; break;
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun         case 0x18: *df = RGA2_FORMAT_YVYU_422; break;
1142*4882a593Smuzhiyun         case 0x19: *df = RGA2_FORMAT_YVYU_420; break;
1143*4882a593Smuzhiyun         case 0x1a: *df = RGA2_FORMAT_VYUY_422; break;
1144*4882a593Smuzhiyun         case 0x1b: *df = RGA2_FORMAT_VYUY_420; break;
1145*4882a593Smuzhiyun         case 0x1c: *df = RGA2_FORMAT_YUYV_422; break;
1146*4882a593Smuzhiyun         case 0x1d: *df = RGA2_FORMAT_YUYV_420; break;
1147*4882a593Smuzhiyun         case 0x1e: *df = RGA2_FORMAT_UYVY_422; break;
1148*4882a593Smuzhiyun         case 0x1f: *df = RGA2_FORMAT_UYVY_420; break;
1149*4882a593Smuzhiyun 
1150*4882a593Smuzhiyun         case 0x20:*df = RGA2_FORMAT_YCbCr_420_SP_10B; break;
1151*4882a593Smuzhiyun         case 0x21:*df = RGA2_FORMAT_YCrCb_420_SP_10B; break;
1152*4882a593Smuzhiyun         case 0x22:*df = RGA2_FORMAT_YCbCr_422_SP_10B; break;
1153*4882a593Smuzhiyun         case 0x23:*df = RGA2_FORMAT_YCrCb_422_SP_10B; break;
1154*4882a593Smuzhiyun 
1155*4882a593Smuzhiyun 	case 0x24:*df = RGA2_FORMAT_BGR_565; break;
1156*4882a593Smuzhiyun 	case 0x25:*df = RGA2_FORMAT_BGRA_5551; break;
1157*4882a593Smuzhiyun 	case 0x26:*df = RGA2_FORMAT_BGRA_4444; break;
1158*4882a593Smuzhiyun 
1159*4882a593Smuzhiyun 
1160*4882a593Smuzhiyun 	case 0x28 : *df = RGA2_FORMAT_ARGB_8888; break;
1161*4882a593Smuzhiyun 	case 0x29 : *df = RGA2_FORMAT_XRGB_8888; break;
1162*4882a593Smuzhiyun 	case 0x2a : *df = RGA2_FORMAT_ARGB_5551; break;
1163*4882a593Smuzhiyun 	case 0x2b : *df = RGA2_FORMAT_ARGB_4444; break;
1164*4882a593Smuzhiyun 	case 0x2c : *df = RGA2_FORMAT_ABGR_8888; break;
1165*4882a593Smuzhiyun 	case 0x2d : *df = RGA2_FORMAT_XBGR_8888; break;
1166*4882a593Smuzhiyun 	case 0x2e : *df = RGA2_FORMAT_ABGR_5551; break;
1167*4882a593Smuzhiyun 	case 0x2f : *df = RGA2_FORMAT_ABGR_4444; break;
1168*4882a593Smuzhiyun     }
1169*4882a593Smuzhiyun }
1170*4882a593Smuzhiyun 
RGA_MSG_2_RGA2_MSG(struct rga_req * req_rga,struct rga2_req * req)1171*4882a593Smuzhiyun void RGA_MSG_2_RGA2_MSG(struct rga_req *req_rga, struct rga2_req *req)
1172*4882a593Smuzhiyun {
1173*4882a593Smuzhiyun 	u16 alpha_mode_0, alpha_mode_1;
1174*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
1175*4882a593Smuzhiyun 	if (req_rga->render_mode & RGA_BUF_GEM_TYPE_MASK)
1176*4882a593Smuzhiyun 		req->buf_type = RGA_BUF_GEM_TYPE_MASK & RGA_BUF_GEM_TYPE_DMA;
1177*4882a593Smuzhiyun 
1178*4882a593Smuzhiyun 	req_rga->render_mode &= (~RGA_BUF_GEM_TYPE_MASK);
1179*4882a593Smuzhiyun #endif
1180*4882a593Smuzhiyun 
1181*4882a593Smuzhiyun     if (req_rga->render_mode == 6)
1182*4882a593Smuzhiyun         req->render_mode = update_palette_table_mode;
1183*4882a593Smuzhiyun     else if (req_rga->render_mode == 7)
1184*4882a593Smuzhiyun         req->render_mode = update_patten_buff_mode;
1185*4882a593Smuzhiyun     else if (req_rga->render_mode == 5)
1186*4882a593Smuzhiyun         req->render_mode = bitblt_mode;
1187*4882a593Smuzhiyun     else
1188*4882a593Smuzhiyun         req->render_mode = req_rga->render_mode;
1189*4882a593Smuzhiyun 
1190*4882a593Smuzhiyun     memcpy(&req->src, &req_rga->src, sizeof(req_rga->src));
1191*4882a593Smuzhiyun     memcpy(&req->dst, &req_rga->dst, sizeof(req_rga->dst));
1192*4882a593Smuzhiyun     /* The application will only import pat or src1. */
1193*4882a593Smuzhiyun     if (req->render_mode == update_palette_table_mode) {
1194*4882a593Smuzhiyun         memcpy(&req->pat, &req_rga->pat, sizeof(req_rga->pat));
1195*4882a593Smuzhiyun     } else {
1196*4882a593Smuzhiyun         memcpy(&req->src1, &req_rga->pat, sizeof(req_rga->pat));
1197*4882a593Smuzhiyun     }
1198*4882a593Smuzhiyun 
1199*4882a593Smuzhiyun     format_name_convert(&req->src.format, req_rga->src.format);
1200*4882a593Smuzhiyun     format_name_convert(&req->dst.format, req_rga->dst.format);
1201*4882a593Smuzhiyun     format_name_convert(&req->src1.format, req_rga->pat.format);
1202*4882a593Smuzhiyun 
1203*4882a593Smuzhiyun     switch (req_rga->rotate_mode & 0x0F) {
1204*4882a593Smuzhiyun     case 1:
1205*4882a593Smuzhiyun         if(req_rga->sina == 0 && req_rga->cosa == 65536) {
1206*4882a593Smuzhiyun             /* rotate 0 */
1207*4882a593Smuzhiyun             req->rotate_mode = 0;
1208*4882a593Smuzhiyun         } else if (req_rga->sina == 65536 && req_rga->cosa == 0) {
1209*4882a593Smuzhiyun             /* rotate 90 */
1210*4882a593Smuzhiyun             req->rotate_mode = 1;
1211*4882a593Smuzhiyun             req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_h + 1;
1212*4882a593Smuzhiyun             req->dst.act_w = req_rga->dst.act_h;
1213*4882a593Smuzhiyun             req->dst.act_h = req_rga->dst.act_w;
1214*4882a593Smuzhiyun         } else if (req_rga->sina == 0 && req_rga->cosa == -65536) {
1215*4882a593Smuzhiyun             /* rotate 180 */
1216*4882a593Smuzhiyun             req->rotate_mode = 2;
1217*4882a593Smuzhiyun             req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_w + 1;
1218*4882a593Smuzhiyun             req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_h + 1;
1219*4882a593Smuzhiyun         } else if (req_rga->sina == -65536 && req_rga->cosa == 0) {
1220*4882a593Smuzhiyun             /* totate 270 */
1221*4882a593Smuzhiyun             req->rotate_mode = 3;
1222*4882a593Smuzhiyun             req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_w + 1;
1223*4882a593Smuzhiyun             req->dst.act_w = req_rga->dst.act_h;
1224*4882a593Smuzhiyun             req->dst.act_h = req_rga->dst.act_w;
1225*4882a593Smuzhiyun         }
1226*4882a593Smuzhiyun         break;
1227*4882a593Smuzhiyun     case 2:
1228*4882a593Smuzhiyun         //x_mirror
1229*4882a593Smuzhiyun         req->rotate_mode |= (1 << 4);
1230*4882a593Smuzhiyun         break;
1231*4882a593Smuzhiyun     case 3:
1232*4882a593Smuzhiyun         //y_mirror
1233*4882a593Smuzhiyun         req->rotate_mode |= (2 << 4);
1234*4882a593Smuzhiyun         break;
1235*4882a593Smuzhiyun     case 4:
1236*4882a593Smuzhiyun         //x_mirror+y_mirror
1237*4882a593Smuzhiyun         req->rotate_mode |= (3 << 4);
1238*4882a593Smuzhiyun         break;
1239*4882a593Smuzhiyun     default:
1240*4882a593Smuzhiyun         req->rotate_mode = 0;
1241*4882a593Smuzhiyun         break;
1242*4882a593Smuzhiyun     }
1243*4882a593Smuzhiyun 
1244*4882a593Smuzhiyun     switch ((req_rga->rotate_mode & 0xF0) >> 4) {
1245*4882a593Smuzhiyun     case 2:
1246*4882a593Smuzhiyun         //x_mirror
1247*4882a593Smuzhiyun         req->rotate_mode |= (1 << 4);
1248*4882a593Smuzhiyun         break;
1249*4882a593Smuzhiyun     case 3:
1250*4882a593Smuzhiyun         //y_mirror
1251*4882a593Smuzhiyun         req->rotate_mode |= (2 << 4);
1252*4882a593Smuzhiyun         break;
1253*4882a593Smuzhiyun     case 4:
1254*4882a593Smuzhiyun         //x_mirror+y_mirror
1255*4882a593Smuzhiyun         req->rotate_mode |= (3 << 4);
1256*4882a593Smuzhiyun         break;
1257*4882a593Smuzhiyun     }
1258*4882a593Smuzhiyun 
1259*4882a593Smuzhiyun     if((req->dst.act_w > 2048) && (req->src.act_h < req->dst.act_h))
1260*4882a593Smuzhiyun         req->scale_bicu_mode |= (1<<4);
1261*4882a593Smuzhiyun 
1262*4882a593Smuzhiyun     req->LUT_addr = req_rga->LUT_addr;
1263*4882a593Smuzhiyun     req->rop_mask_addr = req_rga->rop_mask_addr;
1264*4882a593Smuzhiyun 
1265*4882a593Smuzhiyun     req->bitblt_mode = req_rga->bsfilter_flag;
1266*4882a593Smuzhiyun 
1267*4882a593Smuzhiyun     req->src_a_global_val = req_rga->alpha_global_value;
1268*4882a593Smuzhiyun     req->dst_a_global_val = req_rga->alpha_global_value;
1269*4882a593Smuzhiyun     req->rop_code = req_rga->rop_code;
1270*4882a593Smuzhiyun     req->rop_mode = req_rga->alpha_rop_mode;
1271*4882a593Smuzhiyun 
1272*4882a593Smuzhiyun     req->color_fill_mode = req_rga->color_fill_mode;
1273*4882a593Smuzhiyun     req->alpha_zero_key = req_rga->alpha_rop_mode >> 4;
1274*4882a593Smuzhiyun     req->src_trans_mode = req_rga->src_trans_mode;
1275*4882a593Smuzhiyun     req->color_key_min   = req_rga->color_key_min;
1276*4882a593Smuzhiyun     req->color_key_max   = req_rga->color_key_max;
1277*4882a593Smuzhiyun 
1278*4882a593Smuzhiyun     req->fg_color = req_rga->fg_color;
1279*4882a593Smuzhiyun     req->bg_color = req_rga->bg_color;
1280*4882a593Smuzhiyun     memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));
1281*4882a593Smuzhiyun     memcpy(&req->full_csc, &req_rga->full_csc, sizeof(req_rga->full_csc));
1282*4882a593Smuzhiyun 
1283*4882a593Smuzhiyun     req->palette_mode = req_rga->palette_mode;
1284*4882a593Smuzhiyun     req->yuv2rgb_mode = req_rga->yuv2rgb_mode;
1285*4882a593Smuzhiyun     req->endian_mode = req_rga->endian_mode;
1286*4882a593Smuzhiyun     req->rgb2yuv_mode = 0;
1287*4882a593Smuzhiyun 
1288*4882a593Smuzhiyun     req->fading_alpha_value = 0;
1289*4882a593Smuzhiyun     req->fading_r_value = req_rga->fading.r;
1290*4882a593Smuzhiyun     req->fading_g_value = req_rga->fading.g;
1291*4882a593Smuzhiyun     req->fading_b_value = req_rga->fading.b;
1292*4882a593Smuzhiyun 
1293*4882a593Smuzhiyun     /* alpha mode set */
1294*4882a593Smuzhiyun     req->alpha_rop_flag = 0;
1295*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag & 1)));           // alpha_rop_enable
1296*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 1) & 1) << 1); // rop_enable
1297*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 2) & 1) << 2); // fading_enable
1298*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 4) & 1) << 3); // alpha_cal_mode_sel
1299*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 5) & 1) << 6); // dst_dither_down
1300*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 6) & 1) << 7); // gradient fill mode sel
1301*4882a593Smuzhiyun 
1302*4882a593Smuzhiyun 	req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 8) & 1) << 8); // nn_quantize
1303*4882a593Smuzhiyun 	req->dither_mode = req_rga->dither_mode;
1304*4882a593Smuzhiyun 
1305*4882a593Smuzhiyun     if (((req_rga->alpha_rop_flag) & 1)) {
1306*4882a593Smuzhiyun         if ((req_rga->alpha_rop_flag >> 3) & 1) {
1307*4882a593Smuzhiyun             /* porter duff alpha enable */
1308*4882a593Smuzhiyun             switch (req_rga->PD_mode)
1309*4882a593Smuzhiyun             {
1310*4882a593Smuzhiyun                 case 0: //dst = 0
1311*4882a593Smuzhiyun                     break;
1312*4882a593Smuzhiyun                 case 1: //dst = src
1313*4882a593Smuzhiyun                     req->alpha_mode_0 = 0x0212;
1314*4882a593Smuzhiyun                     req->alpha_mode_1 = 0x0212;
1315*4882a593Smuzhiyun                     break;
1316*4882a593Smuzhiyun                 case 2: //dst = dst
1317*4882a593Smuzhiyun                     req->alpha_mode_0 = 0x1202;
1318*4882a593Smuzhiyun                     req->alpha_mode_1 = 0x1202;
1319*4882a593Smuzhiyun                     break;
1320*4882a593Smuzhiyun                 case 3: //dst = (256*sc + (256 - sa)*dc) >> 8
1321*4882a593Smuzhiyun                     if((req_rga->alpha_rop_mode & 3) == 0) {
1322*4882a593Smuzhiyun                         /* both use globalAlpha. */
1323*4882a593Smuzhiyun                         alpha_mode_0 = 0x3010;
1324*4882a593Smuzhiyun                         alpha_mode_1 = 0x3010;
1325*4882a593Smuzhiyun                     }
1326*4882a593Smuzhiyun                     else if ((req_rga->alpha_rop_mode & 3) == 1) {
1327*4882a593Smuzhiyun                         /* Do not use globalAlpha. */
1328*4882a593Smuzhiyun                         alpha_mode_0 = 0x3212;
1329*4882a593Smuzhiyun                         alpha_mode_1 = 0x3212;
1330*4882a593Smuzhiyun                     }
1331*4882a593Smuzhiyun                     else if ((req_rga->alpha_rop_mode & 3) == 2) {
1332*4882a593Smuzhiyun                         /* dst use globalAlpha, and dst has pixelAlpha. */
1333*4882a593Smuzhiyun                         alpha_mode_0 = 0x3014;
1334*4882a593Smuzhiyun                         alpha_mode_1 = 0x3014;
1335*4882a593Smuzhiyun                     }
1336*4882a593Smuzhiyun                     else {
1337*4882a593Smuzhiyun                         /* dst use globalAlpha, and dst does not have pixelAlpha. */
1338*4882a593Smuzhiyun                         alpha_mode_0 = 0x3012;
1339*4882a593Smuzhiyun                         alpha_mode_1 = 0x3012;
1340*4882a593Smuzhiyun                     }
1341*4882a593Smuzhiyun                     req->alpha_mode_0 = alpha_mode_0;
1342*4882a593Smuzhiyun                     req->alpha_mode_1 = alpha_mode_1;
1343*4882a593Smuzhiyun                     break;
1344*4882a593Smuzhiyun                 case 4: //dst = (sc*(256-da) + 256*dc) >> 8
1345*4882a593Smuzhiyun                     /* Do not use globalAlpha. */
1346*4882a593Smuzhiyun                     req->alpha_mode_0 = 0x1232;
1347*4882a593Smuzhiyun                     req->alpha_mode_1 = 0x1232;
1348*4882a593Smuzhiyun                     break;
1349*4882a593Smuzhiyun                 case 5: //dst = (da*sc) >> 8
1350*4882a593Smuzhiyun                     break;
1351*4882a593Smuzhiyun                 case 6: //dst = (sa*dc) >> 8
1352*4882a593Smuzhiyun                     break;
1353*4882a593Smuzhiyun                 case 7: //dst = ((256-da)*sc) >> 8
1354*4882a593Smuzhiyun                     break;
1355*4882a593Smuzhiyun                 case 8: //dst = ((256-sa)*dc) >> 8
1356*4882a593Smuzhiyun                     break;
1357*4882a593Smuzhiyun                 case 9: //dst = (da*sc + (256-sa)*dc) >> 8
1358*4882a593Smuzhiyun                     req->alpha_mode_0 = 0x3040;
1359*4882a593Smuzhiyun                     req->alpha_mode_1 = 0x3040;
1360*4882a593Smuzhiyun                     break;
1361*4882a593Smuzhiyun                 case 10://dst = ((256-da)*sc + (sa*dc)) >> 8
1362*4882a593Smuzhiyun                     break;
1363*4882a593Smuzhiyun                 case 11://dst = ((256-da)*sc + (256-sa)*dc) >> 8;
1364*4882a593Smuzhiyun                     break;
1365*4882a593Smuzhiyun 		case 12:
1366*4882a593Smuzhiyun 		    req->alpha_mode_0 = 0x0010;
1367*4882a593Smuzhiyun 		    req->alpha_mode_1 = 0x0820;
1368*4882a593Smuzhiyun 		    break;
1369*4882a593Smuzhiyun                 default:
1370*4882a593Smuzhiyun                     break;
1371*4882a593Smuzhiyun             }
1372*4882a593Smuzhiyun             /* Real color mode */
1373*4882a593Smuzhiyun             if ((req_rga->alpha_rop_flag >> 9) & 1) {
1374*4882a593Smuzhiyun                 if (req->alpha_mode_0 & (0x01 << 1))
1375*4882a593Smuzhiyun                     req->alpha_mode_0 |= (1 << 7);
1376*4882a593Smuzhiyun                 if (req->alpha_mode_0 & (0x01 << 9))
1377*4882a593Smuzhiyun                     req->alpha_mode_0 |= (1 << 15);
1378*4882a593Smuzhiyun             }
1379*4882a593Smuzhiyun         }
1380*4882a593Smuzhiyun         else {
1381*4882a593Smuzhiyun             if((req_rga->alpha_rop_mode & 3) == 0) {
1382*4882a593Smuzhiyun                 req->alpha_mode_0 = 0x3040;
1383*4882a593Smuzhiyun                 req->alpha_mode_1 = 0x3040;
1384*4882a593Smuzhiyun             }
1385*4882a593Smuzhiyun             else if ((req_rga->alpha_rop_mode & 3) == 1) {
1386*4882a593Smuzhiyun 		req->alpha_mode_0 = 0x3042;
1387*4882a593Smuzhiyun 		req->alpha_mode_1 = 0x3242;
1388*4882a593Smuzhiyun             }
1389*4882a593Smuzhiyun             else if ((req_rga->alpha_rop_mode & 3) == 2) {
1390*4882a593Smuzhiyun                 req->alpha_mode_0 = 0x3044;
1391*4882a593Smuzhiyun                 req->alpha_mode_1 = 0x3044;
1392*4882a593Smuzhiyun             }
1393*4882a593Smuzhiyun         }
1394*4882a593Smuzhiyun     }
1395*4882a593Smuzhiyun 
1396*4882a593Smuzhiyun     if (req_rga->mmu_info.mmu_en && (req_rga->mmu_info.mmu_flag & 1) == 1) {
1397*4882a593Smuzhiyun         req->mmu_info.src0_mmu_flag = 1;
1398*4882a593Smuzhiyun         req->mmu_info.dst_mmu_flag = 1;
1399*4882a593Smuzhiyun 
1400*4882a593Smuzhiyun         if (req_rga->mmu_info.mmu_flag >> 31) {
1401*4882a593Smuzhiyun             req->mmu_info.src0_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 8)  & 1);
1402*4882a593Smuzhiyun             req->mmu_info.src1_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 9)  & 1);
1403*4882a593Smuzhiyun             req->mmu_info.dst_mmu_flag  = ((req_rga->mmu_info.mmu_flag >> 10) & 1);
1404*4882a593Smuzhiyun             req->mmu_info.els_mmu_flag  = ((req_rga->mmu_info.mmu_flag >> 11) & 1);
1405*4882a593Smuzhiyun         }
1406*4882a593Smuzhiyun         else {
1407*4882a593Smuzhiyun             if (req_rga->src.yrgb_addr >= 0xa0000000) {
1408*4882a593Smuzhiyun                req->mmu_info.src0_mmu_flag = 0;
1409*4882a593Smuzhiyun                req->src.yrgb_addr = req_rga->src.yrgb_addr - 0x60000000;
1410*4882a593Smuzhiyun                req->src.uv_addr   = req_rga->src.uv_addr - 0x60000000;
1411*4882a593Smuzhiyun                req->src.v_addr    = req_rga->src.v_addr - 0x60000000;
1412*4882a593Smuzhiyun             }
1413*4882a593Smuzhiyun 
1414*4882a593Smuzhiyun             if (req_rga->dst.yrgb_addr >= 0xa0000000) {
1415*4882a593Smuzhiyun                req->mmu_info.dst_mmu_flag = 0;
1416*4882a593Smuzhiyun                req->dst.yrgb_addr = req_rga->dst.yrgb_addr - 0x60000000;
1417*4882a593Smuzhiyun             }
1418*4882a593Smuzhiyun 
1419*4882a593Smuzhiyun 	    if (req_rga->pat.yrgb_addr >= 0xa0000000) {
1420*4882a593Smuzhiyun                req->mmu_info.src1_mmu_flag = 0;
1421*4882a593Smuzhiyun                req->src1.yrgb_addr = req_rga->pat.yrgb_addr - 0x60000000;
1422*4882a593Smuzhiyun             }
1423*4882a593Smuzhiyun         }
1424*4882a593Smuzhiyun     }
1425*4882a593Smuzhiyun }
1426*4882a593Smuzhiyun 
memcpy_img_info(struct rga_img_info_t * dst,struct rga_img_info_32_t * src)1427*4882a593Smuzhiyun static void memcpy_img_info(struct rga_img_info_t *dst, struct rga_img_info_32_t *src)
1428*4882a593Smuzhiyun {
1429*4882a593Smuzhiyun     dst->yrgb_addr = src->yrgb_addr;      /* yrgb    mem addr         */
1430*4882a593Smuzhiyun     dst->uv_addr = src->uv_addr;        /* cb/cr   mem addr         */
1431*4882a593Smuzhiyun     dst->v_addr = src->v_addr;         /* cr      mem addr         */
1432*4882a593Smuzhiyun     dst->format = src->format;         //definition by RK_FORMAT
1433*4882a593Smuzhiyun 
1434*4882a593Smuzhiyun     dst->act_w = src->act_w;
1435*4882a593Smuzhiyun     dst->act_h = src->act_h;
1436*4882a593Smuzhiyun     dst->x_offset = src->x_offset;
1437*4882a593Smuzhiyun     dst->y_offset = src->y_offset;
1438*4882a593Smuzhiyun 
1439*4882a593Smuzhiyun     dst->vir_w = src->vir_w;
1440*4882a593Smuzhiyun     dst->vir_h = src->vir_h;
1441*4882a593Smuzhiyun     dst->endian_mode = src->endian_mode; //for BPP
1442*4882a593Smuzhiyun     dst->alpha_swap = src->alpha_swap;
1443*4882a593Smuzhiyun }
1444*4882a593Smuzhiyun 
RGA_MSG_2_RGA2_MSG_32(struct rga_req_32 * req_rga,struct rga2_req * req)1445*4882a593Smuzhiyun void RGA_MSG_2_RGA2_MSG_32(struct rga_req_32 *req_rga, struct rga2_req *req)
1446*4882a593Smuzhiyun {
1447*4882a593Smuzhiyun 	u16 alpha_mode_0, alpha_mode_1;
1448*4882a593Smuzhiyun #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0))
1449*4882a593Smuzhiyun 	if (req_rga->render_mode & RGA_BUF_GEM_TYPE_MASK)
1450*4882a593Smuzhiyun 		req->buf_type = RGA_BUF_GEM_TYPE_MASK & RGA_BUF_GEM_TYPE_DMA;
1451*4882a593Smuzhiyun 
1452*4882a593Smuzhiyun 	req_rga->render_mode &= (~RGA_BUF_GEM_TYPE_MASK);
1453*4882a593Smuzhiyun #endif
1454*4882a593Smuzhiyun     if (req_rga->render_mode == 6)
1455*4882a593Smuzhiyun         req->render_mode = update_palette_table_mode;
1456*4882a593Smuzhiyun     else if (req_rga->render_mode == 7)
1457*4882a593Smuzhiyun         req->render_mode = update_patten_buff_mode;
1458*4882a593Smuzhiyun     else if (req_rga->render_mode == 5)
1459*4882a593Smuzhiyun         req->render_mode = bitblt_mode;
1460*4882a593Smuzhiyun     else
1461*4882a593Smuzhiyun         req->render_mode = req_rga->render_mode;
1462*4882a593Smuzhiyun     memcpy_img_info(&req->src, &req_rga->src);
1463*4882a593Smuzhiyun     memcpy_img_info(&req->dst, &req_rga->dst);
1464*4882a593Smuzhiyun     /* The application will only import pat or src1. */
1465*4882a593Smuzhiyun     if (req->render_mode == update_palette_table_mode) {
1466*4882a593Smuzhiyun         memcpy_img_info(&req->pat, &req_rga->pat);
1467*4882a593Smuzhiyun     } else {
1468*4882a593Smuzhiyun         memcpy_img_info(&req->src1,&req_rga->pat);
1469*4882a593Smuzhiyun     }
1470*4882a593Smuzhiyun     format_name_convert(&req->src.format, req_rga->src.format);
1471*4882a593Smuzhiyun     format_name_convert(&req->dst.format, req_rga->dst.format);
1472*4882a593Smuzhiyun     format_name_convert(&req->src1.format, req_rga->pat.format);
1473*4882a593Smuzhiyun 
1474*4882a593Smuzhiyun     switch (req_rga->rotate_mode & 0x0F) {
1475*4882a593Smuzhiyun     case 1:
1476*4882a593Smuzhiyun         if(req_rga->sina == 0 && req_rga->cosa == 65536) {
1477*4882a593Smuzhiyun             /* rotate 0 */
1478*4882a593Smuzhiyun             req->rotate_mode = 0;
1479*4882a593Smuzhiyun         } else if (req_rga->sina == 65536 && req_rga->cosa == 0) {
1480*4882a593Smuzhiyun             /* rotate 90 */
1481*4882a593Smuzhiyun             req->rotate_mode = 1;
1482*4882a593Smuzhiyun             req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_h + 1;
1483*4882a593Smuzhiyun             req->dst.act_w = req_rga->dst.act_h;
1484*4882a593Smuzhiyun             req->dst.act_h = req_rga->dst.act_w;
1485*4882a593Smuzhiyun         } else if (req_rga->sina == 0 && req_rga->cosa == -65536) {
1486*4882a593Smuzhiyun             /* rotate 180 */
1487*4882a593Smuzhiyun             req->rotate_mode = 2;
1488*4882a593Smuzhiyun             req->dst.x_offset = req_rga->dst.x_offset - req_rga->dst.act_w + 1;
1489*4882a593Smuzhiyun             req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_h + 1;
1490*4882a593Smuzhiyun         } else if (req_rga->sina == -65536 && req_rga->cosa == 0) {
1491*4882a593Smuzhiyun             /* totate 270 */
1492*4882a593Smuzhiyun             req->rotate_mode = 3;
1493*4882a593Smuzhiyun             req->dst.y_offset = req_rga->dst.y_offset - req_rga->dst.act_w + 1;
1494*4882a593Smuzhiyun             req->dst.act_w = req_rga->dst.act_h;
1495*4882a593Smuzhiyun             req->dst.act_h = req_rga->dst.act_w;
1496*4882a593Smuzhiyun         }
1497*4882a593Smuzhiyun         break;
1498*4882a593Smuzhiyun     case 2:
1499*4882a593Smuzhiyun         //x_mirror
1500*4882a593Smuzhiyun         req->rotate_mode |= (1 << 4);
1501*4882a593Smuzhiyun         break;
1502*4882a593Smuzhiyun     case 3:
1503*4882a593Smuzhiyun         //y_mirror
1504*4882a593Smuzhiyun         req->rotate_mode |= (2 << 4);
1505*4882a593Smuzhiyun         break;
1506*4882a593Smuzhiyun     case 4:
1507*4882a593Smuzhiyun         //x_mirror+y_mirror
1508*4882a593Smuzhiyun         req->rotate_mode |= (3 << 4);
1509*4882a593Smuzhiyun         break;
1510*4882a593Smuzhiyun     default:
1511*4882a593Smuzhiyun         req->rotate_mode = 0;
1512*4882a593Smuzhiyun         break;
1513*4882a593Smuzhiyun     }
1514*4882a593Smuzhiyun 
1515*4882a593Smuzhiyun     switch ((req_rga->rotate_mode & 0xF0) >> 4) {
1516*4882a593Smuzhiyun     case 2:
1517*4882a593Smuzhiyun         //x_mirror
1518*4882a593Smuzhiyun         req->rotate_mode |= (1 << 4);
1519*4882a593Smuzhiyun         break;
1520*4882a593Smuzhiyun     case 3:
1521*4882a593Smuzhiyun         //y_mirror
1522*4882a593Smuzhiyun         req->rotate_mode |= (2 << 4);
1523*4882a593Smuzhiyun         break;
1524*4882a593Smuzhiyun     case 4:
1525*4882a593Smuzhiyun         //x_mirror+y_mirror
1526*4882a593Smuzhiyun         req->rotate_mode |= (3 << 4);
1527*4882a593Smuzhiyun         break;
1528*4882a593Smuzhiyun     }
1529*4882a593Smuzhiyun 
1530*4882a593Smuzhiyun     if((req->dst.act_w > 2048) && (req->src.act_h < req->dst.act_h))
1531*4882a593Smuzhiyun         req->scale_bicu_mode |= (1<<4);
1532*4882a593Smuzhiyun     req->LUT_addr = req_rga->LUT_addr;
1533*4882a593Smuzhiyun     req->rop_mask_addr = req_rga->rop_mask_addr;
1534*4882a593Smuzhiyun     req->bitblt_mode = req_rga->bsfilter_flag;
1535*4882a593Smuzhiyun     req->src_a_global_val = req_rga->alpha_global_value;
1536*4882a593Smuzhiyun     req->dst_a_global_val = req_rga->alpha_global_value;
1537*4882a593Smuzhiyun     req->rop_code = req_rga->rop_code;
1538*4882a593Smuzhiyun     req->rop_mode = req_rga->alpha_rop_mode;
1539*4882a593Smuzhiyun     req->color_fill_mode = req_rga->color_fill_mode;
1540*4882a593Smuzhiyun     req->alpha_zero_key = req_rga->alpha_rop_mode >> 4;
1541*4882a593Smuzhiyun     req->src_trans_mode = req_rga->src_trans_mode;
1542*4882a593Smuzhiyun     req->color_key_min   = req_rga->color_key_min;
1543*4882a593Smuzhiyun     req->color_key_max   = req_rga->color_key_max;
1544*4882a593Smuzhiyun     req->fg_color = req_rga->fg_color;
1545*4882a593Smuzhiyun     req->bg_color = req_rga->bg_color;
1546*4882a593Smuzhiyun     memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));
1547*4882a593Smuzhiyun     memcpy(&req->full_csc, &req_rga->full_csc, sizeof(req_rga->full_csc));
1548*4882a593Smuzhiyun 
1549*4882a593Smuzhiyun     req->palette_mode = req_rga->palette_mode;
1550*4882a593Smuzhiyun     req->yuv2rgb_mode = req_rga->yuv2rgb_mode;
1551*4882a593Smuzhiyun     req->endian_mode = req_rga->endian_mode;
1552*4882a593Smuzhiyun     req->rgb2yuv_mode = 0;
1553*4882a593Smuzhiyun     req->fading_alpha_value = 0;
1554*4882a593Smuzhiyun     req->fading_r_value = req_rga->fading.r;
1555*4882a593Smuzhiyun     req->fading_g_value = req_rga->fading.g;
1556*4882a593Smuzhiyun     req->fading_b_value = req_rga->fading.b;
1557*4882a593Smuzhiyun 
1558*4882a593Smuzhiyun     /* alpha mode set */
1559*4882a593Smuzhiyun     req->alpha_rop_flag = 0;
1560*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag & 1)));           // alpha_rop_enable
1561*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 1) & 1) << 1); // rop_enable
1562*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 2) & 1) << 2); // fading_enable
1563*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 4) & 1) << 3); // alpha_cal_mode_sel
1564*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 5) & 1) << 6); // dst_dither_down
1565*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 6) & 1) << 7); // gradient fill mode sel
1566*4882a593Smuzhiyun 
1567*4882a593Smuzhiyun     req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 8) & 1) << 8); // nn_quantize
1568*4882a593Smuzhiyun     req->dither_mode = req_rga->dither_mode;
1569*4882a593Smuzhiyun 
1570*4882a593Smuzhiyun     if (((req_rga->alpha_rop_flag) & 1)) {
1571*4882a593Smuzhiyun         if ((req_rga->alpha_rop_flag >> 3) & 1) {
1572*4882a593Smuzhiyun             /* porter duff alpha enable */
1573*4882a593Smuzhiyun             switch (req_rga->PD_mode)
1574*4882a593Smuzhiyun             {
1575*4882a593Smuzhiyun                 case 0: //dst = 0
1576*4882a593Smuzhiyun                     break;
1577*4882a593Smuzhiyun                 case 1: //dst = src
1578*4882a593Smuzhiyun                     req->alpha_mode_0 = 0x0212;
1579*4882a593Smuzhiyun                     req->alpha_mode_1 = 0x0212;
1580*4882a593Smuzhiyun                     break;
1581*4882a593Smuzhiyun                 case 2: //dst = dst
1582*4882a593Smuzhiyun                     req->alpha_mode_0 = 0x1202;
1583*4882a593Smuzhiyun                     req->alpha_mode_1 = 0x1202;
1584*4882a593Smuzhiyun                     break;
1585*4882a593Smuzhiyun                 case 3: //dst = (256*sc + (256 - sa)*dc) >> 8
1586*4882a593Smuzhiyun                     if((req_rga->alpha_rop_mode & 3) == 0) {
1587*4882a593Smuzhiyun                         /* both use globalAlpha. */
1588*4882a593Smuzhiyun                         alpha_mode_0 = 0x3010;
1589*4882a593Smuzhiyun                         alpha_mode_1 = 0x3010;
1590*4882a593Smuzhiyun                     }
1591*4882a593Smuzhiyun                     else if ((req_rga->alpha_rop_mode & 3) == 1) {
1592*4882a593Smuzhiyun                         /* dst use globalAlpha, and dst does not have pixelAlpha. */
1593*4882a593Smuzhiyun                         alpha_mode_0 = 0x3012;
1594*4882a593Smuzhiyun                         alpha_mode_1 = 0x3012;
1595*4882a593Smuzhiyun                     }
1596*4882a593Smuzhiyun                     else if ((req_rga->alpha_rop_mode & 3) == 2) {
1597*4882a593Smuzhiyun                         /* dst use globalAlpha, and dst has pixelAlpha. */
1598*4882a593Smuzhiyun                         alpha_mode_0 = 0x3014;
1599*4882a593Smuzhiyun                         alpha_mode_1 = 0x3014;
1600*4882a593Smuzhiyun                     }
1601*4882a593Smuzhiyun                     else {
1602*4882a593Smuzhiyun                         /* Do not use globalAlpha. */
1603*4882a593Smuzhiyun                         alpha_mode_0 = 0x3212;
1604*4882a593Smuzhiyun                         alpha_mode_1 = 0x3212;
1605*4882a593Smuzhiyun                     }
1606*4882a593Smuzhiyun                     req->alpha_mode_0 = alpha_mode_0;
1607*4882a593Smuzhiyun                     req->alpha_mode_1 = alpha_mode_1;
1608*4882a593Smuzhiyun                     break;
1609*4882a593Smuzhiyun                 case 4: //dst = (sc*(256-da) + 256*dc) >> 8
1610*4882a593Smuzhiyun                     /* Do not use globalAlpha. */
1611*4882a593Smuzhiyun                     req->alpha_mode_0 = 0x1232;
1612*4882a593Smuzhiyun                     req->alpha_mode_1 = 0x1232;
1613*4882a593Smuzhiyun                     break;
1614*4882a593Smuzhiyun                 case 5: //dst = (da*sc) >> 8
1615*4882a593Smuzhiyun                     break;
1616*4882a593Smuzhiyun                 case 6: //dst = (sa*dc) >> 8
1617*4882a593Smuzhiyun                     break;
1618*4882a593Smuzhiyun                 case 7: //dst = ((256-da)*sc) >> 8
1619*4882a593Smuzhiyun                     break;
1620*4882a593Smuzhiyun                 case 8: //dst = ((256-sa)*dc) >> 8
1621*4882a593Smuzhiyun                     break;
1622*4882a593Smuzhiyun                 case 9: //dst = (da*sc + (256-sa)*dc) >> 8
1623*4882a593Smuzhiyun                     req->alpha_mode_0 = 0x3040;
1624*4882a593Smuzhiyun                     req->alpha_mode_1 = 0x3040;
1625*4882a593Smuzhiyun                     break;
1626*4882a593Smuzhiyun                 case 10://dst = ((256-da)*sc + (sa*dc)) >> 8
1627*4882a593Smuzhiyun                     break;
1628*4882a593Smuzhiyun                 case 11://dst = ((256-da)*sc + (256-sa)*dc) >> 8;
1629*4882a593Smuzhiyun                     break;
1630*4882a593Smuzhiyun 		case 12:
1631*4882a593Smuzhiyun 		    req->alpha_mode_0 = 0x0010;
1632*4882a593Smuzhiyun 		    req->alpha_mode_1 = 0x0820;
1633*4882a593Smuzhiyun 		    break;
1634*4882a593Smuzhiyun                 default:
1635*4882a593Smuzhiyun                     break;
1636*4882a593Smuzhiyun             }
1637*4882a593Smuzhiyun             /* Real color mode */
1638*4882a593Smuzhiyun             if ((req_rga->alpha_rop_flag >> 9) & 1) {
1639*4882a593Smuzhiyun                 if (req->alpha_mode_0 & (0x01 << 1))
1640*4882a593Smuzhiyun                     req->alpha_mode_0 |= (1 << 7);
1641*4882a593Smuzhiyun                 if (req->alpha_mode_0 & (0x01 << 9))
1642*4882a593Smuzhiyun                     req->alpha_mode_0 |= (1 << 15);
1643*4882a593Smuzhiyun             }
1644*4882a593Smuzhiyun         }
1645*4882a593Smuzhiyun         else {
1646*4882a593Smuzhiyun             if((req_rga->alpha_rop_mode & 3) == 0) {
1647*4882a593Smuzhiyun                 req->alpha_mode_0 = 0x3040;
1648*4882a593Smuzhiyun                 req->alpha_mode_1 = 0x3040;
1649*4882a593Smuzhiyun             }
1650*4882a593Smuzhiyun             else if ((req_rga->alpha_rop_mode & 3) == 1) {
1651*4882a593Smuzhiyun 		req->alpha_mode_0 = 0x3042;
1652*4882a593Smuzhiyun 		req->alpha_mode_1 = 0x3242;
1653*4882a593Smuzhiyun             }
1654*4882a593Smuzhiyun             else if ((req_rga->alpha_rop_mode & 3) == 2) {
1655*4882a593Smuzhiyun                 req->alpha_mode_0 = 0x3044;
1656*4882a593Smuzhiyun                 req->alpha_mode_1 = 0x3044;
1657*4882a593Smuzhiyun             }
1658*4882a593Smuzhiyun         }
1659*4882a593Smuzhiyun     }
1660*4882a593Smuzhiyun 
1661*4882a593Smuzhiyun     if (req_rga->mmu_info.mmu_en && (req_rga->mmu_info.mmu_flag & 1) == 1) {
1662*4882a593Smuzhiyun         req->mmu_info.src0_mmu_flag = 1;
1663*4882a593Smuzhiyun         req->mmu_info.dst_mmu_flag = 1;
1664*4882a593Smuzhiyun         if (req_rga->mmu_info.mmu_flag >> 31) {
1665*4882a593Smuzhiyun             req->mmu_info.src0_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 8)  & 1);
1666*4882a593Smuzhiyun             req->mmu_info.src1_mmu_flag = ((req_rga->mmu_info.mmu_flag >> 9)  & 1);
1667*4882a593Smuzhiyun             req->mmu_info.dst_mmu_flag  = ((req_rga->mmu_info.mmu_flag >> 10) & 1);
1668*4882a593Smuzhiyun             req->mmu_info.els_mmu_flag  = ((req_rga->mmu_info.mmu_flag >> 11) & 1);
1669*4882a593Smuzhiyun         }
1670*4882a593Smuzhiyun         else {
1671*4882a593Smuzhiyun             if (req_rga->src.yrgb_addr >= 0xa0000000) {
1672*4882a593Smuzhiyun                req->mmu_info.src0_mmu_flag = 0;
1673*4882a593Smuzhiyun                req->src.yrgb_addr = req_rga->src.yrgb_addr - 0x60000000;
1674*4882a593Smuzhiyun                req->src.uv_addr   = req_rga->src.uv_addr - 0x60000000;
1675*4882a593Smuzhiyun                req->src.v_addr    = req_rga->src.v_addr - 0x60000000;
1676*4882a593Smuzhiyun             }
1677*4882a593Smuzhiyun 
1678*4882a593Smuzhiyun             if (req_rga->dst.yrgb_addr >= 0xa0000000) {
1679*4882a593Smuzhiyun                req->mmu_info.dst_mmu_flag = 0;
1680*4882a593Smuzhiyun                req->dst.yrgb_addr = req_rga->dst.yrgb_addr - 0x60000000;
1681*4882a593Smuzhiyun             }
1682*4882a593Smuzhiyun 
1683*4882a593Smuzhiyun 	    if (req_rga->pat.yrgb_addr >= 0xa0000000) {
1684*4882a593Smuzhiyun                req->mmu_info.src1_mmu_flag = 0;
1685*4882a593Smuzhiyun                req->src1.yrgb_addr = req_rga->pat.yrgb_addr - 0x60000000;
1686*4882a593Smuzhiyun             }
1687*4882a593Smuzhiyun         }
1688*4882a593Smuzhiyun     }
1689*4882a593Smuzhiyun }
1690