xref: /OK3568_Linux_fs/kernel/drivers/video/rockchip/rga3/rga2_reg_info.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) Rockchip Electronics Co., Ltd.
4  *
5  * Author: Huang Lee <Putin.li@rock-chips.com>
6  */
7 
8 #define pr_fmt(fmt) "rga2_reg: " fmt
9 
10 #include "rga2_reg_info.h"
11 #include "rga_dma_buf.h"
12 #include "rga_iommu.h"
13 #include "rga_common.h"
14 #include "rga_hw_config.h"
15 #include "rga_debugger.h"
16 
17 unsigned int rga2_rop_code[256] = {
18 	0x00000007, 0x00000451, 0x00006051, 0x00800051,
19 	0x00007041, 0x00800041, 0x00804830, 0x000004f0,//0
20 	0x00800765, 0x000004b0, 0x00000065, 0x000004f4,
21 	0x00000075, 0x000004e6, 0x00804850, 0x00800005,
22 
23 	0x00006850, 0x00800050, 0x00805028, 0x00000568,
24 	0x00804031, 0x00000471, 0x002b6071, 0x018037aa,//1
25 	0x008007aa, 0x00036071, 0x00002c6a, 0x00803631,
26 	0x00002d68, 0x00802721, 0x008002d0, 0x000006d0,
27 
28 	0x0080066e, 0x00000528, 0x00000066, 0x0000056c,
29 	0x018007aa, 0x0002e06a, 0x00003471, 0x00834031,//2
30 	0x00800631, 0x0002b471, 0x00006071, 0x008037aa,
31 	0x000036d0, 0x008002d4, 0x00002d28, 0x000006d4,
32 
33 	0x0000006e, 0x00000565, 0x00003451, 0x00800006,
34 	0x000034f0, 0x00834830, 0x00800348, 0x00000748,//3
35 	0x00002f48, 0x0080034c, 0x000034b0, 0x0000074c,
36 	0x00000031, 0x00834850, 0x000034e6, 0x00800071,
37 
38 	0x008006f4, 0x00000431, 0x018007a1, 0x00b6e870,
39 	0x00000074, 0x0000046e, 0x00002561, 0x00802f28,//4
40 	0x00800728, 0x0002a561, 0x000026c2, 0x008002c6,
41 	0x00007068, 0x018035aa, 0x00002c2a, 0x000006c6,
42 
43 	0x0000006c, 0x00000475, 0x000024e2, 0x008036b0,
44 	0x00804051, 0x00800004, 0x00800251, 0x00000651,
45 	0x00002e4a, 0x0080024e, 0x00000028, 0x00824842,
46 	0x000024a2, 0x0000064e, 0x000024f4, 0x00800068,//5
47 
48 	0x008006b0, 0x000234f0, 0x00002741, 0x00800345,
49 	0x00003651, 0x00800255, 0x00000030, 0x00834051,
50 	0x00a34842, 0x000002b0, 0x00800271, 0x0002b651,
51 	0x00800368, 0x0002a741, 0x0000364e, 0x00806830,//6
52 
53 	0x00006870, 0x008037a2, 0x00003431, 0x00000745,
54 	0x00002521, 0x00000655, 0x0000346e, 0x00800062,
55 	0x008002f0, 0x000236d0, 0x000026d4, 0x00807028,
56 	0x000036c6, 0x00806031, 0x008005aa, 0x00000671,//7
57 
58 	0x00800671, 0x000005aa, 0x00006031, 0x008036c6,
59 	0x00007028, 0x00802e55, 0x008236d0, 0x000002f0,
60 	0x00000070, 0x0080346e, 0x00800655, 0x00802521,
61 	0x00800745, 0x00803431, 0x000037a2, 0x00806870,//8
62 
63 	0x00006830, 0x0080364e, 0x00822f48, 0x00000361,
64 	0x0082b651, 0x00000271, 0x00800231, 0x002b4051,
65 	0x00034051, 0x00800030, 0x0080026e, 0x00803651,
66 	0x0080036c, 0x00802741, 0x008234f0, 0x000006b0,//9
67 
68 	0x00000068, 0x00802c75, 0x0080064e, 0x008024a2,
69 	0x0002c04a, 0x00800021, 0x00800275, 0x00802e51,
70 	0x00800651, 0x00000251, 0x00800000, 0x00004051,
71 	0x000036b0, 0x008024e2, 0x00800475, 0x00000045,//a
72 
73 	0x008006c6, 0x00802c2a, 0x000035aa, 0x00807068,
74 	0x008002f4, 0x008026c2, 0x00822d68, 0x00000728,
75 	0x00002f28, 0x00802561, 0x0080046e, 0x00000046,
76 	0x00836870, 0x000007a2, 0x00800431, 0x00004071,//b
77 
78 	0x00000071, 0x008034e6, 0x00034850, 0x00800031,
79 	0x0080074c, 0x008034b0, 0x00800365, 0x00802f48,
80 	0x00800748, 0x00000341, 0x000026a2, 0x008034f0,
81 	0x00800002, 0x00005048, 0x00800565, 0x00000055,//c
82 
83 	0x008006d4, 0x00802d28, 0x008002e6, 0x008036d0,
84 	0x000037aa, 0x00806071, 0x0082b471, 0x00000631,
85 	0x00002e2a, 0x00803471, 0x00826862, 0x010007aa,
86 	0x0080056c, 0x00000054, 0x00800528, 0x00005068,//d
87 
88 	0x008006d0, 0x000002d0, 0x00002721, 0x00802d68,
89 	0x00003631, 0x00802c6a, 0x00836071, 0x000007aa,
90 	0x010037aa, 0x00a36870, 0x00800471, 0x00004031,
91 	0x00800568, 0x00005028, 0x00000050, 0x00800545,//e
92 
93 	0x00800001, 0x00004850, 0x008004e6, 0x0000004e,
94 	0x008004f4, 0x0000004c, 0x008004b0, 0x00004870,
95 	0x008004f0, 0x00004830, 0x00000048, 0x0080044e,
96 	0x00000051, 0x008004d4, 0x00800451, 0x00800007,//f
97 };
98 
RGA2_reg_get_param(unsigned char * base,struct rga2_req * msg)99 static void RGA2_reg_get_param(unsigned char *base, struct rga2_req *msg)
100 {
101 	u32 *bRGA_SRC_X_FACTOR;
102 	u32 *bRGA_SRC_Y_FACTOR;
103 	u32 sw, sh;
104 	u32 dw, dh;
105 	u32 param_x, param_y;
106 
107 	bRGA_SRC_X_FACTOR = (u32 *) (base + RGA2_SRC_X_FACTOR_OFFSET);
108 	bRGA_SRC_Y_FACTOR = (u32 *) (base + RGA2_SRC_Y_FACTOR_OFFSET);
109 
110 	if (((msg->rotate_mode & 0x3) == 1) ||
111 		((msg->rotate_mode & 0x3) == 3)) {
112 		dw = msg->dst.act_h;
113 		dh = msg->dst.act_w;
114 	} else {
115 		dw = msg->dst.act_w;
116 		dh = msg->dst.act_h;
117 	}
118 
119 	sw = msg->src.act_w;
120 	sh = msg->src.act_h;
121 
122 	if (sw > dw) {
123 #if SCALE_DOWN_LARGE
124 		param_x = ((dw) << 16) / (sw) + 1;
125 #else
126 		param_x = ((dw) << 16) / (sw);
127 #endif
128 		*bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 0);
129 	} else if (sw < dw) {
130 #if SCALE_UP_LARGE
131 		param_x = ((sw - 1) << 16) / (dw - 1);
132 #else
133 		param_x = ((sw) << 16) / (dw);
134 #endif
135 		*bRGA_SRC_X_FACTOR |= ((param_x & 0xffff) << 16);
136 	} else {
137 		*bRGA_SRC_X_FACTOR = 0;	//((1 << 14) << 16) | (1 << 14);
138 	}
139 
140 	if (sh > dh) {
141 #if SCALE_DOWN_LARGE
142 		param_y = ((dh) << 16) / (sh) + 1;
143 #else
144 		param_y = ((dh) << 16) / (sh);
145 #endif
146 		*bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 0);
147 	} else if (sh < dh) {
148 #if SCALE_UP_LARGE
149 		param_y = ((sh - 1) << 16) / (dh - 1);
150 #else
151 		param_y = ((sh) << 16) / (dh);
152 #endif
153 		*bRGA_SRC_Y_FACTOR |= ((param_y & 0xffff) << 16);
154 	} else {
155 		*bRGA_SRC_Y_FACTOR = 0;	//((1 << 14) << 16) | (1 << 14);
156 	}
157 }
158 
RGA2_set_mode_ctrl(u8 * base,struct rga2_req * msg)159 static void RGA2_set_mode_ctrl(u8 *base, struct rga2_req *msg)
160 {
161 	u32 *bRGA_MODE_CTL;
162 	u32 reg = 0;
163 	u32 render_mode = msg->render_mode;
164 
165 	bRGA_MODE_CTL = (u32 *) (base + RGA2_MODE_CTRL_OFFSET);
166 
167 	if (msg->render_mode == UPDATE_PALETTE_TABLE_MODE)
168 		render_mode = 0x3;
169 
170 	reg =
171 		((reg & (~m_RGA2_MODE_CTRL_SW_RENDER_MODE)) |
172 		 (s_RGA2_MODE_CTRL_SW_RENDER_MODE(render_mode)));
173 	reg =
174 		((reg & (~m_RGA2_MODE_CTRL_SW_BITBLT_MODE)) |
175 		 (s_RGA2_MODE_CTRL_SW_BITBLT_MODE(msg->bitblt_mode)));
176 	reg =
177 		((reg & (~m_RGA2_MODE_CTRL_SW_CF_ROP4_PAT)) |
178 		 (s_RGA2_MODE_CTRL_SW_CF_ROP4_PAT(msg->color_fill_mode)));
179 	reg =
180 		((reg & (~m_RGA2_MODE_CTRL_SW_ALPHA_ZERO_KET)) |
181 		 (s_RGA2_MODE_CTRL_SW_ALPHA_ZERO_KET(msg->alpha_zero_key)));
182 	reg =
183 		((reg & (~m_RGA2_MODE_CTRL_SW_GRADIENT_SAT)) |
184 		 (s_RGA2_MODE_CTRL_SW_GRADIENT_SAT(msg->alpha_rop_flag >> 7)));
185 	reg =
186 		((reg & (~m_RGA2_MODE_CTRL_SW_INTR_CF_E)) |
187 		 (s_RGA2_MODE_CTRL_SW_INTR_CF_E(msg->CMD_fin_int_enable)));
188 
189 	reg = ((reg & (~m_RGA2_MODE_CTRL_SW_MOSAIC_EN)) |
190 	       (s_RGA2_MODE_CTRL_SW_MOSAIC_EN(msg->mosaic_info.enable)));
191 
192 	reg = ((reg & (~m_RGA2_MODE_CTRL_SW_YIN_YOUT_EN)) |
193 	       (s_RGA2_MODE_CTRL_SW_YIN_YOUT_EN(msg->yin_yout_en)));
194 
195 	reg = ((reg & (~m_RGA2_MODE_CTRL_SW_OSD_E)) |
196 	       (s_RGA2_MODE_CTRL_SW_OSD_E(msg->osd_info.enable)));
197 
198 	*bRGA_MODE_CTL = reg;
199 }
200 
RGA2_set_reg_src_info(u8 * base,struct rga2_req * msg)201 static void RGA2_set_reg_src_info(u8 *base, struct rga2_req *msg)
202 {
203 	u32 *bRGA_SRC_INFO;
204 	u32 *bRGA_SRC_BASE0, *bRGA_SRC_BASE1, *bRGA_SRC_BASE2;
205 	u32 *bRGA_SRC_VIR_INFO;
206 	u32 *bRGA_SRC_ACT_INFO;
207 	u32 *bRGA_MASK_ADDR;
208 	u32 *bRGA_SRC_TR_COLOR0, *bRGA_SRC_TR_COLOR1;
209 
210 	u8 disable_uv_channel_en = 0;
211 
212 	u32 reg = 0;
213 	u8 src0_format = 0;
214 
215 	u8 src0_rb_swp = 0;
216 	u8 src0_alpha_swp = 0;
217 
218 	u8 src0_cbcr_swp = 0;
219 	u8 pixel_width = 1;
220 	u32 stride = 0;
221 	u32 uv_stride = 0;
222 	u32 mask_stride = 0;
223 	u32 ydiv = 1, xdiv = 2;
224 	u8 yuv10 = 0;
225 
226 	u32 sw, sh;
227 	u32 dw, dh;
228 	u8 rotate_mode;
229 	u8 vsp_scale_mode = 0;
230 	u8 scale_w_flag, scale_h_flag;
231 
232 	bRGA_SRC_INFO = (u32 *) (base + RGA2_SRC_INFO_OFFSET);
233 
234 	bRGA_SRC_BASE0 = (u32 *) (base + RGA2_SRC_BASE0_OFFSET);
235 	bRGA_SRC_BASE1 = (u32 *) (base + RGA2_SRC_BASE1_OFFSET);
236 	bRGA_SRC_BASE2 = (u32 *) (base + RGA2_SRC_BASE2_OFFSET);
237 
238 	bRGA_SRC_VIR_INFO = (u32 *) (base + RGA2_SRC_VIR_INFO_OFFSET);
239 	bRGA_SRC_ACT_INFO = (u32 *) (base + RGA2_SRC_ACT_INFO_OFFSET);
240 
241 	bRGA_MASK_ADDR = (u32 *) (base + RGA2_MASK_BASE_OFFSET);
242 
243 	bRGA_SRC_TR_COLOR0 = (u32 *) (base + RGA2_SRC_TR_COLOR0_OFFSET);
244 	bRGA_SRC_TR_COLOR1 = (u32 *) (base + RGA2_SRC_TR_COLOR1_OFFSET);
245 
246 	if (msg->src.format == RGA_FORMAT_YCbCr_420_SP_10B ||
247 		msg->src.format == RGA_FORMAT_YCrCb_420_SP_10B) {
248 		if ((msg->src.act_w == msg->dst.act_w) &&
249 			(msg->src.act_h == msg->dst.act_h) &&
250 			(msg->rotate_mode == 0))
251 			msg->rotate_mode = 1 << 6;
252 	}
253 
254 	{
255 		rotate_mode = msg->rotate_mode & 0x3;
256 
257 		sw = msg->src.act_w;
258 		sh = msg->src.act_h;
259 
260 		if ((rotate_mode == 1) | (rotate_mode == 3)) {
261 			dw = msg->dst.act_h;
262 			dh = msg->dst.act_w;
263 		} else {
264 			dw = msg->dst.act_w;
265 			dh = msg->dst.act_h;
266 		}
267 
268 		if (sw > dw)
269 			scale_w_flag = 1;
270 		else if (sw < dw)
271 			scale_w_flag = 2;
272 		else {
273 			scale_w_flag = 0;
274 			if (msg->rotate_mode >> 6)
275 				scale_w_flag = 3;
276 		}
277 
278 		if (sh > dh)
279 			scale_h_flag = 1;
280 		else if (sh < dh)
281 			scale_h_flag = 2;
282 		else {
283 			scale_h_flag = 0;
284 			if (msg->rotate_mode >> 6)
285 				scale_h_flag = 3;
286 		}
287 
288 		/* uvvds need to force tile mode. */
289 		if (msg->uvvds_mode && scale_w_flag == 0)
290 			scale_w_flag = 3;
291 	}
292 
293 	/* VSP scale mode select, HSD > VSD > VSP > HSP */
294 	if (scale_h_flag == 0x2) {
295 		/* After HSD, VSP needs to check dst_width */
296 		if ((scale_w_flag == 0x1) && (dw < RGA2_VSP_BICUBIC_LIMIT))
297 			vsp_scale_mode = 0x0;
298 		else if (sw < RGA2_VSP_BICUBIC_LIMIT)
299 			vsp_scale_mode = 0x0;
300 		else
301 			/* default select bilinear */
302 			vsp_scale_mode = 0x1;
303 	}
304 
305 	switch (msg->src.format) {
306 	case RGA_FORMAT_RGBA_8888:
307 		src0_format = 0x0;
308 		pixel_width = 4;
309 		break;
310 	case RGA_FORMAT_BGRA_8888:
311 		src0_format = 0x0;
312 		src0_rb_swp = 0x1;
313 		pixel_width = 4;
314 		break;
315 	case RGA_FORMAT_RGBX_8888:
316 		src0_format = 0x1;
317 		pixel_width = 4;
318 		msg->src_trans_mode &= 0x07;
319 		break;
320 	case RGA_FORMAT_BGRX_8888:
321 		src0_format = 0x1;
322 		src0_rb_swp = 0x1;
323 		pixel_width = 4;
324 		msg->src_trans_mode &= 0x07;
325 		break;
326 	case RGA_FORMAT_RGB_888:
327 		src0_format = 0x2;
328 		pixel_width = 3;
329 		msg->src_trans_mode &= 0x07;
330 		break;
331 	case RGA_FORMAT_BGR_888:
332 		src0_format = 0x2;
333 		src0_rb_swp = 1;
334 		pixel_width = 3;
335 		msg->src_trans_mode &= 0x07;
336 		break;
337 	case RGA_FORMAT_RGB_565:
338 		src0_format = 0x4;
339 		pixel_width = 2;
340 		msg->src_trans_mode &= 0x07;
341 		break;
342 	case RGA_FORMAT_RGBA_5551:
343 		src0_format = 0x5;
344 		pixel_width = 2;
345 		break;
346 	case RGA_FORMAT_RGBA_4444:
347 		src0_format = 0x6;
348 		pixel_width = 2;
349 		break;
350 	case RGA_FORMAT_BGR_565:
351 		src0_format = 0x4;
352 		pixel_width = 2;
353 		msg->src_trans_mode &= 0x07;
354 		src0_rb_swp = 0x1;
355 		break;
356 	case RGA_FORMAT_BGRA_5551:
357 		src0_format = 0x5;
358 		pixel_width = 2;
359 		src0_rb_swp = 0x1;
360 		break;
361 	case RGA_FORMAT_BGRA_4444:
362 		src0_format = 0x6;
363 		pixel_width = 2;
364 		src0_rb_swp = 0x1;
365 		break;
366 
367 		/* ARGB */
368 		/*
369 		 * In colorkey mode, xrgb/xbgr does not
370 		 * need to enable the alpha channel
371 		 */
372 	case RGA_FORMAT_ARGB_8888:
373 		src0_format = 0x0;
374 		pixel_width = 4;
375 		src0_alpha_swp = 1;
376 		break;
377 	case RGA_FORMAT_ABGR_8888:
378 		src0_format = 0x0;
379 		pixel_width = 4;
380 		src0_alpha_swp = 1;
381 		src0_rb_swp = 0x1;
382 		break;
383 	case RGA_FORMAT_XRGB_8888:
384 		src0_format = 0x1;
385 		pixel_width = 4;
386 		src0_alpha_swp = 1;
387 		msg->src_trans_mode &= 0x07;
388 		break;
389 	case RGA_FORMAT_XBGR_8888:
390 		src0_format = 0x1;
391 		pixel_width = 4;
392 		src0_alpha_swp = 1;
393 		src0_rb_swp = 0x1;
394 		msg->src_trans_mode &= 0x07;
395 		break;
396 	case RGA_FORMAT_ARGB_5551:
397 		src0_format = 0x5;
398 		pixel_width = 2;
399 		src0_alpha_swp = 1;
400 		break;
401 	case RGA_FORMAT_ABGR_5551:
402 		src0_format = 0x5;
403 		pixel_width = 2;
404 		src0_alpha_swp = 1;
405 		src0_rb_swp = 0x1;
406 		break;
407 	case RGA_FORMAT_ARGB_4444:
408 		src0_format = 0x6;
409 		pixel_width = 2;
410 		src0_alpha_swp = 1;
411 		break;
412 	case RGA_FORMAT_ABGR_4444:
413 		src0_format = 0x6;
414 		pixel_width = 2;
415 		src0_alpha_swp = 1;
416 		src0_rb_swp = 0x1;
417 		break;
418 
419 	case RGA_FORMAT_YVYU_422:
420 		src0_format = 0x7;
421 		pixel_width = 2;
422 		src0_cbcr_swp = 1;
423 		src0_rb_swp = 0x1;
424 		break;		//rbswap=ycswap
425 	case RGA_FORMAT_VYUY_422:
426 		src0_format = 0x7;
427 		pixel_width = 2;
428 		src0_cbcr_swp = 1;
429 		src0_rb_swp = 0x0;
430 		break;
431 	case RGA_FORMAT_YUYV_422:
432 		src0_format = 0x7;
433 		pixel_width = 2;
434 		src0_cbcr_swp = 0;
435 		src0_rb_swp = 0x1;
436 		break;
437 	case RGA_FORMAT_UYVY_422:
438 		src0_format = 0x7;
439 		pixel_width = 2;
440 		src0_cbcr_swp = 0;
441 		src0_rb_swp = 0x0;
442 		break;
443 
444 	case RGA_FORMAT_YCbCr_422_SP:
445 		src0_format = 0x8;
446 		xdiv = 1;
447 		ydiv = 1;
448 		break;
449 	case RGA_FORMAT_YCbCr_422_P:
450 		src0_format = 0x9;
451 		xdiv = 2;
452 		ydiv = 1;
453 		break;
454 	case RGA_FORMAT_YCbCr_420_SP:
455 		src0_format = 0xa;
456 		xdiv = 1;
457 		ydiv = 2;
458 		break;
459 	case RGA_FORMAT_YCbCr_420_P:
460 		src0_format = 0xb;
461 		xdiv = 2;
462 		ydiv = 2;
463 		break;
464 	case RGA_FORMAT_YCrCb_422_SP:
465 		src0_format = 0x8;
466 		xdiv = 1;
467 		ydiv = 1;
468 		src0_cbcr_swp = 1;
469 		break;
470 	case RGA_FORMAT_YCrCb_422_P:
471 		src0_format = 0x9;
472 		xdiv = 2;
473 		ydiv = 1;
474 		src0_cbcr_swp = 1;
475 		break;
476 	case RGA_FORMAT_YCrCb_420_SP:
477 		src0_format = 0xa;
478 		xdiv = 1;
479 		ydiv = 2;
480 		src0_cbcr_swp = 1;
481 		break;
482 	case RGA_FORMAT_YCrCb_420_P:
483 		src0_format = 0xb;
484 		xdiv = 2;
485 		ydiv = 2;
486 		src0_cbcr_swp = 1;
487 		break;
488 
489 	case RGA_FORMAT_YCbCr_420_SP_10B:
490 		src0_format = 0xa;
491 		xdiv = 1;
492 		ydiv = 2;
493 		yuv10 = 1;
494 		break;
495 	case RGA_FORMAT_YCrCb_420_SP_10B:
496 		src0_format = 0xa;
497 		xdiv = 1;
498 		ydiv = 2;
499 		src0_cbcr_swp = 1;
500 		yuv10 = 1;
501 		break;
502 	case RGA_FORMAT_YCbCr_422_SP_10B:
503 		src0_format = 0x8;
504 		xdiv = 1;
505 		ydiv = 1;
506 		yuv10 = 1;
507 		break;
508 	case RGA_FORMAT_YCrCb_422_SP_10B:
509 		src0_format = 0x8;
510 		xdiv = 1;
511 		ydiv = 1;
512 		src0_cbcr_swp = 1;
513 		yuv10 = 1;
514 		break;
515 
516 	case RGA_FORMAT_YCbCr_400:
517 		src0_format = 0x8;
518 		/* When Yin_Yout is enabled, no need to go through the software. */
519 		disable_uv_channel_en = msg->yin_yout_en ? false : true;
520 		xdiv = 1;
521 		ydiv = 1;
522 		break;
523 	};
524 
525 	reg =
526 		((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) |
527 		 (s_RGA2_SRC_INFO_SW_SRC_FMT(src0_format)));
528 	reg =
529 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP)) |
530 		 (s_RGA2_SRC_INFO_SW_SW_SRC_RB_SWAP(src0_rb_swp)));
531 	reg =
532 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP)) |
533 		 (s_RGA2_SRC_INFO_SW_SW_SRC_ALPHA_SWAP(src0_alpha_swp)));
534 	reg =
535 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP)) |
536 		 (s_RGA2_SRC_INFO_SW_SW_SRC_UV_SWAP(src0_cbcr_swp)));
537 
538 	if (msg->src1.format == RGA_FORMAT_RGBA_2BPP)
539 		reg = ((reg & (~m_RGA2_SRC_INFO_SW_SW_CP_ENDIAN)) |
540 		       (s_RGA2_SRC_INFO_SW_SW_CP_ENDAIN(msg->osd_info.bpp2_info.endian_swap & 1)));
541 
542 	reg =
543 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE)) |
544 		 (s_RGA2_SRC_INFO_SW_SW_SRC_CSC_MODE(msg->yuv2rgb_mode)));
545 
546 	reg =
547 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_ROT_MODE)) |
548 		 (s_RGA2_SRC_INFO_SW_SW_SRC_ROT_MODE(msg->rotate_mode & 0x3)));
549 	reg =
550 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_MIR_MODE)) |
551 		 (s_RGA2_SRC_INFO_SW_SW_SRC_MIR_MODE
552 		 ((msg->rotate_mode >> 4) & 0x3)));
553 	reg =
554 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE)) |
555 		 (s_RGA2_SRC_INFO_SW_SW_SRC_HSCL_MODE((scale_w_flag))));
556 	reg =
557 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE)) |
558 		 (s_RGA2_SRC_INFO_SW_SW_SRC_VSCL_MODE((scale_h_flag))));
559 	reg =
560 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_SCL_FILTER)) |
561 		 (s_RGA2_SRC_INFO_SW_SW_SRC_SCL_FILTER((
562 			msg->scale_bicu_mode))));
563 	reg =
564 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_TRANS_MODE)) |
565 		 (s_RGA2_SRC_INFO_SW_SW_SRC_TRANS_MODE(msg->src_trans_mode)));
566 	reg =
567 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_TRANS_E)) |
568 		 (s_RGA2_SRC_INFO_SW_SW_SRC_TRANS_E(msg->src_trans_mode >> 1)));
569 	reg =
570 		((reg & (~m_RGA2_SRC_INFO_SW_SW_SRC_DITHER_UP_E)) |
571 		 (s_RGA2_SRC_INFO_SW_SW_SRC_DITHER_UP_E
572 		 ((msg->alpha_rop_flag >> 4) & 0x1)));
573 	reg =
574 		((reg & (~m_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL)) |
575 		 (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL((vsp_scale_mode))));
576 	reg =
577 		((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_E)) |
578 		 (s_RGA2_SRC_INFO_SW_SW_YUV10_E((yuv10))));
579 
580 	reg =
581 		((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_ROUND_E)) |
582 		 (s_RGA2_SRC_INFO_SW_SW_YUV10_ROUND_E((yuv10))));
583 
584 	RGA2_reg_get_param(base, msg);
585 
586 	stride = (((msg->src.vir_w * pixel_width) + 3) & ~3) >> 2;
587 	uv_stride = ((msg->src.vir_w / xdiv + 3) & ~3);
588 
589 	if (disable_uv_channel_en == 1) {
590 		/*
591 		 * When Y400 as the input format, because the current
592 		 * RGA does not support closing
593 		 * the access of the UV channel, the address of the UV
594 		 * channel access is equal to
595 		 * the address of the Y channel access to ensure that
596 		 * the UV channel can access,
597 		 * preventing the RGA hardware from reporting errors.
598 		 */
599 		*bRGA_SRC_BASE0 =
600 			(u32) (msg->src.yrgb_addr +
601 				 msg->src.y_offset * (stride << 2) +
602 				 msg->src.x_offset * pixel_width);
603 		*bRGA_SRC_BASE1 = *bRGA_SRC_BASE0;
604 		*bRGA_SRC_BASE2 = *bRGA_SRC_BASE0;
605 	} else {
606 		*bRGA_SRC_BASE0 =
607 			(u32) (msg->src.yrgb_addr +
608 				 msg->src.y_offset * (stride << 2) +
609 				 msg->src.x_offset * pixel_width);
610 		*bRGA_SRC_BASE1 =
611 			(u32) (msg->src.uv_addr +
612 				 (msg->src.y_offset / ydiv) * uv_stride +
613 				 (msg->src.x_offset / xdiv));
614 		*bRGA_SRC_BASE2 =
615 			(u32) (msg->src.v_addr +
616 				 (msg->src.y_offset / ydiv) * uv_stride +
617 				 (msg->src.x_offset / xdiv));
618 	}
619 
620 	//mask_stride = ((msg->src0_act.width + 31) & ~31) >> 5;
621 	mask_stride = msg->rop_mask_stride;
622 
623 	*bRGA_SRC_VIR_INFO = stride | (mask_stride << 16);
624 
625 	*bRGA_SRC_ACT_INFO =
626 		(msg->src.act_w - 1) | ((msg->src.act_h - 1) << 16);
627 
628 	*bRGA_MASK_ADDR = (u32) msg->rop_mask_addr;
629 
630 	*bRGA_SRC_INFO = reg;
631 
632 	*bRGA_SRC_TR_COLOR0 = msg->color_key_min;
633 	*bRGA_SRC_TR_COLOR1 = msg->color_key_max;
634 }
635 
RGA2_set_reg_dst_info(u8 * base,struct rga2_req * msg)636 static void RGA2_set_reg_dst_info(u8 *base, struct rga2_req *msg)
637 {
638 	u32 *bRGA_DST_INFO;
639 	u32 *bRGA_DST_BASE0, *bRGA_DST_BASE1, *bRGA_DST_BASE2,
640 		*bRGA_SRC_BASE3;
641 	u32 *bRGA_DST_VIR_INFO;
642 	u32 *bRGA_DST_ACT_INFO;
643 
644 	u32 *RGA_DST_Y4MAP_LUT0;	//Y4 LUT0
645 	u32 *RGA_DST_Y4MAP_LUT1;	//Y4 LUT1
646 	u32 *RGA_DST_NN_QUANTIZE_SCALE;
647 	u32 *RGA_DST_NN_QUANTIZE_OFFSET;
648 
649 	u32 line_width_real;
650 
651 	u8 ydither_en = 0;
652 
653 	u8 src1_format = 0;
654 	u8 src1_rb_swp = 0;
655 	u8 src1_alpha_swp = 0;
656 
657 	u8 dst_format = 0;
658 	u8 dst_rb_swp = 0;
659 	u8 dst_cbcr_swp = 0;
660 	u8 dst_alpha_swp = 0;
661 
662 	u8 dst_fmt_yuv400_en = 0;
663 	u8 dst_fmt_y4_en = 0;
664 	u8 dst_nn_quantize_en = 0;
665 
666 	u32 reg = 0;
667 	u8 spw, dpw;
668 	u8 bbp_shift = 0;
669 	u32 s_stride, d_stride;
670 	u32 x_mirr, y_mirr, rot_90_flag;
671 	u32 yrgb_addr, u_addr, v_addr, s_yrgb_addr;
672 	u32 d_uv_stride, x_div, y_div;
673 	u32 y_lt_addr, y_ld_addr, y_rt_addr, y_rd_addr;
674 	u32 u_lt_addr, u_ld_addr, u_rt_addr, u_rd_addr;
675 	u32 v_lt_addr, v_ld_addr, v_rt_addr, v_rd_addr;
676 
677 	dpw = 1;
678 	x_div = y_div = 1;
679 
680 	dst_nn_quantize_en = (msg->alpha_rop_flag >> 8) & 0x1;
681 
682 	bRGA_DST_INFO = (u32 *) (base + RGA2_DST_INFO_OFFSET);
683 	bRGA_DST_BASE0 = (u32 *) (base + RGA2_DST_BASE0_OFFSET);
684 	bRGA_DST_BASE1 = (u32 *) (base + RGA2_DST_BASE1_OFFSET);
685 	bRGA_DST_BASE2 = (u32 *) (base + RGA2_DST_BASE2_OFFSET);
686 
687 	bRGA_SRC_BASE3 = (u32 *) (base + RGA2_SRC_BASE3_OFFSET);
688 
689 	bRGA_DST_VIR_INFO = (u32 *) (base + RGA2_DST_VIR_INFO_OFFSET);
690 	bRGA_DST_ACT_INFO = (u32 *) (base + RGA2_DST_ACT_INFO_OFFSET);
691 
692 	RGA_DST_Y4MAP_LUT0 = (u32 *) (base + RGA2_DST_Y4MAP_LUT0_OFFSET);
693 	RGA_DST_Y4MAP_LUT1 = (u32 *) (base + RGA2_DST_Y4MAP_LUT1_OFFSET);
694 	RGA_DST_NN_QUANTIZE_SCALE =
695 		(u32 *) (base + RGA2_DST_QUANTIZE_SCALE_OFFSET);
696 	RGA_DST_NN_QUANTIZE_OFFSET =
697 		(u32 *) (base + RGA2_DST_QUANTIZE_OFFSET_OFFSET);
698 
699 	switch (msg->src1.format) {
700 	case RGA_FORMAT_RGBA_8888:
701 		src1_format = 0x0;
702 		spw = 4;
703 		break;
704 	case RGA_FORMAT_BGRA_8888:
705 		src1_format = 0x0;
706 		src1_rb_swp = 0x1;
707 		spw = 4;
708 		break;
709 	case RGA_FORMAT_RGBX_8888:
710 		src1_format = 0x1;
711 		spw = 4;
712 		break;
713 	case RGA_FORMAT_BGRX_8888:
714 		src1_format = 0x1;
715 		src1_rb_swp = 0x1;
716 		spw = 4;
717 		break;
718 	case RGA_FORMAT_RGB_888:
719 		src1_format = 0x2;
720 		spw = 3;
721 		break;
722 	case RGA_FORMAT_BGR_888:
723 		src1_format = 0x2;
724 		src1_rb_swp = 1;
725 		spw = 3;
726 		break;
727 	case RGA_FORMAT_RGB_565:
728 		src1_format = 0x4;
729 		spw = 2;
730 		break;
731 	case RGA_FORMAT_RGBA_5551:
732 		src1_format = 0x5;
733 		spw = 2;
734 		break;
735 	case RGA_FORMAT_RGBA_4444:
736 		src1_format = 0x6;
737 		spw = 2;
738 		break;
739 	case RGA_FORMAT_BGR_565:
740 		src1_format = 0x4;
741 		spw = 2;
742 		src1_rb_swp = 0x1;
743 		break;
744 	case RGA_FORMAT_BGRA_5551:
745 		src1_format = 0x5;
746 		spw = 2;
747 		src1_rb_swp = 0x1;
748 		break;
749 	case RGA_FORMAT_BGRA_4444:
750 		src1_format = 0x6;
751 		spw = 2;
752 		src1_rb_swp = 0x1;
753 		break;
754 
755 		/* ARGB */
756 	case RGA_FORMAT_ARGB_8888:
757 		src1_format = 0x0;
758 		spw = 4;
759 		src1_alpha_swp = 1;
760 		break;
761 	case RGA_FORMAT_ABGR_8888:
762 		src1_format = 0x0;
763 		spw = 4;
764 		src1_alpha_swp = 1;
765 		src1_rb_swp = 0x1;
766 		break;
767 	case RGA_FORMAT_XRGB_8888:
768 		src1_format = 0x1;
769 		spw = 4;
770 		src1_alpha_swp = 1;
771 		break;
772 	case RGA_FORMAT_XBGR_8888:
773 		src1_format = 0x1;
774 		spw = 4;
775 		src1_alpha_swp = 1;
776 		src1_rb_swp = 0x1;
777 		break;
778 	case RGA_FORMAT_ARGB_5551:
779 		src1_format = 0x5;
780 		spw = 2;
781 		src1_alpha_swp = 1;
782 		break;
783 	case RGA_FORMAT_ABGR_5551:
784 		src1_format = 0x5;
785 		spw = 2;
786 		src1_alpha_swp = 1;
787 		src1_rb_swp = 0x1;
788 		break;
789 	case RGA_FORMAT_ARGB_4444:
790 		src1_format = 0x6;
791 		spw = 2;
792 		src1_alpha_swp = 1;
793 		break;
794 	case RGA_FORMAT_ABGR_4444:
795 		src1_format = 0x6;
796 		spw = 2;
797 		src1_alpha_swp = 1;
798 		src1_rb_swp = 0x1;
799 		break;
800 	case RGA_FORMAT_RGBA_2BPP:
801 		src1_format = 0x0;
802 		spw = 1;
803 		/* 2BPP = 8 >> 2 = 2bit */
804 		bbp_shift = 2;
805 		src1_alpha_swp = msg->osd_info.bpp2_info.ac_swap;
806 		break;
807 	default:
808 		spw = 4;
809 		break;
810 	};
811 
812 	reg =
813 		((reg & (~m_RGA2_DST_INFO_SW_SRC1_FMT)) |
814 		 (s_RGA2_DST_INFO_SW_SRC1_FMT(src1_format)));
815 	reg =
816 		((reg & (~m_RGA2_DST_INFO_SW_SRC1_RB_SWP)) |
817 		 (s_RGA2_DST_INFO_SW_SRC1_RB_SWP(src1_rb_swp)));
818 	reg =
819 		((reg & (~m_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP)) |
820 		 (s_RGA2_DST_INFO_SW_SRC1_ALPHA_SWP(src1_alpha_swp)));
821 
822 	switch (msg->dst.format) {
823 	case RGA_FORMAT_RGBA_8888:
824 		dst_format = 0x0;
825 		dpw = 4;
826 		break;
827 	case RGA_FORMAT_BGRA_8888:
828 		dst_format = 0x0;
829 		dst_rb_swp = 0x1;
830 		dpw = 4;
831 		break;
832 	case RGA_FORMAT_RGBX_8888:
833 		dst_format = 0x1;
834 		dpw = 4;
835 		break;
836 	case RGA_FORMAT_BGRX_8888:
837 		dst_format = 0x1;
838 		dst_rb_swp = 0x1;
839 		dpw = 4;
840 		break;
841 	case RGA_FORMAT_RGB_888:
842 		dst_format = 0x2;
843 		dpw = 3;
844 		break;
845 	case RGA_FORMAT_BGR_888:
846 		dst_format = 0x2;
847 		dst_rb_swp = 1;
848 		dpw = 3;
849 		break;
850 	case RGA_FORMAT_RGB_565:
851 		dst_format = 0x4;
852 		dpw = 2;
853 		break;
854 	case RGA_FORMAT_RGBA_5551:
855 		dst_format = 0x5;
856 		dpw = 2;
857 		break;
858 	case RGA_FORMAT_RGBA_4444:
859 		dst_format = 0x6;
860 		dpw = 2;
861 		break;
862 	case RGA_FORMAT_BGR_565:
863 		dst_format = 0x4;
864 		dpw = 2;
865 		dst_rb_swp = 0x1;
866 		break;
867 	case RGA_FORMAT_BGRA_5551:
868 		dst_format = 0x5;
869 		dpw = 2;
870 		dst_rb_swp = 0x1;
871 		break;
872 	case RGA_FORMAT_BGRA_4444:
873 		dst_format = 0x6;
874 		dpw = 2;
875 		dst_rb_swp = 0x1;
876 		break;
877 
878 		/* ARGB */
879 	case RGA_FORMAT_ARGB_8888:
880 		dst_format = 0x0;
881 		dpw = 4;
882 		dst_alpha_swp = 1;
883 		break;
884 	case RGA_FORMAT_ABGR_8888:
885 		dst_format = 0x0;
886 		dpw = 4;
887 		dst_alpha_swp = 1;
888 		dst_rb_swp = 0x1;
889 		break;
890 	case RGA_FORMAT_XRGB_8888:
891 		dst_format = 0x1;
892 		dpw = 4;
893 		dst_alpha_swp = 1;
894 		break;
895 	case RGA_FORMAT_XBGR_8888:
896 		dst_format = 0x1;
897 		dpw = 4;
898 		dst_alpha_swp = 1;
899 		dst_rb_swp = 0x1;
900 		break;
901 	case RGA_FORMAT_ARGB_5551:
902 		dst_format = 0x5;
903 		dpw = 2;
904 		dst_alpha_swp = 1;
905 		break;
906 	case RGA_FORMAT_ABGR_5551:
907 		dst_format = 0x5;
908 		dpw = 2;
909 		dst_alpha_swp = 1;
910 		dst_rb_swp = 0x1;
911 		break;
912 	case RGA_FORMAT_ARGB_4444:
913 		dst_format = 0x6;
914 		dpw = 2;
915 		dst_alpha_swp = 1;
916 		break;
917 	case RGA_FORMAT_ABGR_4444:
918 		dst_format = 0x6;
919 		dpw = 2;
920 		dst_alpha_swp = 1;
921 		dst_rb_swp = 0x1;
922 		break;
923 
924 	case RGA_FORMAT_YCbCr_422_SP:
925 		dst_format = 0x8;
926 		x_div = 1;
927 		y_div = 1;
928 		break;
929 	case RGA_FORMAT_YCbCr_422_P:
930 		dst_format = 0x9;
931 		x_div = 2;
932 		y_div = 1;
933 		break;
934 	case RGA_FORMAT_YCbCr_420_SP:
935 		dst_format = 0xa;
936 		x_div = 1;
937 		y_div = 2;
938 		break;
939 	case RGA_FORMAT_YCbCr_420_P:
940 		dst_format = 0xb;
941 		dst_cbcr_swp = 1;
942 		x_div = 2;
943 		y_div = 2;
944 		break;
945 	case RGA_FORMAT_YCrCb_422_SP:
946 		dst_format = 0x8;
947 		dst_cbcr_swp = 1;
948 		x_div = 1;
949 		y_div = 1;
950 		break;
951 	case RGA_FORMAT_YCrCb_422_P:
952 		dst_format = 0x9;
953 		dst_cbcr_swp = 1;
954 		x_div = 2;
955 		y_div = 1;
956 		break;
957 	case RGA_FORMAT_YCrCb_420_SP:
958 		dst_format = 0xa;
959 		dst_cbcr_swp = 1;
960 		x_div = 1;
961 		y_div = 2;
962 		break;
963 	case RGA_FORMAT_YCrCb_420_P:
964 		dst_format = 0xb;
965 		x_div = 2;
966 		y_div = 2;
967 		break;
968 
969 	case RGA_FORMAT_YCbCr_400:
970 		dst_format = 0x8;
971 		dst_fmt_yuv400_en = 1;
972 		x_div = 1;
973 		y_div = 1;
974 		break;
975 	case RGA_FORMAT_Y4:
976 		dst_format = 0x8;
977 		dst_fmt_y4_en = 1;
978 		dst_fmt_yuv400_en = 1;
979 		x_div = 1;
980 		y_div = 1;
981 		break;
982 
983 	case RGA_FORMAT_YUYV_422:
984 		dst_format = 0xe;
985 		dpw = 2;
986 		dst_cbcr_swp = 1;
987 		break;
988 	case RGA_FORMAT_YVYU_422:
989 		dst_format = 0xe;
990 		dpw = 2;
991 		break;
992 	case RGA_FORMAT_YUYV_420:
993 		dst_format = 0xf;
994 		dpw = 2;
995 		dst_cbcr_swp = 1;
996 		break;
997 	case RGA_FORMAT_YVYU_420:
998 		dst_format = 0xf;
999 		dpw = 2;
1000 		break;
1001 	case RGA_FORMAT_UYVY_422:
1002 		dst_format = 0xc;
1003 		dpw = 2;
1004 		dst_cbcr_swp = 1;
1005 		break;
1006 	case RGA_FORMAT_VYUY_422:
1007 		dst_format = 0xc;
1008 		dpw = 2;
1009 		break;
1010 	case RGA_FORMAT_UYVY_420:
1011 		dst_format = 0xd;
1012 		dpw = 2;
1013 		dst_cbcr_swp = 1;
1014 		break;
1015 	case RGA_FORMAT_VYUY_420:
1016 		dst_format = 0xd;
1017 		dpw = 2;
1018 		break;
1019 	};
1020 
1021 	reg =
1022 		((reg & (~m_RGA2_DST_INFO_SW_DST_FMT)) |
1023 		 (s_RGA2_DST_INFO_SW_DST_FMT(dst_format)));
1024 	reg =
1025 		((reg & (~m_RGA2_DST_INFO_SW_DST_RB_SWAP)) |
1026 		 (s_RGA2_DST_INFO_SW_DST_RB_SWAP(dst_rb_swp)));
1027 	reg =
1028 		((reg & (~m_RGA2_DST_INFO_SW_ALPHA_SWAP)) |
1029 		 (s_RGA2_DST_INFO_SW_ALPHA_SWAP(dst_alpha_swp)));
1030 	reg =
1031 		((reg & (~m_RGA2_DST_INFO_SW_DST_UV_SWAP)) |
1032 		 (s_RGA2_DST_INFO_SW_DST_UV_SWAP(dst_cbcr_swp)));
1033 
1034 	reg =
1035 		((reg & (~m_RGA2_DST_INFO_SW_DST_FMT_YUV400_EN)) |
1036 		 (s_RGA2_DST_INFO_SW_DST_FMT_YUV400_EN(dst_fmt_yuv400_en)));
1037 	reg =
1038 		((reg & (~m_RGA2_DST_INFO_SW_DST_FMT_Y4_EN)) |
1039 		 (s_RGA2_DST_INFO_SW_DST_FMT_Y4_EN(dst_fmt_y4_en)));
1040 	reg =
1041 		((reg & (~m_RGA2_DST_INFO_SW_DST_NN_QUANTIZE_EN)) |
1042 		 (s_RGA2_DST_INFO_SW_DST_NN_QUANTIZE_EN(dst_nn_quantize_en)));
1043 	reg =
1044 		((reg & (~m_RGA2_DST_INFO_SW_DITHER_UP_E)) |
1045 		 (s_RGA2_DST_INFO_SW_DITHER_UP_E(msg->alpha_rop_flag >> 5)));
1046 	reg =
1047 		((reg & (~m_RGA2_DST_INFO_SW_DITHER_DOWN_E)) |
1048 		 (s_RGA2_DST_INFO_SW_DITHER_DOWN_E(msg->alpha_rop_flag >> 6)));
1049 	reg =
1050 		((reg & (~m_RGA2_DST_INFO_SW_DITHER_MODE)) |
1051 		 (s_RGA2_DST_INFO_SW_DITHER_MODE(msg->dither_mode)));
1052 	reg =
1053 		((reg & (~m_RGA2_DST_INFO_SW_DST_CSC_MODE)) |
1054 		 (s_RGA2_DST_INFO_SW_DST_CSC_MODE(msg->yuv2rgb_mode >> 2)));
1055 	reg =
1056 		((reg & (~m_RGA2_DST_INFO_SW_CSC_CLIP_MODE)) |
1057 		 (s_RGA2_DST_INFO_SW_CSC_CLIP_MODE(msg->yuv2rgb_mode >> 4)));
1058 	/* full csc enable */
1059 	reg =
1060 		((reg & (~m_RGA2_DST_INFO_SW_DST_CSC_MODE_2)) |
1061 		 (s_RGA2_DST_INFO_SW_DST_CSC_MODE_2(msg->full_csc_en)));
1062 	/*
1063 	 * Some older chips do not support src1 csc mode,
1064 	 * they do not have these two registers.
1065 	 */
1066 	reg =
1067 		((reg & (~m_RGA2_DST_INFO_SW_SRC1_CSC_MODE)) |
1068 		 (s_RGA2_DST_INFO_SW_SRC1_CSC_MODE(msg->yuv2rgb_mode >> 5)));
1069 	reg =
1070 		((reg & (~m_RGA2_DST_INFO_SW_SRC1_CSC_CLIP_MODE)) |
1071 		 (s_RGA2_DST_INFO_SW_SRC1_CSC_CLIP_MODE(
1072 			msg->yuv2rgb_mode >> 7)));
1073 
1074 	reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_UVHDS_MODE)) |
1075 	       (s_RGA2_DST_INFO_SW_DST_UVHDS_MODE(msg->uvhds_mode)));
1076 	reg = ((reg & (~m_RGA2_DST_INFO_SW_DST_UVVDS_MODE)) |
1077 	       (s_RGA2_DST_INFO_SW_DST_UVVDS_MODE(msg->uvvds_mode)));
1078 
1079 	ydither_en = (msg->dst.format == RGA_FORMAT_Y4)
1080 		&& ((msg->alpha_rop_flag >> 6) & 0x1);
1081 
1082 	*bRGA_DST_INFO = reg;
1083 
1084 	s_stride = (((msg->src1.vir_w * spw >> bbp_shift) + 3) & ~3) >> 2;
1085 	d_stride = ((msg->dst.vir_w * dpw + 3) & ~3) >> 2;
1086 
1087 	if (dst_fmt_y4_en) {
1088 		/* Y4 output will HALF */
1089 		d_stride = ((d_stride + 1) & ~1) >> 1;
1090 	}
1091 
1092 	d_uv_stride = (d_stride << 2) / x_div;
1093 
1094 	*bRGA_DST_VIR_INFO = d_stride | (s_stride << 16);
1095 	if ((msg->dst.vir_w % 2 != 0) &&
1096 		(msg->dst.act_w == msg->src.act_w)
1097 		&& (msg->dst.act_h == msg->src.act_h)
1098 		&& (msg->dst.format == RGA_FORMAT_BGR_888
1099 		|| msg->dst.format == RGA_FORMAT_RGB_888))
1100 		*bRGA_DST_ACT_INFO =
1101 			(msg->dst.act_w) | ((msg->dst.act_h - 1) << 16);
1102 	else
1103 		*bRGA_DST_ACT_INFO =
1104 			(msg->dst.act_w - 1) | ((msg->dst.act_h - 1) << 16);
1105 	s_stride <<= 2;
1106 	d_stride <<= 2;
1107 
1108 	if (((msg->rotate_mode & 0xf) == 0) ||
1109 		((msg->rotate_mode & 0xf) == 1)) {
1110 		x_mirr = 0;
1111 		y_mirr = 0;
1112 	} else {
1113 		x_mirr = 1;
1114 		y_mirr = 1;
1115 	}
1116 
1117 	rot_90_flag = msg->rotate_mode & 1;
1118 	x_mirr = (x_mirr + ((msg->rotate_mode >> 4) & 1)) & 1;
1119 	y_mirr = (y_mirr + ((msg->rotate_mode >> 5) & 1)) & 1;
1120 
1121 	if (ydither_en) {
1122 		if (x_mirr && y_mirr) {
1123 			pr_err("ydither mode do not support rotate x_mirr=%d,y_mirr=%d\n",
1124 				x_mirr, y_mirr);
1125 		}
1126 
1127 		if (msg->dst.act_w != msg->src.act_w)
1128 			pr_err("ydither mode do not support x dir scale\n");
1129 
1130 		if (msg->dst.act_h != msg->src.act_h)
1131 			pr_err("ydither mode do not support y dir scale\n");
1132 	}
1133 
1134 	if (dst_fmt_y4_en) {
1135 		*RGA_DST_Y4MAP_LUT0 = (msg->gr_color.gr_x_r & 0xffff) |
1136 			(msg->gr_color.gr_x_g << 16);
1137 		*RGA_DST_Y4MAP_LUT1 = (msg->gr_color.gr_y_r & 0xffff) |
1138 			(msg->gr_color.gr_y_g << 16);
1139 	}
1140 
1141 	if (dst_nn_quantize_en) {
1142 		*RGA_DST_NN_QUANTIZE_SCALE = (msg->gr_color.gr_x_r & 0xffff) |
1143 			(msg->gr_color.gr_x_g << 10) |
1144 			(msg->gr_color.gr_x_b << 20);
1145 		*RGA_DST_NN_QUANTIZE_OFFSET = (msg->gr_color.gr_y_r & 0xffff) |
1146 			(msg->gr_color.gr_y_g << 10) |
1147 			(msg->gr_color.gr_y_b << 20);
1148 	}
1149 
1150 	s_yrgb_addr =
1151 		(u32) msg->src1.yrgb_addr + (msg->src1.y_offset * s_stride) +
1152 		(msg->src1.x_offset * spw >> bbp_shift);
1153 
1154 	*bRGA_SRC_BASE3 = s_yrgb_addr;
1155 
1156 	if (dst_fmt_y4_en) {
1157 		yrgb_addr = (u32) msg->dst.yrgb_addr +
1158 			(msg->dst.y_offset * d_stride) +
1159 			((msg->dst.x_offset * dpw) >> 1);
1160 	} else {
1161 		yrgb_addr = (u32) msg->dst.yrgb_addr +
1162 			(msg->dst.y_offset * d_stride) +
1163 			(msg->dst.x_offset * dpw);
1164 	}
1165 	u_addr = (u32) msg->dst.uv_addr +
1166 		(msg->dst.y_offset / y_div) * d_uv_stride +
1167 		msg->dst.x_offset / x_div;
1168 	v_addr = (u32) msg->dst.v_addr +
1169 		(msg->dst.y_offset / y_div) * d_uv_stride +
1170 		msg->dst.x_offset / x_div;
1171 
1172 	y_lt_addr = yrgb_addr;
1173 	u_lt_addr = u_addr;
1174 	v_lt_addr = v_addr;
1175 
1176 	/* Warning */
1177 	line_width_real =
1178 		dst_fmt_y4_en ? ((msg->dst.act_w) >> 1) : msg->dst.act_w;
1179 
1180 	/*
1181 	 * YUV packet mode is a new format, and the write behavior during
1182 	 * rotation is different from the old format.
1183 	 */
1184 	if (rga_is_yuv422_packed_format(msg->dst.format)) {
1185 		y_ld_addr = yrgb_addr + (msg->dst.act_h - 1) * (d_stride);
1186 		y_rt_addr = yrgb_addr + (msg->dst.act_w * 2 - 1);
1187 		y_rd_addr = y_ld_addr + (msg->dst.act_w * 2 - 1);
1188 	} else if (rga_is_yuv420_packed_format(msg->dst.format)) {
1189 		y_ld_addr = (u32)msg->dst.yrgb_addr +
1190 			    ((msg->dst.y_offset + (msg->dst.act_h - 1)) * d_stride) +
1191 			    msg->dst.x_offset;
1192 		y_rt_addr = yrgb_addr + (msg->dst.act_w * 2 - 1);
1193 		y_rd_addr = y_ld_addr + (msg->dst.act_w - 1);
1194 	} else {
1195 		/* 270 degree & Mirror V */
1196 		y_ld_addr = yrgb_addr + (msg->dst.act_h - 1) * (d_stride);
1197 		/* 90 degree & Mirror H */
1198 		y_rt_addr = yrgb_addr + (line_width_real - 1) * dpw;
1199 		/* 180 degree */
1200 		y_rd_addr = y_ld_addr + (line_width_real - 1) * dpw;
1201 	}
1202 
1203 	u_ld_addr = u_addr + ((msg->dst.act_h / y_div) - 1) * (d_uv_stride);
1204 	v_ld_addr = v_addr + ((msg->dst.act_h / y_div) - 1) * (d_uv_stride);
1205 
1206 	u_rt_addr = u_addr + (msg->dst.act_w / x_div) - 1;
1207 	v_rt_addr = v_addr + (msg->dst.act_w / x_div) - 1;
1208 
1209 	u_rd_addr = u_ld_addr + (msg->dst.act_w / x_div) - 1;
1210 	v_rd_addr = v_ld_addr + (msg->dst.act_w / x_div) - 1;
1211 
1212 	if (rot_90_flag == 0) {
1213 		if (y_mirr == 1) {
1214 			if (x_mirr == 1) {
1215 				yrgb_addr = y_rd_addr;
1216 				u_addr = u_rd_addr;
1217 				v_addr = v_rd_addr;
1218 			} else {
1219 				yrgb_addr = y_ld_addr;
1220 				u_addr = u_ld_addr;
1221 				v_addr = v_ld_addr;
1222 			}
1223 		} else {
1224 			if (x_mirr == 1) {
1225 				yrgb_addr = y_rt_addr;
1226 				u_addr = u_rt_addr;
1227 				v_addr = v_rt_addr;
1228 			} else {
1229 				yrgb_addr = y_lt_addr;
1230 				u_addr = u_lt_addr;
1231 				v_addr = v_lt_addr;
1232 			}
1233 		}
1234 	} else {
1235 		if (y_mirr == 1) {
1236 			if (x_mirr == 1) {
1237 				yrgb_addr = y_ld_addr;
1238 				u_addr = u_ld_addr;
1239 				v_addr = v_ld_addr;
1240 			} else {
1241 				yrgb_addr = y_rd_addr;
1242 				u_addr = u_rd_addr;
1243 				v_addr = v_rd_addr;
1244 			}
1245 		} else {
1246 			if (x_mirr == 1) {
1247 				yrgb_addr = y_lt_addr;
1248 				u_addr = u_lt_addr;
1249 				v_addr = v_lt_addr;
1250 			} else {
1251 				yrgb_addr = y_rt_addr;
1252 				u_addr = u_rt_addr;
1253 				v_addr = v_rt_addr;
1254 			}
1255 		}
1256 	}
1257 
1258 	*bRGA_DST_BASE0 = (u32) yrgb_addr;
1259 
1260 	if ((msg->dst.format == RGA_FORMAT_YCbCr_420_P)
1261 		|| (msg->dst.format == RGA_FORMAT_YCrCb_420_P)) {
1262 		if (dst_cbcr_swp == 0) {
1263 			*bRGA_DST_BASE1 = (u32) v_addr;
1264 			*bRGA_DST_BASE2 = (u32) u_addr;
1265 		} else {
1266 			*bRGA_DST_BASE1 = (u32) u_addr;
1267 			*bRGA_DST_BASE2 = (u32) v_addr;
1268 		}
1269 	} else {
1270 		*bRGA_DST_BASE1 = (u32) u_addr;
1271 		*bRGA_DST_BASE2 = (u32) v_addr;
1272 	}
1273 }
1274 
RGA2_set_reg_alpha_info(u8 * base,struct rga2_req * msg)1275 static void RGA2_set_reg_alpha_info(u8 *base, struct rga2_req *msg)
1276 {
1277 	u32 *bRGA_ALPHA_CTRL0;
1278 	u32 *bRGA_ALPHA_CTRL1;
1279 	u32 *bRGA_FADING_CTRL;
1280 	u32 reg = 0;
1281 	union rga2_color_ctrl color_ctrl;
1282 	union rga2_alpha_ctrl alpha_ctrl;
1283 	struct rga_alpha_config *config;
1284 
1285 	bRGA_ALPHA_CTRL0 = (u32 *) (base + RGA2_ALPHA_CTRL0_OFFSET);
1286 	bRGA_ALPHA_CTRL1 = (u32 *) (base + RGA2_ALPHA_CTRL1_OFFSET);
1287 	bRGA_FADING_CTRL = (u32 *) (base + RGA2_FADING_CTRL_OFFSET);
1288 
1289 	color_ctrl.value = 0;
1290 	alpha_ctrl.value = 0;
1291 	config = &msg->alpha_config;
1292 
1293 	color_ctrl.bits.src_color_mode =
1294 		config->fg_pre_multiplied ? RGA_ALPHA_PRE_MULTIPLIED : RGA_ALPHA_NO_PRE_MULTIPLIED;
1295 	color_ctrl.bits.dst_color_mode =
1296 		config->bg_pre_multiplied ? RGA_ALPHA_PRE_MULTIPLIED : RGA_ALPHA_NO_PRE_MULTIPLIED;
1297 
1298 	if (config->fg_pixel_alpha_en)
1299 		color_ctrl.bits.src_blend_mode =
1300 			config->fg_global_alpha_en ? RGA_ALPHA_PER_PIXEL_GLOBAL :
1301 			RGA_ALPHA_PER_PIXEL;
1302 	else
1303 		color_ctrl.bits.src_blend_mode = RGA_ALPHA_GLOBAL;
1304 
1305 	if (config->bg_pixel_alpha_en)
1306 		color_ctrl.bits.dst_blend_mode =
1307 			config->bg_global_alpha_en ? RGA_ALPHA_PER_PIXEL_GLOBAL :
1308 			RGA_ALPHA_PER_PIXEL;
1309 	else
1310 		color_ctrl.bits.dst_blend_mode = RGA_ALPHA_GLOBAL;
1311 
1312 	/*
1313 	 * Since the hardware uses 256 as 1, the original alpha value needs to
1314 	 * be + (alpha >> 7).
1315 	 */
1316 	color_ctrl.bits.src_alpha_cal_mode = RGA_ALPHA_SATURATION;
1317 	color_ctrl.bits.dst_alpha_cal_mode = RGA_ALPHA_SATURATION;
1318 
1319 	/* porter duff alpha enable */
1320 	switch (config->mode) {
1321 	case RGA_ALPHA_BLEND_SRC:
1322 		/*
1323 		 * SRC mode:
1324 		 *	Sf = 1, Df = 0;
1325 		 *	[Rc,Ra] = [Sc,Sa];
1326 		 */
1327 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1328 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_ONE;
1329 
1330 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1331 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ZERO;
1332 
1333 		break;
1334 
1335 	case RGA_ALPHA_BLEND_DST:
1336 		/*
1337 		 * SRC mode:
1338 		 *	Sf = 0, Df = 1;
1339 		 *	[Rc,Ra] = [Dc,Da];
1340 		 */
1341 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1342 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_ZERO;
1343 
1344 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1345 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ONE;
1346 
1347 		break;
1348 
1349 	case RGA_ALPHA_BLEND_SRC_OVER:
1350 		/*
1351 		 * SRC-OVER mode:
1352 		 *	Sf = 1, Df = (1 - Sa)
1353 		 *	[Rc,Ra] = [ Sc + (1 - Sa) * Dc, Sa + (1 - Sa) * Da ]
1354 		 */
1355 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1356 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_ONE;
1357 
1358 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1359 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE;
1360 
1361 		break;
1362 
1363 	case RGA_ALPHA_BLEND_DST_OVER:
1364 		/*
1365 		 * DST-OVER mode:
1366 		 *	Sf = (1 - Da) , Df = 1
1367 		 *	[Rc,Ra] = [ Sc * (1 - Da) + Dc, Sa * (1 - Da) + Da ]
1368 		 */
1369 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1370 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE;
1371 
1372 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1373 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ONE;
1374 
1375 		break;
1376 
1377 	case RGA_ALPHA_BLEND_SRC_IN:
1378 		/*
1379 		 * SRC-IN mode:
1380 		 *	Sf = Da , Df = 0
1381 		 *	[Rc,Ra] = [ Sc * Da, Sa * Da ]
1382 		 */
1383 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1384 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE;
1385 
1386 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1387 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ZERO;
1388 
1389 		break;
1390 
1391 	case RGA_ALPHA_BLEND_DST_IN:
1392 		/*
1393 		 * DST-IN mode:
1394 		 *	Sf = 0 , Df = Sa
1395 		 *	[Rc,Ra] = [ Dc * Sa, Da * Sa ]
1396 		 */
1397 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1398 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_ZERO;
1399 
1400 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1401 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE;
1402 
1403 		break;
1404 
1405 	case RGA_ALPHA_BLEND_SRC_OUT:
1406 		/*
1407 		 * SRC-OUT mode:
1408 		 *	Sf = (1 - Da) , Df = 0
1409 		 *	[Rc,Ra] = [ Sc * (1 - Da), Sa * (1 - Da) ]
1410 		 */
1411 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1412 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE;
1413 
1414 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1415 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ZERO;
1416 
1417 		break;
1418 
1419 	case RGA_ALPHA_BLEND_DST_OUT:
1420 		/*
1421 		 * DST-OUT mode:
1422 		 *	Sf = 0 , Df = (1 - Sa)
1423 		 *	[Rc,Ra] = [ Dc * (1 - Sa), Da * (1 - Sa) ]
1424 		 */
1425 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1426 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_ZERO;
1427 
1428 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1429 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE;
1430 
1431 		break;
1432 
1433 	case RGA_ALPHA_BLEND_SRC_ATOP:
1434 		/*
1435 		 * SRC-ATOP mode:
1436 		 *	Sf = Da , Df = (1 - Sa)
1437 		 *	[Rc,Ra] = [ Sc * Da + Dc * (1 - Sa), Sa * Da + Da * (1 - Sa) ]
1438 		 */
1439 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1440 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE;
1441 
1442 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1443 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE;
1444 
1445 		break;
1446 
1447 	case RGA_ALPHA_BLEND_DST_ATOP:
1448 		/*
1449 		 * DST-ATOP mode:
1450 		 *	Sf = (1 - Da) , Df = Sa
1451 		 *	[Rc,Ra] = [ Sc * (1 - Da) + Dc * Sa, Sa * (1 - Da) + Da * Sa ]
1452 		 */
1453 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1454 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE;
1455 
1456 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1457 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE;
1458 
1459 		break;
1460 
1461 	case RGA_ALPHA_BLEND_XOR:
1462 		/*
1463 		 * DST-XOR mode:
1464 		 *	Sf = (1 - Da) , Df = (1 - Sa)
1465 		 *	[Rc,Ra] = [ Sc * (1 - Da) + Dc * (1 - Sa), Sa * (1 - Da) + Da * (1 - Sa) ]
1466 		 */
1467 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1468 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE;
1469 
1470 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1471 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE;
1472 
1473 		break;
1474 
1475 	case RGA_ALPHA_BLEND_CLEAR:
1476 		/*
1477 		 * DST-CLEAR mode:
1478 		 *	Sf = 0 , Df = 0
1479 		 *	[Rc,Ra] = [ 0, 0 ]
1480 		 */
1481 		color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT;
1482 		color_ctrl.bits.src_factor_mode = RGA_ALPHA_ZERO;
1483 
1484 		color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT;
1485 		color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ZERO;
1486 
1487 		break;
1488 
1489 	default:
1490 		break;
1491 	}
1492 
1493 	alpha_ctrl.bits.src_blend_mode = color_ctrl.bits.src_blend_mode;
1494 	alpha_ctrl.bits.dst_blend_mode = color_ctrl.bits.dst_blend_mode;
1495 
1496 	alpha_ctrl.bits.src_alpha_cal_mode = color_ctrl.bits.src_alpha_cal_mode;
1497 	alpha_ctrl.bits.dst_alpha_cal_mode = color_ctrl.bits.dst_alpha_cal_mode;
1498 
1499 	alpha_ctrl.bits.src_alpha_mode = color_ctrl.bits.src_alpha_mode;
1500 	alpha_ctrl.bits.src_factor_mode = color_ctrl.bits.src_factor_mode;
1501 
1502 	alpha_ctrl.bits.dst_alpha_mode = color_ctrl.bits.dst_alpha_mode;
1503 	alpha_ctrl.bits.dst_factor_mode = color_ctrl.bits.dst_factor_mode;
1504 
1505 	reg =
1506 		((reg & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0)) |
1507 		 (s_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0(msg->alpha_rop_flag)));
1508 	reg =
1509 		((reg & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL)) |
1510 		 (s_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL
1511 		 (msg->alpha_rop_flag >> 1)));
1512 	reg =
1513 		((reg & (~m_RGA2_ALPHA_CTRL0_SW_ROP_MODE)) |
1514 		 (s_RGA2_ALPHA_CTRL0_SW_ROP_MODE(msg->rop_mode)));
1515 	reg =
1516 		((reg & (~m_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA)) |
1517 		 (s_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA
1518 		 ((uint8_t)config->fg_global_alpha_value)));
1519 	reg =
1520 		((reg & (~m_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA)) |
1521 		 (s_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA
1522 		 ((uint8_t)config->bg_global_alpha_value)));
1523 
1524 	*bRGA_ALPHA_CTRL0 = reg;
1525 	*bRGA_ALPHA_CTRL1 = color_ctrl.value | (alpha_ctrl.value << 16);
1526 
1527 
1528 	if ((msg->alpha_rop_flag >> 2) & 1) {
1529 		*bRGA_FADING_CTRL = (1 << 24) | (msg->fading_b_value << 16) |
1530 			(msg->fading_g_value << 8) | (msg->fading_r_value);
1531 	}
1532 }
1533 
RGA2_set_reg_rop_info(u8 * base,struct rga2_req * msg)1534 static void RGA2_set_reg_rop_info(u8 *base, struct rga2_req *msg)
1535 {
1536 	u32 *bRGA_ALPHA_CTRL0;
1537 	u32 *bRGA_ROP_CTRL0;
1538 	u32 *bRGA_ROP_CTRL1;
1539 	u32 *bRGA_MASK_ADDR;
1540 	u32 *bRGA_FG_COLOR;
1541 	u32 *bRGA_PAT_CON;
1542 
1543 	u32 rop_code0 = 0;
1544 	u32 rop_code1 = 0;
1545 
1546 	bRGA_ALPHA_CTRL0 = (u32 *) (base + RGA2_ALPHA_CTRL0_OFFSET);
1547 	bRGA_ROP_CTRL0 = (u32 *) (base + RGA2_ROP_CTRL0_OFFSET);
1548 	bRGA_ROP_CTRL1 = (u32 *) (base + RGA2_ROP_CTRL1_OFFSET);
1549 	bRGA_MASK_ADDR = (u32 *) (base + RGA2_MASK_BASE_OFFSET);
1550 	bRGA_FG_COLOR = (u32 *) (base + RGA2_SRC_FG_COLOR_OFFSET);
1551 	bRGA_PAT_CON = (u32 *) (base + RGA2_PAT_CON_OFFSET);
1552 
1553 	if (msg->rop_mode == 0) {
1554 		rop_code0 = rga2_rop_code[(msg->rop_code & 0xff)];
1555 	} else if (msg->rop_mode == 1) {
1556 		rop_code0 = rga2_rop_code[(msg->rop_code & 0xff)];
1557 	} else if (msg->rop_mode == 2) {
1558 		rop_code0 = rga2_rop_code[(msg->rop_code & 0xff)];
1559 		rop_code1 = rga2_rop_code[(msg->rop_code & 0xff00) >> 8];
1560 	}
1561 
1562 	*bRGA_ROP_CTRL0 = rop_code0;
1563 	*bRGA_ROP_CTRL1 = rop_code1;
1564 	*bRGA_FG_COLOR = msg->fg_color;
1565 	*bRGA_MASK_ADDR = (u32) msg->rop_mask_addr;
1566 	*bRGA_PAT_CON = (msg->pat.act_w - 1) | ((msg->pat.act_h - 1) << 8)
1567 		| (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24);
1568 	*bRGA_ALPHA_CTRL0 =
1569 		*bRGA_ALPHA_CTRL0 | (((msg->endian_mode >> 1) & 1) << 20);
1570 
1571 }
1572 
RGA_set_reg_mosaic(u8 * base,struct rga2_req * msg)1573 static void RGA_set_reg_mosaic(u8 *base, struct rga2_req *msg)
1574 {
1575 	u32 *bRGA_MOSAIC_MODE;
1576 
1577 	bRGA_MOSAIC_MODE = (u32 *)(base + RGA2_MOSAIC_MODE_OFFSET);
1578 
1579 	*bRGA_MOSAIC_MODE = (u32)(msg->mosaic_info.mode & 0x7);
1580 }
1581 
RGA2_set_reg_osd(u8 * base,struct rga2_req * msg)1582 static void RGA2_set_reg_osd(u8 *base, struct rga2_req *msg)
1583 {
1584 	u32 *bRGA_OSD_CTRL0;
1585 	u32 *bRGA_OSD_CTRL1;
1586 	u32 *bRGA_OSD_INVERTSION_CAL0;
1587 	u32 *bRGA_OSD_INVERTSION_CAL1;
1588 	u32 *bRGA_OSD_COLOR0;
1589 	u32 *bRGA_OSD_COLOR1;
1590 	u32 *bRGA_OSD_LAST_FLAGS0;
1591 	u32 *bRGA_OSD_LAST_FLAGS1;
1592 	u32 reg;
1593 	u8 rgba2bpp_en = 0;
1594 	u8 block_num;
1595 	u16 fix_width;
1596 
1597 
1598 	bRGA_OSD_CTRL0 = (u32 *)(base + RGA2_OSD_CTRL0_OFFSET);
1599 	bRGA_OSD_CTRL1 = (u32 *)(base + RGA2_OSD_CTRL1_OFFSET);
1600 	bRGA_OSD_INVERTSION_CAL0 = (u32 *)(base + RGA2_OSD_INVERTSION_CAL0_OFFSET);
1601 	bRGA_OSD_INVERTSION_CAL1 = (u32 *)(base + RGA2_OSD_INVERTSION_CAL1_OFFSET);
1602 	bRGA_OSD_COLOR0 = (u32 *)(base + RGA2_OSD_COLOR0_OFFSET);
1603 	bRGA_OSD_COLOR1 = (u32 *)(base + RGA2_OSD_COLOR1_OFFSET);
1604 	bRGA_OSD_LAST_FLAGS0 = (u32 *)(base + RGA2_OSD_LAST_FLAGS0_OFFSET);
1605 	bRGA_OSD_LAST_FLAGS1 = (u32 *)(base + RGA2_OSD_LAST_FLAGS1_OFFSET);
1606 
1607 	/* To save the number of register bits. */
1608 	fix_width = msg->osd_info.mode_ctrl.block_fix_width / 2 - 1;
1609 
1610 	/* The register is '0' as the first. */
1611 	block_num = msg->osd_info.mode_ctrl.block_num - 1;
1612 
1613 	if (msg->src1.format == RGA_FORMAT_RGBA_2BPP)
1614 		rgba2bpp_en = 1;
1615 
1616 	reg = 0;
1617 	reg = ((reg & (~m_RGA2_OSD_CTRL0_SW_OSD_MODE)) |
1618 	       (s_RGA2_OSD_CTRL0_SW_OSD_MODE(msg->osd_info.mode_ctrl.mode)));
1619 	reg = ((reg & (~m_RGA2_OSD_CTRL0_SW_OSD_VER_MODE)) |
1620 	       (s_RGA2_OSD_CTRL0_SW_OSD_VER_MODE(msg->osd_info.mode_ctrl.direction_mode)));
1621 	reg = ((reg & (~m_RGA2_OSD_CTRL0_SW_OSD_WIDTH_MODE)) |
1622 	       (s_RGA2_OSD_CTRL0_SW_OSD_WIDTH_MODE(msg->osd_info.mode_ctrl.width_mode)));
1623 	reg = ((reg & (~m_RGA2_OSD_CTRL0_SW_OSD_BLK_NUM)) |
1624 	       (s_RGA2_OSD_CTRL0_SW_OSD_BLK_NUM(block_num)));
1625 	reg = ((reg & (~m_RGA2_OSD_CTRL0_SW_OSD_FLAGS_INDEX)) |
1626 	       (s_RGA2_OSD_CTRL0_SW_OSD_FLAGS_INDEX(msg->osd_info.mode_ctrl.flags_index)));
1627 	reg = ((reg & (~m_RGA2_OSD_CTRL0_SW_OSD_FIX_WIDTH)) |
1628 	       (s_RGA2_OSD_CTRL0_SW_OSD_FIX_WIDTH(fix_width)));
1629 	reg = ((reg & (~m_RGA2_OSD_CTRL0_SW_OSD_2BPP_MODE)) |
1630 	       (s_RGA2_OSD_CTRL0_SW_OSD_2BPP_MODE(rgba2bpp_en)));
1631 	*bRGA_OSD_CTRL0 = reg;
1632 
1633 	reg = 0;
1634 	reg = ((reg & (~m_RGA2_OSD_CTRL1_SW_OSD_COLOR_SEL)) |
1635 	       (s_RGA2_OSD_CTRL1_SW_OSD_COLOR_SEL(msg->osd_info.mode_ctrl.color_mode)));
1636 	reg = ((reg & (~m_RGA2_OSD_CTRL1_SW_OSD_FLAG_SEL)) |
1637 	       (s_RGA2_OSD_CTRL1_SW_OSD_FLAG_SEL(msg->osd_info.mode_ctrl.invert_flags_mode)));
1638 	reg = ((reg & (~m_RGA2_OSD_CTRL1_SW_OSD_DEFAULT_COLOR)) |
1639 	       (s_RGA2_OSD_CTRL1_SW_OSD_DEFAULT_COLOR(msg->osd_info.mode_ctrl.default_color_sel)));
1640 	reg = ((reg & (~m_RGA2_OSD_CTRL1_SW_OSD_AUTO_INVERST_MODE)) |
1641 	       (s_RGA2_OSD_CTRL1_SW_OSD_AUTO_INVERST_MODE(msg->osd_info.mode_ctrl.invert_mode)));
1642 	reg = ((reg & (~m_RGA2_OSD_CTRL1_SW_OSD_THRESH)) |
1643 	       (s_RGA2_OSD_CTRL1_SW_OSD_THRESH(msg->osd_info.mode_ctrl.invert_thresh)));
1644 	reg = ((reg & (~m_RGA2_OSD_CTRL1_SW_OSD_INVERT_A_EN)) |
1645 	       (s_RGA2_OSD_CTRL1_SW_OSD_INVERT_A_EN(msg->osd_info.mode_ctrl.invert_enable)));
1646 	reg = ((reg & (~m_RGA2_OSD_CTRL1_SW_OSD_INVERT_Y_DIS)) |
1647 	       (s_RGA2_OSD_CTRL1_SW_OSD_INVERT_Y_DIS(msg->osd_info.mode_ctrl.invert_enable >> 1)));
1648 	reg = ((reg & (~m_RGA2_OSD_CTRL1_SW_OSD_INVERT_C_DIS)) |
1649 	       (s_RGA2_OSD_CTRL1_SW_OSD_INVERT_C_DIS(msg->osd_info.mode_ctrl.invert_enable >> 2)));
1650 	reg = ((reg & (~m_RGA2_OSD_CTRL1_SW_OSD_UNFIX_INDEX)) |
1651 	       (s_RGA2_OSD_CTRL1_SW_OSD_UNFIX_INDEX(msg->osd_info.mode_ctrl.unfix_index)));
1652 	*bRGA_OSD_CTRL1 = reg;
1653 
1654 	*bRGA_OSD_INVERTSION_CAL0 = ((msg->osd_info.cal_factor.crb_max) << 24) |
1655 				    ((msg->osd_info.cal_factor.crb_min) << 16) |
1656 				    ((msg->osd_info.cal_factor.yg_max) << 8) |
1657 				    ((msg->osd_info.cal_factor.yg_min) << 0);
1658 	*bRGA_OSD_INVERTSION_CAL1 = ((msg->osd_info.cal_factor.alpha_max) << 8) |
1659 				    ((msg->osd_info.cal_factor.alpha_min) << 0);
1660 
1661 	*bRGA_OSD_LAST_FLAGS0 = (msg->osd_info.last_flags0);
1662 	*bRGA_OSD_LAST_FLAGS1 = (msg->osd_info.last_flags1);
1663 
1664 	if (msg->osd_info.mode_ctrl.color_mode == 1) {
1665 		*bRGA_OSD_COLOR0 = (msg->osd_info.bpp2_info.color0.value & 0xffffff);
1666 		*bRGA_OSD_COLOR1 = (msg->osd_info.bpp2_info.color1.value & 0xffffff);
1667 	}
1668 
1669 	if (rgba2bpp_en) {
1670 		*bRGA_OSD_COLOR0 = msg->osd_info.bpp2_info.color0.value;
1671 		*bRGA_OSD_COLOR1 = msg->osd_info.bpp2_info.color1.value;
1672 	}
1673 }
1674 
RGA2_set_reg_color_palette(u8 * base,struct rga2_req * msg)1675 static void RGA2_set_reg_color_palette(u8 *base, struct rga2_req *msg)
1676 {
1677 	u32 *bRGA_SRC_BASE0, *bRGA_SRC_INFO, *bRGA_SRC_VIR_INFO,
1678 		*bRGA_SRC_ACT_INFO, *bRGA_SRC_FG_COLOR, *bRGA_SRC_BG_COLOR;
1679 	u32 *p;
1680 	short x_off, y_off;
1681 	u16 src_stride;
1682 	u8 shift;
1683 	u32 sw;
1684 	u32 byte_num;
1685 	u32 reg;
1686 
1687 	bRGA_SRC_BASE0 = (u32 *) (base + RGA2_SRC_BASE0_OFFSET);
1688 	bRGA_SRC_INFO = (u32 *) (base + RGA2_SRC_INFO_OFFSET);
1689 	bRGA_SRC_VIR_INFO = (u32 *) (base + RGA2_SRC_VIR_INFO_OFFSET);
1690 	bRGA_SRC_ACT_INFO = (u32 *) (base + RGA2_SRC_ACT_INFO_OFFSET);
1691 	bRGA_SRC_FG_COLOR = (u32 *) (base + RGA2_SRC_FG_COLOR_OFFSET);
1692 	bRGA_SRC_BG_COLOR = (u32 *) (base + RGA2_SRC_BG_COLOR_OFFSET);
1693 
1694 	reg = 0;
1695 
1696 	shift = 3 - msg->palette_mode;
1697 
1698 	x_off = msg->src.x_offset;
1699 	y_off = msg->src.y_offset;
1700 
1701 	sw = msg->src.vir_w;
1702 	byte_num = sw >> shift;
1703 
1704 	src_stride = (byte_num + 3) & (~3);
1705 
1706 	p = (u32 *) ((unsigned long)msg->src.yrgb_addr);
1707 
1708 	p = p + (x_off >> shift) + y_off * src_stride;
1709 
1710 	*bRGA_SRC_BASE0 = (unsigned long)p;
1711 
1712 	reg =
1713 		((reg & (~m_RGA2_SRC_INFO_SW_SRC_FMT)) |
1714 		 (s_RGA2_SRC_INFO_SW_SRC_FMT((msg->palette_mode | 0xc))));
1715 	reg =
1716 		((reg & (~m_RGA2_SRC_INFO_SW_SW_CP_ENDIAN)) |
1717 		 (s_RGA2_SRC_INFO_SW_SW_CP_ENDAIN(msg->endian_mode & 1)));
1718 	*bRGA_SRC_VIR_INFO = src_stride >> 2;
1719 	*bRGA_SRC_ACT_INFO =
1720 		(msg->src.act_w - 1) | ((msg->src.act_h - 1) << 16);
1721 	*bRGA_SRC_INFO = reg;
1722 
1723 	*bRGA_SRC_FG_COLOR = msg->fg_color;
1724 	*bRGA_SRC_BG_COLOR = msg->bg_color;
1725 
1726 }
1727 
RGA2_set_reg_color_fill(u8 * base,struct rga2_req * msg)1728 static void RGA2_set_reg_color_fill(u8 *base, struct rga2_req *msg)
1729 {
1730 	u32 *bRGA_CF_GR_A;
1731 	u32 *bRGA_CF_GR_B;
1732 	u32 *bRGA_CF_GR_G;
1733 	u32 *bRGA_CF_GR_R;
1734 	u32 *bRGA_SRC_FG_COLOR;
1735 	u32 *bRGA_MASK_ADDR;
1736 	u32 *bRGA_PAT_CON;
1737 
1738 	u32 mask_stride;
1739 	u32 *bRGA_SRC_VIR_INFO;
1740 
1741 	bRGA_SRC_FG_COLOR = (u32 *) (base + RGA2_SRC_FG_COLOR_OFFSET);
1742 
1743 	bRGA_CF_GR_A = (u32 *) (base + RGA2_CF_GR_A_OFFSET);
1744 	bRGA_CF_GR_B = (u32 *) (base + RGA2_CF_GR_B_OFFSET);
1745 	bRGA_CF_GR_G = (u32 *) (base + RGA2_CF_GR_G_OFFSET);
1746 	bRGA_CF_GR_R = (u32 *) (base + RGA2_CF_GR_R_OFFSET);
1747 
1748 	bRGA_MASK_ADDR = (u32 *) (base + RGA2_MASK_BASE_OFFSET);
1749 	bRGA_PAT_CON = (u32 *) (base + RGA2_PAT_CON_OFFSET);
1750 
1751 	bRGA_SRC_VIR_INFO = (u32 *) (base + RGA2_SRC_VIR_INFO_OFFSET);
1752 
1753 	mask_stride = msg->rop_mask_stride;
1754 
1755 	if (msg->color_fill_mode == 0) {
1756 		/* solid color */
1757 		*bRGA_CF_GR_A = (msg->gr_color.gr_x_a & 0xffff) |
1758 			(msg->gr_color.gr_y_a << 16);
1759 		*bRGA_CF_GR_B = (msg->gr_color.gr_x_b & 0xffff) |
1760 			(msg->gr_color.gr_y_b << 16);
1761 		*bRGA_CF_GR_G = (msg->gr_color.gr_x_g & 0xffff) |
1762 			(msg->gr_color.gr_y_g << 16);
1763 		*bRGA_CF_GR_R = (msg->gr_color.gr_x_r & 0xffff) |
1764 			(msg->gr_color.gr_y_r << 16);
1765 
1766 		*bRGA_SRC_FG_COLOR = msg->fg_color;
1767 	} else {
1768 		/* pattern color */
1769 		*bRGA_MASK_ADDR = (u32) msg->pat.yrgb_addr;
1770 		*bRGA_PAT_CON =
1771 			(msg->pat.act_w - 1) | ((msg->pat.act_h - 1) << 8)
1772 			| (msg->pat.x_offset << 16) | (msg->pat.y_offset << 24);
1773 	}
1774 	*bRGA_SRC_VIR_INFO = mask_stride << 16;
1775 }
1776 
RGA2_set_reg_update_palette_table(u8 * base,struct rga2_req * msg)1777 static void RGA2_set_reg_update_palette_table(u8 *base,
1778 						 struct rga2_req *msg)
1779 {
1780 	u32 *bRGA_MASK_BASE;
1781 	u32 *bRGA_FADING_CTRL;
1782 
1783 	bRGA_MASK_BASE = (u32 *) (base + RGA2_MASK_BASE_OFFSET);
1784 	bRGA_FADING_CTRL = (u32 *) (base + RGA2_FADING_CTRL_OFFSET);
1785 
1786 	*bRGA_FADING_CTRL = msg->fading_g_value << 8;
1787 	*bRGA_MASK_BASE = (u32) msg->pat.yrgb_addr;
1788 }
1789 
RGA2_set_reg_update_patten_buff(u8 * base,struct rga2_req * msg)1790 static void RGA2_set_reg_update_patten_buff(u8 *base, struct rga2_req *msg)
1791 {
1792 	u32 *bRGA_PAT_MST;
1793 	u32 *bRGA_PAT_CON;
1794 	u32 *bRGA_PAT_START_POINT;
1795 	u32 *bRGA_FADING_CTRL;
1796 	u32 reg = 0;
1797 	struct rga_img_info_t *pat;
1798 
1799 	u32 num, offset;
1800 
1801 	pat = &msg->pat;
1802 
1803 	num = (pat->act_w * pat->act_h) - 1;
1804 
1805 	offset = pat->act_w * pat->y_offset + pat->x_offset;
1806 
1807 	bRGA_PAT_START_POINT = (u32 *) (base + RGA2_FADING_CTRL_OFFSET);
1808 	bRGA_PAT_MST = (u32 *) (base + RGA2_MASK_BASE_OFFSET);
1809 	bRGA_PAT_CON = (u32 *) (base + RGA2_PAT_CON_OFFSET);
1810 	bRGA_FADING_CTRL = (u32 *) (base + RGA2_FADING_CTRL_OFFSET);
1811 
1812 	*bRGA_PAT_MST = (u32) msg->pat.yrgb_addr;
1813 	*bRGA_PAT_START_POINT = (pat->act_w * pat->y_offset) + pat->x_offset;
1814 
1815 	reg = (pat->act_w - 1) | ((pat->act_h - 1) << 8) |
1816 		(pat->x_offset << 16) | (pat->y_offset << 24);
1817 	*bRGA_PAT_CON = reg;
1818 
1819 	*bRGA_FADING_CTRL = (num << 8) | offset;
1820 }
1821 
RGA2_set_pat_info(u8 * base,struct rga2_req * msg)1822 static void RGA2_set_pat_info(u8 *base, struct rga2_req *msg)
1823 {
1824 	u32 *bRGA_PAT_CON;
1825 	u32 *bRGA_FADING_CTRL;
1826 	u32 reg = 0;
1827 	struct rga_img_info_t *pat;
1828 
1829 	u32 num, offset;
1830 
1831 	pat = &msg->pat;
1832 
1833 	num = ((pat->act_w * pat->act_h) - 1) & 0xff;
1834 
1835 	offset = (pat->act_w * pat->y_offset) + pat->x_offset;
1836 
1837 	bRGA_PAT_CON = (u32 *) (base + RGA2_PAT_CON_OFFSET);
1838 	bRGA_FADING_CTRL = (u32 *) (base + RGA2_FADING_CTRL_OFFSET);
1839 
1840 	reg = (pat->act_w - 1) | ((pat->act_h - 1) << 8) |
1841 		(pat->x_offset << 16) | (pat->y_offset << 24);
1842 	*bRGA_PAT_CON = reg;
1843 	*bRGA_FADING_CTRL = (num << 8) | offset;
1844 }
1845 
RGA2_set_mmu_reg_info(u8 * base,struct rga2_req * msg)1846 static void RGA2_set_mmu_reg_info(u8 *base, struct rga2_req *msg)
1847 {
1848 	u32 *bRGA_MMU_CTRL1;
1849 	u32 *bRGA_MMU_SRC_BASE;
1850 	u32 *bRGA_MMU_SRC1_BASE;
1851 	u32 *bRGA_MMU_DST_BASE;
1852 	u32 *bRGA_MMU_ELS_BASE;
1853 
1854 	u32 reg;
1855 
1856 	bRGA_MMU_CTRL1 = (u32 *) (base + RGA2_MMU_CTRL1_OFFSET);
1857 	bRGA_MMU_SRC_BASE = (u32 *) (base + RGA2_MMU_SRC_BASE_OFFSET);
1858 	bRGA_MMU_SRC1_BASE = (u32 *) (base + RGA2_MMU_SRC1_BASE_OFFSET);
1859 	bRGA_MMU_DST_BASE = (u32 *) (base + RGA2_MMU_DST_BASE_OFFSET);
1860 	bRGA_MMU_ELS_BASE = (u32 *) (base + RGA2_MMU_ELS_BASE_OFFSET);
1861 
1862 	reg = (msg->mmu_info.src0_mmu_flag & 0xf) |
1863 		((msg->mmu_info.src1_mmu_flag & 0xf) << 4) |
1864 		((msg->mmu_info.dst_mmu_flag & 0xf) << 8) |
1865 		((msg->mmu_info.els_mmu_flag & 0x3) << 12);
1866 
1867 	*bRGA_MMU_CTRL1 = reg;
1868 	*bRGA_MMU_SRC_BASE = (u32) (msg->mmu_info.src0_base_addr) >> 4;
1869 	*bRGA_MMU_SRC1_BASE = (u32) (msg->mmu_info.src1_base_addr) >> 4;
1870 	*bRGA_MMU_DST_BASE = (u32) (msg->mmu_info.dst_base_addr) >> 4;
1871 	*bRGA_MMU_ELS_BASE = (u32) (msg->mmu_info.els_base_addr) >> 4;
1872 }
1873 
rga2_gen_reg_info(u8 * base,struct rga2_req * msg)1874 static int rga2_gen_reg_info(u8 *base, struct rga2_req *msg)
1875 {
1876 	u8 dst_nn_quantize_en = 0;
1877 
1878 	RGA2_set_mode_ctrl(base, msg);
1879 
1880 	RGA2_set_pat_info(base, msg);
1881 
1882 	switch (msg->render_mode) {
1883 	case BITBLT_MODE:
1884 		RGA2_set_reg_src_info(base, msg);
1885 		RGA2_set_reg_dst_info(base, msg);
1886 		dst_nn_quantize_en = (msg->alpha_rop_flag >> 8) & 0x1;
1887 		if (dst_nn_quantize_en != 1) {
1888 			if ((msg->dst.format !=
1889 				RGA_FORMAT_Y4)) {
1890 				RGA2_set_reg_alpha_info(base, msg);
1891 				RGA2_set_reg_rop_info(base, msg);
1892 			}
1893 		}
1894 		if (msg->mosaic_info.enable)
1895 			RGA_set_reg_mosaic(base, msg);
1896 		if (msg->osd_info.enable)
1897 			RGA2_set_reg_osd(base, msg);
1898 
1899 		break;
1900 	case COLOR_FILL_MODE:
1901 		RGA2_set_reg_color_fill(base, msg);
1902 		RGA2_set_reg_dst_info(base, msg);
1903 		RGA2_set_reg_alpha_info(base, msg);
1904 		break;
1905 	case COLOR_PALETTE_MODE:
1906 		RGA2_set_reg_color_palette(base, msg);
1907 		RGA2_set_reg_dst_info(base, msg);
1908 		break;
1909 	case UPDATE_PALETTE_TABLE_MODE:
1910 		RGA2_set_reg_update_palette_table(base, msg);
1911 		break;
1912 	case UPDATE_PATTEN_BUF_MODE:
1913 		RGA2_set_reg_update_patten_buff(base, msg);
1914 		break;
1915 	default:
1916 		pr_err("ERROR msg render mode %d\n", msg->render_mode);
1917 		break;
1918 	}
1919 
1920 	RGA2_set_mmu_reg_info(base, msg);
1921 
1922 	return 0;
1923 }
1924 
rga_cmd_to_rga2_cmd(struct rga_scheduler_t * scheduler,struct rga_req * req_rga,struct rga2_req * req)1925 static void rga_cmd_to_rga2_cmd(struct rga_scheduler_t *scheduler,
1926 				struct rga_req *req_rga, struct rga2_req *req)
1927 {
1928 	if (req_rga->render_mode == 6)
1929 		req->render_mode = UPDATE_PALETTE_TABLE_MODE;
1930 	else if (req_rga->render_mode == 7)
1931 		req->render_mode = UPDATE_PATTEN_BUF_MODE;
1932 	else if (req_rga->render_mode == 5)
1933 		req->render_mode = BITBLT_MODE;
1934 	else
1935 		req->render_mode = req_rga->render_mode;
1936 
1937 	memcpy(&req->src, &req_rga->src, sizeof(req_rga->src));
1938 	memcpy(&req->dst, &req_rga->dst, sizeof(req_rga->dst));
1939 	/* The application will only import pat or src1. */
1940 	if (req->render_mode == UPDATE_PALETTE_TABLE_MODE)
1941 		memcpy(&req->pat, &req_rga->pat, sizeof(req_rga->pat));
1942 	else
1943 		memcpy(&req->src1, &req_rga->pat, sizeof(req_rga->pat));
1944 
1945 	req->src.format = req_rga->src.format;
1946 	req->dst.format = req_rga->dst.format;
1947 	req->src1.format = req_rga->pat.format;
1948 
1949 	switch (req_rga->rotate_mode & 0x0F) {
1950 	case 1:
1951 		if (req_rga->sina == 0 && req_rga->cosa == 65536) {
1952 			/* rotate 0 */
1953 			req->rotate_mode = 0;
1954 		} else if (req_rga->sina == 65536 && req_rga->cosa == 0) {
1955 			/* rotate 90 */
1956 			req->rotate_mode = 1;
1957 			req->dst.x_offset = req_rga->dst.x_offset;
1958 			req->dst.act_w = req_rga->dst.act_h;
1959 			req->dst.act_h = req_rga->dst.act_w;
1960 		} else if (req_rga->sina == 0 && req_rga->cosa == -65536) {
1961 			/* rotate 180 */
1962 			req->rotate_mode = 2;
1963 			req->dst.x_offset = req_rga->dst.x_offset;
1964 			req->dst.y_offset = req_rga->dst.y_offset;
1965 		} else if (req_rga->sina == -65536 && req_rga->cosa == 0) {
1966 			/* totate 270 */
1967 			req->rotate_mode = 3;
1968 			req->dst.y_offset = req_rga->dst.y_offset;
1969 			req->dst.act_w = req_rga->dst.act_h;
1970 			req->dst.act_h = req_rga->dst.act_w;
1971 		}
1972 		break;
1973 	case 2:
1974 		//x_mirror
1975 		req->rotate_mode |= (1 << 4);
1976 		break;
1977 	case 3:
1978 		//y_mirror
1979 		req->rotate_mode |= (2 << 4);
1980 		break;
1981 	case 4:
1982 		//x_mirror+y_mirror
1983 		req->rotate_mode |= (3 << 4);
1984 		break;
1985 	default:
1986 		req->rotate_mode = 0;
1987 		break;
1988 	}
1989 
1990 	switch ((req_rga->rotate_mode & 0xF0) >> 4) {
1991 	case 2:
1992 		//x_mirror
1993 		req->rotate_mode |= (1 << 4);
1994 		break;
1995 	case 3:
1996 		//y_mirror
1997 		req->rotate_mode |= (2 << 4);
1998 		break;
1999 	case 4:
2000 		//x_mirror+y_mirror
2001 		req->rotate_mode |= (3 << 4);
2002 		break;
2003 	}
2004 
2005 	req->LUT_addr = req_rga->LUT_addr;
2006 	req->rop_mask_addr = req_rga->rop_mask_addr;
2007 
2008 	req->bitblt_mode = req_rga->bsfilter_flag;
2009 
2010 	req->src_a_global_val = req_rga->alpha_global_value;
2011 	req->dst_a_global_val = req_rga->alpha_global_value;
2012 	req->rop_code = req_rga->rop_code;
2013 	req->rop_mode = req_rga->alpha_rop_mode;
2014 
2015 	req->color_fill_mode = req_rga->color_fill_mode;
2016 	req->alpha_zero_key = req_rga->alpha_rop_mode >> 4;
2017 	req->src_trans_mode = req_rga->src_trans_mode;
2018 	req->color_key_min = req_rga->color_key_min;
2019 	req->color_key_max = req_rga->color_key_max;
2020 
2021 	req->fg_color = req_rga->fg_color;
2022 	req->bg_color = req_rga->bg_color;
2023 	memcpy(&req->gr_color, &req_rga->gr_color, sizeof(req_rga->gr_color));
2024 
2025 	req->palette_mode = req_rga->palette_mode;
2026 	req->yuv2rgb_mode = req_rga->yuv2rgb_mode;
2027 	req->endian_mode = req_rga->endian_mode;
2028 	req->rgb2yuv_mode = 0;
2029 
2030 	req->fading_alpha_value = 0;
2031 	req->fading_r_value = req_rga->fading.r;
2032 	req->fading_g_value = req_rga->fading.g;
2033 	req->fading_b_value = req_rga->fading.b;
2034 
2035 	/* alpha mode set */
2036 	req->alpha_rop_flag = 0;
2037 	/* alpha_rop_enable */
2038 	req->alpha_rop_flag |= (((req_rga->alpha_rop_flag & 1)));
2039 	/* rop_enable */
2040 	req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 1) & 1) << 1);
2041 	/* fading_enable */
2042 	req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 2) & 1) << 2);
2043 	/* alpha_cal_mode_sel */
2044 	req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 4) & 1) << 3);
2045 	/* dst_dither_down */
2046 	req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 5) & 1) << 6);
2047 	/* gradient fill mode sel */
2048 	req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 6) & 1) << 7);
2049 	/* RGA_NN_QUANTIZE */
2050 	req->alpha_rop_flag |= (((req_rga->alpha_rop_flag >> 8) & 1) << 8);
2051 	req->dither_mode = req_rga->dither_mode;
2052 
2053 	/* RGA2 1106 add */
2054 	memcpy(&req->mosaic_info, &req_rga->mosaic_info, sizeof(req_rga->mosaic_info));
2055 
2056 	if ((scheduler->data->feature & RGA_YIN_YOUT) &&
2057 	    rga_is_only_y_format(req->src.format) &&
2058 	    rga_is_only_y_format(req->dst.format))
2059 		req->yin_yout_en = true;
2060 
2061 	req->uvhds_mode = req_rga->uvhds_mode;
2062 	req->uvvds_mode = req_rga->uvvds_mode;
2063 
2064 	memcpy(&req->osd_info, &req_rga->osd_info, sizeof(req_rga->osd_info));
2065 
2066 	if (((req_rga->alpha_rop_flag) & 1)) {
2067 		if ((req_rga->alpha_rop_flag >> 3) & 1) {
2068 			req->alpha_config.enable = true;
2069 
2070 			if ((req_rga->alpha_rop_flag >> 9) & 1) {
2071 				req->alpha_config.fg_pre_multiplied = false;
2072 				req->alpha_config.bg_pre_multiplied = false;
2073 			} else if (req->osd_info.enable) {
2074 				req->alpha_config.fg_pre_multiplied = true;
2075 				/* set dst(osd_block) real color mode */
2076 				req->alpha_config.bg_pre_multiplied = false;
2077 			} else {
2078 				req->alpha_config.fg_pre_multiplied = true;
2079 				req->alpha_config.bg_pre_multiplied = true;
2080 			}
2081 
2082 			req->alpha_config.fg_pixel_alpha_en = rga_is_alpha_format(req->src.format);
2083 			if (req->bitblt_mode)
2084 				req->alpha_config.bg_pixel_alpha_en =
2085 					rga_is_alpha_format(req->src1.format);
2086 			else
2087 				req->alpha_config.bg_pixel_alpha_en =
2088 					rga_is_alpha_format(req->dst.format);
2089 
2090 			req->alpha_config.fg_global_alpha_en = false;
2091 			req->alpha_config.bg_global_alpha_en = false;
2092 
2093 			req->alpha_config.fg_global_alpha_value = req_rga->alpha_global_value;
2094 			req->alpha_config.bg_global_alpha_value = req_rga->alpha_global_value;
2095 
2096 			/* porter duff alpha enable */
2097 			switch (req_rga->PD_mode) {
2098 			/* dst = 0 */
2099 			case 0:
2100 				break;
2101 			case 1:
2102 				req->alpha_config.mode = RGA_ALPHA_BLEND_SRC;
2103 				break;
2104 			case 2:
2105 				req->alpha_config.mode = RGA_ALPHA_BLEND_DST;
2106 				break;
2107 			case 3:
2108 				if ((req_rga->alpha_rop_mode & 3) == 0) {
2109 					/* both use globalAlpha. */
2110 					req->alpha_config.fg_global_alpha_en = true;
2111 					req->alpha_config.bg_global_alpha_en = true;
2112 				} else if ((req_rga->alpha_rop_mode & 3) == 1) {
2113 					/* Do not use globalAlpha. */
2114 					req->alpha_config.fg_global_alpha_en = false;
2115 					req->alpha_config.bg_global_alpha_en = false;
2116 				} else {
2117 					/* dst use globalAlpha */
2118 					req->alpha_config.fg_global_alpha_en = false;
2119 					req->alpha_config.bg_global_alpha_en = true;
2120 				}
2121 
2122 				req->alpha_config.mode = RGA_ALPHA_BLEND_SRC_OVER;
2123 				break;
2124 			case 4:
2125 				req->alpha_config.mode = RGA_ALPHA_BLEND_DST_OVER;
2126 				break;
2127 			case 5:
2128 				req->alpha_config.mode = RGA_ALPHA_BLEND_SRC_IN;
2129 				break;
2130 			case 6:
2131 				req->alpha_config.mode = RGA_ALPHA_BLEND_DST_IN;
2132 				break;
2133 			case 7:
2134 				req->alpha_config.mode = RGA_ALPHA_BLEND_SRC_OUT;
2135 				break;
2136 			case 8:
2137 				req->alpha_config.mode = RGA_ALPHA_BLEND_DST_OUT;
2138 				break;
2139 			case 9:
2140 				req->alpha_config.mode = RGA_ALPHA_BLEND_SRC_ATOP;
2141 				break;
2142 			case 10:
2143 				req->alpha_config.mode = RGA_ALPHA_BLEND_DST_ATOP;
2144 				break;
2145 			case 11:
2146 				req->alpha_config.mode = RGA_ALPHA_BLEND_XOR;
2147 				break;
2148 			case 12:
2149 				req->alpha_config.mode = RGA_ALPHA_BLEND_CLEAR;
2150 				break;
2151 			default:
2152 				break;
2153 			}
2154 		}
2155 	}
2156 
2157 	if (req_rga->mmu_info.mmu_en && (req_rga->mmu_info.mmu_flag & 1) == 1) {
2158 		req->mmu_info.src0_mmu_flag = 1;
2159 		req->mmu_info.dst_mmu_flag = 1;
2160 
2161 		if (req_rga->mmu_info.mmu_flag >> 31) {
2162 			req->mmu_info.src0_mmu_flag =
2163 				((req_rga->mmu_info.mmu_flag >> 8) & 1);
2164 			req->mmu_info.src1_mmu_flag =
2165 				((req_rga->mmu_info.mmu_flag >> 9) & 1);
2166 			req->mmu_info.dst_mmu_flag =
2167 				((req_rga->mmu_info.mmu_flag >> 10) & 1);
2168 			req->mmu_info.els_mmu_flag =
2169 				((req_rga->mmu_info.mmu_flag >> 11) & 1);
2170 		} else {
2171 			if (req_rga->src.yrgb_addr >= 0xa0000000) {
2172 				req->mmu_info.src0_mmu_flag = 0;
2173 				req->src.yrgb_addr =
2174 					req_rga->src.yrgb_addr - 0x60000000;
2175 				req->src.uv_addr =
2176 					req_rga->src.uv_addr - 0x60000000;
2177 				req->src.v_addr =
2178 					req_rga->src.v_addr - 0x60000000;
2179 			}
2180 
2181 			if (req_rga->dst.yrgb_addr >= 0xa0000000) {
2182 				req->mmu_info.dst_mmu_flag = 0;
2183 				req->dst.yrgb_addr =
2184 					req_rga->dst.yrgb_addr - 0x60000000;
2185 			}
2186 
2187 			if (req_rga->pat.yrgb_addr >= 0xa0000000) {
2188 				req->mmu_info.src1_mmu_flag = 0;
2189 				req->src1.yrgb_addr =
2190 					req_rga->pat.yrgb_addr - 0x60000000;
2191 			}
2192 		}
2193 	}
2194 }
2195 
rga2_soft_reset(struct rga_scheduler_t * scheduler)2196 static void rga2_soft_reset(struct rga_scheduler_t *scheduler)
2197 {
2198 	u32 i;
2199 	u32 reg;
2200 	u32 iommu_dte_addr = 0;
2201 
2202 	if (scheduler->data->mmu == RGA_IOMMU)
2203 		iommu_dte_addr = rga_read(RGA_IOMMU_DTE_ADDR, scheduler);
2204 
2205 	rga_write(m_RGA2_SYS_CTRL_ACLK_SRESET_P | m_RGA2_SYS_CTRL_CCLK_SRESET_P |
2206 		  m_RGA2_SYS_CTRL_RST_PROTECT_P,
2207 		  RGA2_SYS_CTRL, scheduler);
2208 
2209 	for (i = 0; i < RGA_RESET_TIMEOUT; i++) {
2210 		/* RGA_SYS_CTRL */
2211 		reg = rga_read(RGA2_SYS_CTRL, scheduler) & 1;
2212 
2213 		if (reg == 0)
2214 			break;
2215 
2216 		udelay(1);
2217 	}
2218 
2219 	if (scheduler->data->mmu == RGA_IOMMU) {
2220 		rga_write(iommu_dte_addr, RGA_IOMMU_DTE_ADDR, scheduler);
2221 		/* enable iommu */
2222 		rga_write(RGA_IOMMU_CMD_ENABLE_PAGING, RGA_IOMMU_COMMAND, scheduler);
2223 	}
2224 
2225 	if (i == RGA_RESET_TIMEOUT)
2226 		pr_err("RAG2 core[%d] soft reset timeout.\n", scheduler->core);
2227 	else
2228 		pr_info("RGA2 core[%d] soft reset complete.\n", scheduler->core);
2229 
2230 }
2231 
rga2_check_param(const struct rga_hw_data * data,const struct rga2_req * req)2232 static int rga2_check_param(const struct rga_hw_data *data, const struct rga2_req *req)
2233 {
2234 	if (!((req->render_mode == COLOR_FILL_MODE))) {
2235 		if (unlikely(rga_hw_out_of_range(&data->input_range,
2236 						 req->src.act_w, req->src.act_h))) {
2237 			pr_err("invalid src resolution act_w = %d, act_h = %d\n",
2238 				 req->src.act_w, req->src.act_h);
2239 			return -EINVAL;
2240 		}
2241 
2242 		if (unlikely(req->src.vir_w * rga_get_pixel_stride_from_format(req->src.format) >
2243 			     data->max_byte_stride * 8)) {
2244 			pr_err("invalid src stride, stride = %d, max_byte_stride = %d\n",
2245 			       req->src.vir_w, data->max_byte_stride);
2246 			return -EINVAL;
2247 		}
2248 
2249 		if (unlikely(req->src.vir_w < req->src.act_w)) {
2250 			pr_err("invalid src_vir_w act_w = %d, vir_w = %d\n",
2251 			       req->src.act_w, req->src.vir_w);
2252 			return -EINVAL;
2253 		}
2254 	}
2255 
2256 	if (unlikely(rga_hw_out_of_range(&data->output_range, req->dst.act_w, req->dst.act_h))) {
2257 		pr_err("invalid dst resolution act_w = %d, act_h = %d\n",
2258 		       req->dst.act_w, req->dst.act_h);
2259 		return -EINVAL;
2260 	}
2261 
2262 	if (unlikely(req->dst.vir_w * rga_get_pixel_stride_from_format(req->dst.format) >
2263 		     data->max_byte_stride * 8)) {
2264 		pr_err("invalid dst stride, stride = %d, max_byte_stride = %d\n",
2265 		       req->dst.vir_w, data->max_byte_stride);
2266 		return -EINVAL;
2267 	}
2268 
2269 	if (unlikely(req->dst.vir_w < req->dst.act_w)) {
2270 		if (req->rotate_mode != 1) {
2271 			pr_err("invalid dst_vir_w act_h = %d, vir_h = %d\n",
2272 			       req->dst.act_w, req->dst.vir_w);
2273 			return -EINVAL;
2274 		}
2275 	}
2276 
2277 	return 0;
2278 }
2279 
rga2_align_check(struct rga2_req * req)2280 static int rga2_align_check(struct rga2_req *req)
2281 {
2282 	if (rga_is_yuv10bit_format(req->src.format))
2283 		if ((req->src.vir_w % 16) || (req->src.x_offset % 2) ||
2284 			(req->src.act_w % 2) || (req->src.y_offset % 2) ||
2285 			(req->src.act_h % 2) || (req->src.vir_h % 2))
2286 			pr_info("err src wstride, 10bit yuv\n");
2287 	if (rga_is_yuv10bit_format(req->dst.format))
2288 		if ((req->dst.vir_w % 16) || (req->dst.x_offset % 2) ||
2289 			(req->dst.act_w % 2) || (req->dst.y_offset % 2) ||
2290 			(req->dst.act_h % 2) || (req->dst.vir_h % 2))
2291 			pr_info("err dst wstride, 10bit yuv\n");
2292 	if (rga_is_yuv8bit_format(req->src.format))
2293 		if ((req->src.vir_w % 4) || (req->src.x_offset % 2) ||
2294 			(req->src.act_w % 2) || (req->src.y_offset % 2) ||
2295 			(req->src.act_h % 2) || (req->src.vir_h % 2))
2296 			pr_info("err src wstride, 8bit yuv\n");
2297 	if (rga_is_yuv8bit_format(req->dst.format))
2298 		if ((req->dst.vir_w % 4) || (req->dst.x_offset % 2) ||
2299 			(req->dst.act_w % 2) || (req->dst.y_offset % 2) ||
2300 			(req->dst.act_h % 2) || (req->dst.vir_h % 2))
2301 			pr_info("err dst wstride, 8bit yuv\n");
2302 
2303 	return 0;
2304 }
2305 
print_debug_info(struct rga2_req * req)2306 static void print_debug_info(struct rga2_req *req)
2307 {
2308 	pr_info("render_mode:%s,bitblit_mode=%d,rotate_mode:%s\n",
2309 		rga_get_render_mode_str(req->render_mode), req->bitblt_mode,
2310 		rga_get_rotate_mode_str(req->rotate_mode));
2311 
2312 	pr_info("src: y=%lx uv=%lx v=%lx aw=%d ah=%d vw=%d vh=%d\n",
2313 		 (unsigned long)req->src.yrgb_addr,
2314 		 (unsigned long)req->src.uv_addr,
2315 		 (unsigned long)req->src.v_addr,
2316 		 req->src.act_w, req->src.act_h,
2317 		 req->src.vir_w, req->src.vir_h);
2318 	pr_info("src: xoff=%d yoff=%d format=%s\n",
2319 		req->src.x_offset, req->src.y_offset,
2320 		 rga_get_format_name(req->src.format));
2321 
2322 	if (req->src1.yrgb_addr != 0 || req->src1.uv_addr != 0
2323 		|| req->src1.v_addr != 0) {
2324 		pr_info("src1: y=%lx uv=%lx v=%lx aw=%d ah=%d vw=%d vh=%d\n",
2325 			 (unsigned long)req->src1.yrgb_addr,
2326 			 (unsigned long)req->src1.uv_addr,
2327 			 (unsigned long)req->src1.v_addr,
2328 			 req->src1.act_w, req->src1.act_h,
2329 			 req->src1.vir_w, req->src1.vir_h);
2330 		pr_info("src1: xoff=%d yoff=%d format=%s\n",
2331 			req->src1.x_offset, req->src1.y_offset,
2332 			 rga_get_format_name(req->src1.format));
2333 	}
2334 
2335 	pr_info("dst: y=%lx uv=%lx v=%lx aw=%d ah=%d vw=%d vh=%d\n",
2336 		 (unsigned long)req->dst.yrgb_addr,
2337 		 (unsigned long)req->dst.uv_addr,
2338 		 (unsigned long)req->dst.v_addr,
2339 		 req->dst.act_w, req->dst.act_h,
2340 		 req->dst.vir_w, req->dst.vir_h);
2341 	pr_info("dst: xoff=%d yoff=%d format=%s\n",
2342 		req->dst.x_offset, req->dst.y_offset,
2343 		 rga_get_format_name(req->dst.format));
2344 
2345 	pr_info("mmu: src=%.2x src1=%.2x dst=%.2x els=%.2x\n",
2346 		req->mmu_info.src0_mmu_flag, req->mmu_info.src1_mmu_flag,
2347 		req->mmu_info.dst_mmu_flag, req->mmu_info.els_mmu_flag);
2348 	pr_info("alpha: flag %x mode=%s\n",
2349 		req->alpha_rop_flag, rga_get_blend_mode_str(req->alpha_config.mode));
2350 	pr_info("alpha: pre_multi=[%d,%d] pixl=[%d,%d] glb=[%d,%d]\n",
2351 		req->alpha_config.fg_pre_multiplied, req->alpha_config.bg_pre_multiplied,
2352 		req->alpha_config.fg_pixel_alpha_en, req->alpha_config.bg_pixel_alpha_en,
2353 		req->alpha_config.fg_global_alpha_en, req->alpha_config.bg_global_alpha_en);
2354 	pr_info("alpha: fg_global_alpha=%x bg_global_alpha=%x\n",
2355 		req->alpha_config.fg_global_alpha_value, req->alpha_config.bg_global_alpha_value);
2356 	pr_info("yuv2rgb mode is %x\n", req->yuv2rgb_mode);
2357 }
2358 
rga2_init_reg(struct rga_job * job)2359 static int rga2_init_reg(struct rga_job *job)
2360 {
2361 	struct rga2_req req;
2362 	int ret = 0;
2363 	struct rga_scheduler_t *scheduler = NULL;
2364 
2365 	scheduler = job->scheduler;
2366 	if (unlikely(scheduler == NULL)) {
2367 		pr_err("failed to get scheduler, %s(%d)\n", __func__, __LINE__);
2368 		return -EINVAL;
2369 	}
2370 
2371 	memset(&req, 0x0, sizeof(req));
2372 
2373 	rga_cmd_to_rga2_cmd(scheduler, &job->rga_command_base, &req);
2374 	memcpy(&job->full_csc, &job->rga_command_base.full_csc, sizeof(job->full_csc));
2375 	memcpy(&job->pre_intr_info, &job->rga_command_base.pre_intr_info,
2376 	       sizeof(job->pre_intr_info));
2377 
2378 	/* check value if legal */
2379 	ret = rga2_check_param(scheduler->data, &req);
2380 	if (ret == -EINVAL) {
2381 		pr_err("req argument is inval\n");
2382 		return ret;
2383 	}
2384 
2385 	rga2_align_check(&req);
2386 
2387 	/* for debug */
2388 	if (DEBUGGER_EN(MSG))
2389 		print_debug_info(&req);
2390 
2391 	/* RGA2 mmu set */
2392 	if ((req.mmu_info.src0_mmu_flag & 1) || (req.mmu_info.src1_mmu_flag & 1) ||
2393 	    (req.mmu_info.dst_mmu_flag & 1) || (req.mmu_info.els_mmu_flag & 1)) {
2394 		if (scheduler->data->mmu != RGA_MMU) {
2395 			pr_err("core[%d] has no MMU, please use physically contiguous memory.\n",
2396 			       scheduler->core);
2397 			pr_err("mmu_flag[src, src1, dst, els] = [0x%x, 0x%x, 0x%x, 0x%x]\n",
2398 			       req.mmu_info.src0_mmu_flag, req.mmu_info.src1_mmu_flag,
2399 			       req.mmu_info.dst_mmu_flag, req.mmu_info.els_mmu_flag);
2400 			return -EINVAL;
2401 		}
2402 
2403 		ret = rga_set_mmu_base(job, &req);
2404 		if (ret < 0) {
2405 			pr_err("%s, [%d] set mmu info error\n", __func__,
2406 				 __LINE__);
2407 			return -EFAULT;
2408 		}
2409 	}
2410 
2411 	/* In slave mode, the current frame completion interrupt must be enabled. */
2412 	if (scheduler->data->mmu == RGA_IOMMU)
2413 		req.CMD_fin_int_enable = 1;
2414 
2415 	if (rga2_gen_reg_info((uint8_t *)job->cmd_reg, &req) == -1) {
2416 		pr_err("gen reg info error\n");
2417 		return -EINVAL;
2418 	}
2419 
2420 	return ret;
2421 }
2422 
rga2_dump_read_back_sys_reg(struct rga_scheduler_t * scheduler)2423 static void rga2_dump_read_back_sys_reg(struct rga_scheduler_t *scheduler)
2424 {
2425 	int i;
2426 	unsigned long flags;
2427 	uint32_t sys_reg[24] = {0};
2428 
2429 	spin_lock_irqsave(&scheduler->irq_lock, flags);
2430 
2431 	for (i = 0; i < 24; i++)
2432 		sys_reg[i] = rga_read(RGA2_SYS_REG_BASE + i * 4, scheduler);
2433 
2434 	spin_unlock_irqrestore(&scheduler->irq_lock, flags);
2435 
2436 	pr_info("SYS_READ_BACK_REG\n");
2437 	for (i = 0; i < 6; i++)
2438 		pr_info("0x%04x : %.8x %.8x %.8x %.8x\n",
2439 			RGA2_SYS_REG_BASE + i * 0x10,
2440 			sys_reg[0 + i * 4], sys_reg[1 + i * 4],
2441 			sys_reg[2 + i * 4], sys_reg[3 + i * 4]);
2442 }
2443 
rga2_dump_read_back_csc_reg(struct rga_scheduler_t * scheduler)2444 static void rga2_dump_read_back_csc_reg(struct rga_scheduler_t *scheduler)
2445 {
2446 	int i;
2447 	unsigned long flags;
2448 	uint32_t csc_reg[12] = {0};
2449 
2450 	spin_lock_irqsave(&scheduler->irq_lock, flags);
2451 
2452 	for (i = 0; i < 12; i++)
2453 		csc_reg[i] = rga_read(RGA2_CSC_REG_BASE + i * 4, scheduler);
2454 
2455 	spin_unlock_irqrestore(&scheduler->irq_lock, flags);
2456 
2457 	pr_info("CSC_READ_BACK_REG\n");
2458 	for (i = 0; i < 3; i++)
2459 		pr_info("0x%04x : %.8x %.8x %.8x %.8x\n",
2460 			RGA2_CSC_REG_BASE + i * 0x10,
2461 			csc_reg[0 + i * 4], csc_reg[1 + i * 4],
2462 			csc_reg[2 + i * 4], csc_reg[3 + i * 4]);
2463 }
2464 
rga2_dump_read_back_cmd_reg(struct rga_scheduler_t * scheduler)2465 static void rga2_dump_read_back_cmd_reg(struct rga_scheduler_t *scheduler)
2466 {
2467 	int i;
2468 	unsigned long flags;
2469 	uint32_t cmd_reg[32] = {0};
2470 
2471 	spin_lock_irqsave(&scheduler->irq_lock, flags);
2472 
2473 	for (i = 0; i < 32; i++)
2474 		cmd_reg[i] = rga_read(RGA2_CMD_REG_BASE + i * 4, scheduler);
2475 
2476 	spin_unlock_irqrestore(&scheduler->irq_lock, flags);
2477 
2478 	pr_info("CMD_READ_BACK_REG\n");
2479 	for (i = 0; i < 8; i++)
2480 		pr_info("0x%04x : %.8x %.8x %.8x %.8x\n",
2481 			RGA2_CMD_REG_BASE + i * 0x10,
2482 			cmd_reg[0 + i * 4], cmd_reg[1 + i * 4],
2483 			cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]);
2484 }
2485 
rga2_dump_read_back_reg(struct rga_scheduler_t * scheduler)2486 static void rga2_dump_read_back_reg(struct rga_scheduler_t *scheduler)
2487 {
2488 	rga2_dump_read_back_sys_reg(scheduler);
2489 	rga2_dump_read_back_csc_reg(scheduler);
2490 	rga2_dump_read_back_cmd_reg(scheduler);
2491 }
2492 
rga2_set_pre_intr_reg(struct rga_job * job,struct rga_scheduler_t * scheduler)2493 static void rga2_set_pre_intr_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
2494 {
2495 	uint32_t reg;
2496 
2497 	if (job->pre_intr_info.read_intr_en) {
2498 		reg = s_RGA2_READ_LINE_SW_INTR_LINE_RD_TH(job->pre_intr_info.read_threshold);
2499 		rga_write(reg, RGA2_READ_LINE_CNT, scheduler);
2500 	}
2501 
2502 	if (job->pre_intr_info.write_intr_en) {
2503 		reg = s_RGA2_WRITE_LINE_SW_INTR_LINE_WR_START(job->pre_intr_info.write_start);
2504 		reg = ((reg & (~m_RGA2_WRITE_LINE_SW_INTR_LINE_WR_STEP)) |
2505 		       (s_RGA2_WRITE_LINE_SW_INTR_LINE_WR_STEP(job->pre_intr_info.write_step)));
2506 		rga_write(reg, RGA2_WRITE_LINE_CNT, scheduler);
2507 	}
2508 
2509 	reg = rga_read(RGA2_SYS_CTRL, scheduler);
2510 	reg = ((reg & (~m_RGA2_SYS_CTRL_HOLD_MODE_EN)) |
2511 	       (s_RGA2_SYS_CTRL_HOLD_MODE_EN(job->pre_intr_info.read_hold_en)));
2512 	rga_write(reg, RGA2_SYS_CTRL, scheduler);
2513 
2514 	reg = rga_read(RGA2_INT, scheduler);
2515 	reg = (reg | s_RGA2_INT_LINE_RD_CLEAR(0x1) | s_RGA2_INT_LINE_WR_CLEAR(0x1));
2516 	reg = ((reg & (~m_RGA2_INT_LINE_RD_EN)) |
2517 	       (s_RGA2_INT_LINE_RD_EN(job->pre_intr_info.read_intr_en)));
2518 	reg = ((reg & (~m_RGA2_INT_LINE_WR_EN)) |
2519 	       (s_RGA2_INT_LINE_WR_EN(job->pre_intr_info.write_intr_en)));
2520 	rga_write(reg, RGA2_INT, scheduler);
2521 }
2522 
rga2_set_reg_full_csc(struct rga_job * job,struct rga_scheduler_t * scheduler)2523 static void rga2_set_reg_full_csc(struct rga_job *job, struct rga_scheduler_t *scheduler)
2524 {
2525 	uint8_t clip_y_max, clip_y_min;
2526 	uint8_t clip_uv_max, clip_uv_min;
2527 
2528 	clip_y_max = 0xff;
2529 	clip_y_min = 0x0;
2530 	clip_uv_max = 0xff;
2531 	clip_uv_min = 0;
2532 
2533 	/* full csc coefficient */
2534 	/* Y coefficient */
2535 	rga_write(job->full_csc.coe_y.r_v | (clip_y_max << 16) | (clip_y_min << 24),
2536 		  RGA2_DST_CSC_00, scheduler);
2537 	rga_write(job->full_csc.coe_y.g_y | (clip_uv_max << 16) | (clip_uv_min << 24),
2538 		  RGA2_DST_CSC_01, scheduler);
2539 	rga_write(job->full_csc.coe_y.b_u, RGA2_DST_CSC_02, scheduler);
2540 	rga_write(job->full_csc.coe_y.off, RGA2_DST_CSC_OFF0, scheduler);
2541 
2542 	/* U coefficient */
2543 	rga_write(job->full_csc.coe_u.r_v, RGA2_DST_CSC_10, scheduler);
2544 	rga_write(job->full_csc.coe_u.g_y, RGA2_DST_CSC_11, scheduler);
2545 	rga_write(job->full_csc.coe_u.b_u, RGA2_DST_CSC_12, scheduler);
2546 	rga_write(job->full_csc.coe_u.off, RGA2_DST_CSC_OFF1, scheduler);
2547 
2548 	/* V coefficient */
2549 	rga_write(job->full_csc.coe_v.r_v, RGA2_DST_CSC_20, scheduler);
2550 	rga_write(job->full_csc.coe_v.g_y, RGA2_DST_CSC_21, scheduler);
2551 	rga_write(job->full_csc.coe_v.b_u, RGA2_DST_CSC_22, scheduler);
2552 	rga_write(job->full_csc.coe_v.off, RGA2_DST_CSC_OFF2, scheduler);
2553 }
2554 
rga2_set_reg(struct rga_job * job,struct rga_scheduler_t * scheduler)2555 static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
2556 {
2557 	int i;
2558 	bool master_mode_en;
2559 	uint32_t sys_ctrl;
2560 	ktime_t now = ktime_get();
2561 
2562 	/*
2563 	 * Currently there is no iova allocated for storing cmd for the IOMMU device,
2564 	 * so the iommu device needs to use the slave mode.
2565 	 */
2566 	if (scheduler->data->mmu != RGA_IOMMU)
2567 		master_mode_en = true;
2568 	else
2569 		master_mode_en = false;
2570 
2571 	if (job->pre_intr_info.enable)
2572 		rga2_set_pre_intr_reg(job, scheduler);
2573 
2574 	if (job->full_csc.flag)
2575 		rga2_set_reg_full_csc(job, scheduler);
2576 
2577 	if (DEBUGGER_EN(REG)) {
2578 		uint32_t *p;
2579 
2580 		rga2_dump_read_back_sys_reg(scheduler);
2581 		rga2_dump_read_back_csc_reg(scheduler);
2582 
2583 		p = job->cmd_reg;
2584 		pr_info("CMD_REG\n");
2585 		for (i = 0; i < 8; i++)
2586 			pr_info("i = %x : %.8x %.8x %.8x %.8x\n", i,
2587 				p[0 + i * 4], p[1 + i * 4],
2588 				p[2 + i * 4], p[3 + i * 4]);
2589 	}
2590 
2591 	/* All CMD finish int */
2592 	rga_write(rga_read(RGA2_INT, scheduler) |
2593 		  m_RGA2_INT_ERROR_ENABLE_MASK | m_RGA2_INT_ALL_CMD_DONE_INT_EN,
2594 		  RGA2_INT, scheduler);
2595 
2596 	/* sys_reg init */
2597 	sys_ctrl = m_RGA2_SYS_CTRL_AUTO_CKG | m_RGA2_SYS_CTRL_AUTO_RST |
2598 		   m_RGA2_SYS_CTRL_RST_PROTECT_P | m_RGA2_SYS_CTRL_DST_WR_OPT_DIS |
2599 		   m_RGA2_SYS_CTRL_SRC0YUV420SP_RD_OPT_DIS;
2600 
2601 	if (master_mode_en) {
2602 		/* master mode */
2603 		sys_ctrl |= s_RGA2_SYS_CTRL_CMD_MODE(1);
2604 
2605 		/* cmd buffer flush cache to ddr */
2606 		rga_dma_sync_flush_range(&job->cmd_reg[0], &job->cmd_reg[32], scheduler);
2607 
2608 		/* set cmd_addr */
2609 		rga_write(virt_to_phys(job->cmd_reg), RGA2_CMD_BASE, scheduler);
2610 		rga_write(sys_ctrl, RGA2_SYS_CTRL, scheduler);
2611 		rga_write(m_RGA2_CMD_CTRL_CMD_LINE_ST_P, RGA2_CMD_CTRL, scheduler);
2612 	} else {
2613 		/* slave mode */
2614 		sys_ctrl |= s_RGA2_SYS_CTRL_CMD_MODE(0) | m_RGA2_SYS_CTRL_CMD_OP_ST_P;
2615 
2616 		/* set cmd_reg */
2617 		for (i = 0; i <= 32; i++)
2618 			rga_write(job->cmd_reg[i], 0x100 + i * 4, scheduler);
2619 
2620 		rga_write(sys_ctrl, RGA2_SYS_CTRL, scheduler);
2621 	}
2622 
2623 	if (DEBUGGER_EN(REG))
2624 		pr_info("sys_ctrl = %x, int = %x\n",
2625 			rga_read(RGA2_SYS_CTRL, scheduler),
2626 			rga_read(RGA2_INT, scheduler));
2627 
2628 	if (DEBUGGER_EN(TIME))
2629 		pr_info("set cmd use time = %lld\n",
2630 			ktime_us_delta(now, job->timestamp));
2631 
2632 	job->hw_running_time = now;
2633 	job->hw_recoder_time = now;
2634 
2635 	if (DEBUGGER_EN(REG))
2636 		rga2_dump_read_back_reg(scheduler);
2637 
2638 	return 0;
2639 }
2640 
rga2_get_version(struct rga_scheduler_t * scheduler)2641 static int rga2_get_version(struct rga_scheduler_t *scheduler)
2642 {
2643 	u32 major_version, minor_version, svn_version;
2644 	u32 reg_version;
2645 
2646 	if (!scheduler) {
2647 		pr_err("scheduler is null\n");
2648 		return -EINVAL;
2649 	}
2650 
2651 	reg_version = rga_read(RGA2_VERSION_NUM, scheduler);
2652 
2653 	major_version = (reg_version & RGA2_MAJOR_VERSION_MASK) >> 24;
2654 	minor_version = (reg_version & RGA2_MINOR_VERSION_MASK) >> 20;
2655 	svn_version = (reg_version & RGA2_SVN_VERSION_MASK);
2656 
2657 	/*
2658 	 * some old rga ip has no rga version register, so force set to 2.00
2659 	 */
2660 	if (!major_version && !minor_version)
2661 		major_version = 2;
2662 
2663 	snprintf(scheduler->version.str, 10, "%x.%01x.%05x", major_version,
2664 		 minor_version, svn_version);
2665 
2666 	scheduler->version.major = major_version;
2667 	scheduler->version.minor = minor_version;
2668 	scheduler->version.revision = svn_version;
2669 
2670 	return 0;
2671 }
2672 
rga2_read_back_reg(struct rga_job * job,struct rga_scheduler_t * scheduler)2673 static int rga2_read_back_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
2674 {
2675 	if (job->rga_command_base.osd_info.enable) {
2676 		job->rga_command_base.osd_info.cur_flags0 = rga_read(RGA2_OSD_CUR_FLAGS0,
2677 								     scheduler);
2678 		job->rga_command_base.osd_info.cur_flags1 = rga_read(RGA2_OSD_CUR_FLAGS1,
2679 								     scheduler);
2680 	}
2681 
2682 	return 0;
2683 }
2684 
rga2_irq(struct rga_scheduler_t * scheduler)2685 static int rga2_irq(struct rga_scheduler_t *scheduler)
2686 {
2687 	struct rga_job *job = scheduler->running_job;
2688 
2689 	/* The hardware interrupt top-half don't need to lock the scheduler. */
2690 	if (job == NULL)
2691 		return IRQ_HANDLED;
2692 
2693 	if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state))
2694 		return IRQ_WAKE_THREAD;
2695 
2696 	job->intr_status = rga_read(RGA2_INT, scheduler);
2697 	job->hw_status = rga_read(RGA2_STATUS2, scheduler);
2698 	job->cmd_status = rga_read(RGA2_STATUS1, scheduler);
2699 
2700 	if (DEBUGGER_EN(INT_FLAG))
2701 		pr_info("irq handler, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n",
2702 			job->intr_status, job->hw_status, job->cmd_status);
2703 
2704 	if (job->intr_status &
2705 	    (m_RGA2_INT_CUR_CMD_DONE_INT_FLAG | m_RGA2_INT_ALL_CMD_DONE_INT_FLAG)) {
2706 		set_bit(RGA_JOB_STATE_FINISH, &job->state);
2707 	} else if (job->intr_status & m_RGA2_INT_ERROR_FLAG_MASK) {
2708 		set_bit(RGA_JOB_STATE_INTR_ERR, &job->state);
2709 
2710 		pr_err("irq handler err! INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n",
2711 		       job->intr_status, job->hw_status, job->cmd_status);
2712 		scheduler->ops->soft_reset(scheduler);
2713 	}
2714 
2715 	/*clear INTR */
2716 	rga_write(rga_read(RGA2_INT, scheduler) |
2717 		  (m_RGA2_INT_ERROR_CLEAR_MASK |
2718 		   m_RGA2_INT_ALL_CMD_DONE_INT_CLEAR | m_RGA2_INT_NOW_CMD_DONE_INT_CLEAR |
2719 		   m_RGA2_INT_LINE_RD_CLEAR | m_RGA2_INT_LINE_WR_CLEAR),
2720 		  RGA2_INT, scheduler);
2721 
2722 	return IRQ_WAKE_THREAD;
2723 }
2724 
rga2_isr_thread(struct rga_job * job,struct rga_scheduler_t * scheduler)2725 static int rga2_isr_thread(struct rga_job *job, struct rga_scheduler_t *scheduler)
2726 {
2727 	if (DEBUGGER_EN(INT_FLAG))
2728 		pr_info("isr thread, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n",
2729 			rga_read(RGA2_INT, scheduler),
2730 			rga_read(RGA2_STATUS2, scheduler),
2731 			rga_read(RGA2_STATUS1, scheduler));
2732 
2733 	if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) {
2734 		if (job->hw_status & m_RGA2_STATUS2_RPP_ERROR)
2735 			pr_err("RGA current status: rpp error!\n");
2736 		if (job->hw_status & m_RGA2_STATUS2_BUS_ERROR)
2737 			pr_err("RGA current status: bus error!\n");
2738 
2739 		if (job->intr_status & m_RGA2_INT_ERROR_INT_FLAG) {
2740 			pr_err("RGA bus error intr, please check your configuration and buffer.\n");
2741 			job->ret = -EFAULT;
2742 		} else if (job->intr_status & m_RGA2_INT_MMU_INT_FLAG) {
2743 			pr_err("mmu failed, please check size of the buffer or whether the buffer has been freed.\n");
2744 			job->ret = -EACCES;
2745 		}
2746 
2747 		if (job->ret == 0) {
2748 			pr_err("rga intr error[0x%x]!\n", job->intr_status);
2749 			job->ret = -EFAULT;
2750 		}
2751 	}
2752 
2753 	return IRQ_HANDLED;
2754 }
2755 
2756 const struct rga_backend_ops rga2_ops = {
2757 	.get_version = rga2_get_version,
2758 	.set_reg = rga2_set_reg,
2759 	.init_reg = rga2_init_reg,
2760 	.soft_reset = rga2_soft_reset,
2761 	.read_back_reg = rga2_read_back_reg,
2762 	.irq = rga2_irq,
2763 	.isr_thread = rga2_isr_thread,
2764 };
2765