xref: /OK3568_Linux_fs/kernel/drivers/video/rockchip/rga3/rga_common.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (C) Rockchip Electronics Co., Ltd.
4  *
5  * Author: Cerf Yu <cerf.yu@rock-chips.com>
6  */
7 
8 #define pr_fmt(fmt) "rga_common: " fmt
9 
10 #include "rga.h"
11 #include "rga_common.h"
12 
rga_is_rgb_format(uint32_t format)13 bool rga_is_rgb_format(uint32_t format)
14 {
15 	switch (format) {
16 	case RGA_FORMAT_RGBA_8888:
17 	case RGA_FORMAT_RGBX_8888:
18 	case RGA_FORMAT_RGB_888:
19 	case RGA_FORMAT_BGRA_8888:
20 	case RGA_FORMAT_BGRX_8888:
21 	case RGA_FORMAT_BGR_888:
22 	case RGA_FORMAT_RGB_565:
23 	case RGA_FORMAT_RGBA_5551:
24 	case RGA_FORMAT_RGBA_4444:
25 	case RGA_FORMAT_BGR_565:
26 	case RGA_FORMAT_BGRA_5551:
27 	case RGA_FORMAT_BGRA_4444:
28 	case RGA_FORMAT_ARGB_8888:
29 	case RGA_FORMAT_XRGB_8888:
30 	case RGA_FORMAT_ARGB_5551:
31 	case RGA_FORMAT_ARGB_4444:
32 	case RGA_FORMAT_ABGR_8888:
33 	case RGA_FORMAT_XBGR_8888:
34 	case RGA_FORMAT_ABGR_5551:
35 	case RGA_FORMAT_ABGR_4444:
36 		return true;
37 	default:
38 		return false;
39 	}
40 }
41 
rga_is_yuv_format(uint32_t format)42 bool rga_is_yuv_format(uint32_t format)
43 {
44 	switch (format) {
45 	case RGA_FORMAT_Y4:
46 	case RGA_FORMAT_YCbCr_400:
47 
48 	case RGA_FORMAT_YCbCr_422_SP:
49 	case RGA_FORMAT_YCbCr_422_P:
50 	case RGA_FORMAT_YCbCr_420_SP:
51 	case RGA_FORMAT_YCbCr_420_P:
52 	case RGA_FORMAT_YCrCb_422_SP:
53 	case RGA_FORMAT_YCrCb_422_P:
54 	case RGA_FORMAT_YCrCb_420_SP:
55 	case RGA_FORMAT_YCrCb_420_P:
56 
57 	case RGA_FORMAT_YVYU_422:
58 	case RGA_FORMAT_YVYU_420:
59 	case RGA_FORMAT_VYUY_422:
60 	case RGA_FORMAT_VYUY_420:
61 	case RGA_FORMAT_YUYV_422:
62 	case RGA_FORMAT_YUYV_420:
63 	case RGA_FORMAT_UYVY_422:
64 	case RGA_FORMAT_UYVY_420:
65 
66 	case RGA_FORMAT_YCbCr_420_SP_10B:
67 	case RGA_FORMAT_YCrCb_420_SP_10B:
68 	case RGA_FORMAT_YCbCr_422_SP_10B:
69 	case RGA_FORMAT_YCrCb_422_SP_10B:
70 		return true;
71 	default:
72 		return false;
73 	}
74 }
75 
rga_is_alpha_format(uint32_t format)76 bool rga_is_alpha_format(uint32_t format)
77 {
78 	switch (format) {
79 	case RGA_FORMAT_RGBA_8888:
80 	case RGA_FORMAT_BGRA_8888:
81 	case RGA_FORMAT_RGBA_5551:
82 	case RGA_FORMAT_RGBA_4444:
83 	case RGA_FORMAT_BGRA_5551:
84 	case RGA_FORMAT_BGRA_4444:
85 	case RGA_FORMAT_ARGB_8888:
86 	case RGA_FORMAT_ARGB_5551:
87 	case RGA_FORMAT_ARGB_4444:
88 	case RGA_FORMAT_ABGR_8888:
89 	case RGA_FORMAT_ABGR_5551:
90 	case RGA_FORMAT_ABGR_4444:
91 		return true;
92 	default:
93 		return false;
94 	}
95 }
96 
rga_is_yuv420_packed_format(uint32_t format)97 bool rga_is_yuv420_packed_format(uint32_t format)
98 {
99 	switch (format) {
100 	case RGA_FORMAT_YVYU_420:
101 	case RGA_FORMAT_VYUY_420:
102 	case RGA_FORMAT_YUYV_420:
103 	case RGA_FORMAT_UYVY_420:
104 		return true;
105 	default:
106 		return false;
107 	}
108 }
109 
rga_is_yuv420_planar_format(uint32_t format)110 bool rga_is_yuv420_planar_format(uint32_t format)
111 {
112 	switch (format) {
113 	case RGA_FORMAT_YCbCr_420_P:
114 	case RGA_FORMAT_YCrCb_420_P:
115 		return true;
116 	default:
117 		return false;
118 	}
119 }
120 
rga_is_yuv420_semi_planar_format(uint32_t format)121 bool rga_is_yuv420_semi_planar_format(uint32_t format)
122 {
123 	switch (format) {
124 	case RGA_FORMAT_YCbCr_420_SP:
125 	case RGA_FORMAT_YCrCb_420_SP:
126 	case RGA_FORMAT_YCbCr_420_SP_10B:
127 	case RGA_FORMAT_YCrCb_420_SP_10B:
128 		return true;
129 	default:
130 		return false;
131 	}
132 }
133 
rga_is_yuv422_packed_format(uint32_t format)134 bool rga_is_yuv422_packed_format(uint32_t format)
135 {
136 	switch (format) {
137 	case RGA_FORMAT_YVYU_422:
138 	case RGA_FORMAT_VYUY_422:
139 	case RGA_FORMAT_YUYV_422:
140 	case RGA_FORMAT_UYVY_422:
141 		return true;
142 	default:
143 		return false;
144 	}
145 }
146 
rga_is_yuv422_planar_format(uint32_t format)147 bool rga_is_yuv422_planar_format(uint32_t format)
148 {
149 	switch (format) {
150 	case RGA_FORMAT_YCbCr_422_P:
151 	case RGA_FORMAT_YCrCb_422_P:
152 		return true;
153 	default:
154 		return false;
155 	}
156 }
157 
rga_is_yuv422_semi_planar_format(uint32_t format)158 bool rga_is_yuv422_semi_planar_format(uint32_t format)
159 {
160 	switch (format) {
161 	case RGA_FORMAT_YCbCr_422_SP:
162 	case RGA_FORMAT_YCrCb_422_SP:
163 	case RGA_FORMAT_YCbCr_422_SP_10B:
164 	case RGA_FORMAT_YCrCb_422_SP_10B:
165 		return true;
166 	default:
167 		return false;
168 	}
169 }
170 
rga_is_yuv8bit_format(uint32_t format)171 bool rga_is_yuv8bit_format(uint32_t format)
172 {
173 	switch (format) {
174 	case RGA_FORMAT_Y4:
175 	case RGA_FORMAT_YCbCr_400:
176 
177 	case RGA_FORMAT_YCbCr_422_SP:
178 	case RGA_FORMAT_YCbCr_422_P:
179 	case RGA_FORMAT_YCbCr_420_SP:
180 	case RGA_FORMAT_YCbCr_420_P:
181 	case RGA_FORMAT_YCrCb_422_SP:
182 	case RGA_FORMAT_YCrCb_422_P:
183 	case RGA_FORMAT_YCrCb_420_SP:
184 	case RGA_FORMAT_YCrCb_420_P:
185 
186 	case RGA_FORMAT_YVYU_422:
187 	case RGA_FORMAT_YVYU_420:
188 	case RGA_FORMAT_VYUY_422:
189 	case RGA_FORMAT_VYUY_420:
190 	case RGA_FORMAT_YUYV_422:
191 	case RGA_FORMAT_YUYV_420:
192 	case RGA_FORMAT_UYVY_422:
193 	case RGA_FORMAT_UYVY_420:
194 		return true;
195 	default:
196 		return false;
197 	}
198 }
199 
rga_is_yuv10bit_format(uint32_t format)200 bool rga_is_yuv10bit_format(uint32_t format)
201 {
202 	switch (format) {
203 	case RGA_FORMAT_YCbCr_420_SP_10B:
204 	case RGA_FORMAT_YCrCb_420_SP_10B:
205 	case RGA_FORMAT_YCbCr_422_SP_10B:
206 	case RGA_FORMAT_YCrCb_422_SP_10B:
207 		return true;
208 	default:
209 		return false;
210 	}
211 }
212 
rga_is_yuv422p_format(uint32_t format)213 bool rga_is_yuv422p_format(uint32_t format)
214 {
215 	switch (format) {
216 	case RGA_FORMAT_YCbCr_422_P:
217 	case RGA_FORMAT_YCrCb_422_P:
218 		return true;
219 	default:
220 		return false;
221 	}
222 }
223 
rga_is_only_y_format(uint32_t format)224 bool rga_is_only_y_format(uint32_t format)
225 {
226 	switch (format) {
227 	case RGA_FORMAT_YCbCr_400:
228 	case RGA_FORMAT_Y4:
229 		return true;
230 	default:
231 		return false;
232 	}
233 }
234 
rga_get_format_name(uint32_t format)235 const char *rga_get_format_name(uint32_t format)
236 {
237 	switch (format) {
238 	case RGA_FORMAT_RGBA_8888:
239 		return "RGBA8888";
240 	case RGA_FORMAT_RGBX_8888:
241 		return "RGBX8888";
242 	case RGA_FORMAT_RGB_888:
243 		return "RGB888";
244 	case RGA_FORMAT_BGRA_8888:
245 		return "BGRA8888";
246 	case RGA_FORMAT_BGRX_8888:
247 		return "BGRX8888";
248 	case RGA_FORMAT_BGR_888:
249 		return "BGR888";
250 	case RGA_FORMAT_RGB_565:
251 		return "RGB565";
252 	case RGA_FORMAT_RGBA_5551:
253 		return "RGBA5551";
254 	case RGA_FORMAT_RGBA_4444:
255 		return "RGBA4444";
256 	case RGA_FORMAT_BGR_565:
257 		return "BGR565";
258 	case RGA_FORMAT_BGRA_5551:
259 		return "BGRA5551";
260 	case RGA_FORMAT_BGRA_4444:
261 		return "BGRA4444";
262 
263 	case RGA_FORMAT_YCbCr_422_SP:
264 		return "YCbCr422SP";
265 	case RGA_FORMAT_YCbCr_422_P:
266 		return "YCbCr422P";
267 	case RGA_FORMAT_YCbCr_420_SP:
268 		return "YCbCr420SP";
269 	case RGA_FORMAT_YCbCr_420_P:
270 		return "YCbCr420P";
271 	case RGA_FORMAT_YCrCb_422_SP:
272 		return "YCrCb422SP";
273 	case RGA_FORMAT_YCrCb_422_P:
274 		return "YCrCb422P";
275 	case RGA_FORMAT_YCrCb_420_SP:
276 		return "YCrCb420SP";
277 	case RGA_FORMAT_YCrCb_420_P:
278 		return "YCrCb420P";
279 
280 	case RGA_FORMAT_YVYU_422:
281 		return "YVYU422";
282 	case RGA_FORMAT_YVYU_420:
283 		return "YVYU420";
284 	case RGA_FORMAT_VYUY_422:
285 		return "VYUY422";
286 	case RGA_FORMAT_VYUY_420:
287 		return "VYUY420";
288 	case RGA_FORMAT_YUYV_422:
289 		return "YUYV422";
290 	case RGA_FORMAT_YUYV_420:
291 		return "YUYV420";
292 	case RGA_FORMAT_UYVY_422:
293 		return "UYVY422";
294 	case RGA_FORMAT_UYVY_420:
295 		return "UYVY420";
296 
297 	case RGA_FORMAT_YCbCr_420_SP_10B:
298 		return "YCrCb420SP10B";
299 	case RGA_FORMAT_YCrCb_420_SP_10B:
300 		return "YCbCr420SP10B";
301 	case RGA_FORMAT_YCbCr_422_SP_10B:
302 		return "YCbCr422SP10B";
303 	case RGA_FORMAT_YCrCb_422_SP_10B:
304 		return "YCrCb422SP10B";
305 	case RGA_FORMAT_BPP1:
306 		return "BPP1";
307 	case RGA_FORMAT_BPP2:
308 		return "BPP2";
309 	case RGA_FORMAT_BPP4:
310 		return "BPP4";
311 	case RGA_FORMAT_BPP8:
312 		return "BPP8";
313 	case RGA_FORMAT_YCbCr_400:
314 		return "YCbCr400";
315 	case RGA_FORMAT_Y4:
316 		return "y4";
317 
318 	case RGA_FORMAT_ARGB_8888:
319 		return "ARGB8888";
320 	case RGA_FORMAT_XRGB_8888:
321 		return "XRGB8888";
322 	case RGA_FORMAT_ARGB_5551:
323 		return "ARGB5551";
324 	case RGA_FORMAT_ARGB_4444:
325 		return "ARGB4444";
326 	case RGA_FORMAT_ABGR_8888:
327 		return "ABGR8888";
328 	case RGA_FORMAT_XBGR_8888:
329 		return "XBGR8888";
330 	case RGA_FORMAT_ABGR_5551:
331 		return "ABGR5551";
332 	case RGA_FORMAT_ABGR_4444:
333 		return "ABGR4444";
334 
335 	case RGA_FORMAT_RGBA_2BPP:
336 		return "RGBA2BPP";
337 
338 	default:
339 		return "UNF";
340 	}
341 }
342 
rga_get_format_bits(uint32_t format)343 int rga_get_format_bits(uint32_t format)
344 {
345 	int bits = 0;
346 
347 	switch (format) {
348 	case RGA_FORMAT_RGBA_8888:
349 	case RGA_FORMAT_RGBX_8888:
350 	case RGA_FORMAT_BGRA_8888:
351 	case RGA_FORMAT_BGRX_8888:
352 	case RGA_FORMAT_ARGB_8888:
353 	case RGA_FORMAT_XRGB_8888:
354 	case RGA_FORMAT_ABGR_8888:
355 	case RGA_FORMAT_XBGR_8888:
356 		bits = 32;
357 		break;
358 	case RGA_FORMAT_RGB_888:
359 	case RGA_FORMAT_BGR_888:
360 		bits = 24;
361 		break;
362 	case RGA_FORMAT_RGB_565:
363 	case RGA_FORMAT_RGBA_5551:
364 	case RGA_FORMAT_RGBA_4444:
365 	case RGA_FORMAT_BGR_565:
366 	case RGA_FORMAT_BGRA_5551:
367 	case RGA_FORMAT_BGRA_4444:
368 	case RGA_FORMAT_ARGB_5551:
369 	case RGA_FORMAT_ARGB_4444:
370 	case RGA_FORMAT_ABGR_5551:
371 	case RGA_FORMAT_ABGR_4444:
372 	case RGA_FORMAT_YCbCr_422_SP:
373 	case RGA_FORMAT_YCbCr_422_P:
374 	case RGA_FORMAT_YCrCb_422_SP:
375 	case RGA_FORMAT_YCrCb_422_P:
376 	case RGA_FORMAT_YUYV_422:
377 	case RGA_FORMAT_YVYU_422:
378 	case RGA_FORMAT_UYVY_422:
379 	case RGA_FORMAT_VYUY_422:
380 	/* YUV 420 packed according to the arrangement of YUV422 packed. */
381 	case RGA_FORMAT_YUYV_420:
382 	case RGA_FORMAT_YVYU_420:
383 	case RGA_FORMAT_UYVY_420:
384 	case RGA_FORMAT_VYUY_420:
385 		bits = 16;
386 		break;
387 	case RGA_FORMAT_YCbCr_420_SP:
388 	case RGA_FORMAT_YCbCr_420_P:
389 	case RGA_FORMAT_YCrCb_420_SP:
390 	case RGA_FORMAT_YCrCb_420_P:
391 		bits = 12;
392 		break;
393 	case RGA_FORMAT_YCbCr_420_SP_10B:
394 	case RGA_FORMAT_YCrCb_420_SP_10B:
395 	case RGA_FORMAT_YCbCr_422_SP_10B:
396 	case RGA_FORMAT_YCrCb_422_SP_10B:
397 		bits = 15;
398 		break;
399 	case RGA_FORMAT_YCbCr_400:
400 	case RGA_FORMAT_BPP8:
401 		bits = 8;
402 		break;
403 	case RGA_FORMAT_Y4:
404 	case RGA_FORMAT_BPP4:
405 		bits = 4;
406 		break;
407 	case RGA_FORMAT_BPP2:
408 		bits = 2;
409 		break;
410 	case RGA_FORMAT_BPP1:
411 		bits = 1;
412 		break;
413 	default:
414 		pr_err("unknown format [0x%x]\n", format);
415 		return -1;
416 	}
417 
418 	return bits;
419 }
420 
rga_get_pixel_stride_from_format(uint32_t format)421 int rga_get_pixel_stride_from_format(uint32_t format)
422 {
423 	int pixel_stride = 0;
424 
425 	switch (format) {
426 	case RGA_FORMAT_RGBA_8888:
427 	case RGA_FORMAT_RGBX_8888:
428 	case RGA_FORMAT_BGRA_8888:
429 	case RGA_FORMAT_BGRX_8888:
430 	case RGA_FORMAT_ARGB_8888:
431 	case RGA_FORMAT_XRGB_8888:
432 	case RGA_FORMAT_ABGR_8888:
433 	case RGA_FORMAT_XBGR_8888:
434 		pixel_stride = 32;
435 		break;
436 	case RGA_FORMAT_RGB_888:
437 	case RGA_FORMAT_BGR_888:
438 		pixel_stride = 24;
439 		break;
440 	case RGA_FORMAT_RGB_565:
441 	case RGA_FORMAT_RGBA_5551:
442 	case RGA_FORMAT_RGBA_4444:
443 	case RGA_FORMAT_BGR_565:
444 	case RGA_FORMAT_BGRA_5551:
445 	case RGA_FORMAT_BGRA_4444:
446 	case RGA_FORMAT_ARGB_5551:
447 	case RGA_FORMAT_ARGB_4444:
448 	case RGA_FORMAT_ABGR_5551:
449 	case RGA_FORMAT_ABGR_4444:
450 	case RGA_FORMAT_YVYU_422:
451 	case RGA_FORMAT_YVYU_420:
452 	case RGA_FORMAT_VYUY_422:
453 	case RGA_FORMAT_VYUY_420:
454 	case RGA_FORMAT_YUYV_422:
455 	case RGA_FORMAT_YUYV_420:
456 	case RGA_FORMAT_UYVY_422:
457 	case RGA_FORMAT_UYVY_420:
458 		pixel_stride = 16;
459 		break;
460 	case RGA_FORMAT_YCbCr_420_SP_10B:
461 	case RGA_FORMAT_YCrCb_420_SP_10B:
462 	case RGA_FORMAT_YCbCr_422_SP_10B:
463 	case RGA_FORMAT_YCrCb_422_SP_10B:
464 		pixel_stride = 10;
465 		break;
466 	case RGA_FORMAT_BPP1:
467 	case RGA_FORMAT_BPP2:
468 	case RGA_FORMAT_BPP4:
469 	case RGA_FORMAT_BPP8:
470 	case RGA_FORMAT_YCbCr_400:
471 	case RGA_FORMAT_YCbCr_420_SP:
472 	case RGA_FORMAT_YCbCr_420_P:
473 	case RGA_FORMAT_YCrCb_420_SP:
474 	case RGA_FORMAT_YCrCb_420_P:
475 	case RGA_FORMAT_YCbCr_422_SP:
476 	case RGA_FORMAT_YCbCr_422_P:
477 	case RGA_FORMAT_YCrCb_422_SP:
478 	case RGA_FORMAT_YCrCb_422_P:
479 		pixel_stride = 8;
480 		break;
481 	case RGA_FORMAT_Y4:
482 		pixel_stride = 4;
483 		break;
484 	default:
485 		pr_err("unknown format [0x%x]\n", format);
486 		return -1;
487 	}
488 
489 	return pixel_stride;
490 }
491 
rga_get_render_mode_str(uint8_t mode)492 const char *rga_get_render_mode_str(uint8_t mode)
493 {
494 	switch (mode) {
495 	case 0x0:
496 		return "bitblt";
497 	case 0x1:
498 		return "RGA_COLOR_PALETTE";
499 	case 0x2:
500 		return "RGA_COLOR_FILL";
501 	case 0x3:
502 		return "update_palette_table";
503 	case 0x4:
504 		return "update_patten_buff";
505 	default:
506 		return "UNF";
507 	}
508 }
509 
rga_get_rotate_mode_str(uint8_t mode)510 const char *rga_get_rotate_mode_str(uint8_t mode)
511 {
512 	switch (mode) {
513 	case 0x0:
514 		return "0";
515 	case 0x1:
516 		return "90 degree";
517 	case 0x2:
518 		return "180 degree";
519 	case 0x3:
520 		return "270 degree";
521 	case 0x10:
522 		return "xmirror";
523 	case 0x20:
524 		return "ymirror";
525 	case 0x30:
526 		return "xymirror";
527 	default:
528 		return "UNF";
529 	}
530 }
531 
rga_get_blend_mode_str(enum rga_alpha_blend_mode mode)532 const char *rga_get_blend_mode_str(enum rga_alpha_blend_mode mode)
533 {
534 	switch (mode) {
535 	case RGA_ALPHA_NONE:
536 		return "no blend";
537 
538 	case RGA_ALPHA_BLEND_SRC:
539 		return "src";
540 
541 	case RGA_ALPHA_BLEND_DST:
542 		return "dst";
543 
544 	case RGA_ALPHA_BLEND_SRC_OVER:
545 		return "src-over";
546 
547 	case RGA_ALPHA_BLEND_DST_OVER:
548 		return "dst-over";
549 
550 	case RGA_ALPHA_BLEND_SRC_IN:
551 		return "src-in";
552 
553 	case RGA_ALPHA_BLEND_DST_IN:
554 		return "dst-in";
555 
556 	case RGA_ALPHA_BLEND_SRC_OUT:
557 		return "src-out";
558 
559 	case RGA_ALPHA_BLEND_DST_OUT:
560 		return "dst-out";
561 
562 	case RGA_ALPHA_BLEND_SRC_ATOP:
563 		return "src-atop";
564 
565 	case RGA_ALPHA_BLEND_DST_ATOP:
566 		return "dst-atop";
567 
568 	case RGA_ALPHA_BLEND_XOR:
569 		return "xor";
570 
571 	case RGA_ALPHA_BLEND_CLEAR:
572 		return "clear";
573 
574 	default:
575 		return "check reg for more imformation";
576 	}
577 }
578 
rga_get_memory_type_str(uint8_t type)579 const char *rga_get_memory_type_str(uint8_t type)
580 {
581 	switch (type) {
582 	case RGA_DMA_BUFFER:
583 		return "dma_fd";
584 	case RGA_VIRTUAL_ADDRESS:
585 		return "virt_addr";
586 	case RGA_PHYSICAL_ADDRESS:
587 		return "phys_addr";
588 	case RGA_DMA_BUFFER_PTR:
589 		return "dma_buf_ptr";
590 	default:
591 		return "UNF";
592 	}
593 }
594 
rga_get_mmu_type_str(enum rga_mmu mmu_type)595 const char *rga_get_mmu_type_str(enum rga_mmu mmu_type)
596 {
597 	switch (mmu_type) {
598 	case RGA_MMU:
599 		return "RGA_MMU";
600 	case RGA_IOMMU:
601 		return "RK_IOMMU";
602 	default:
603 		return "NONE_MMU";
604 	}
605 }
606 
rga_convert_addr(struct rga_img_info_t * img,bool before_vir_get_channel)607 void rga_convert_addr(struct rga_img_info_t *img, bool before_vir_get_channel)
608 {
609 	/*
610 	 * If it is not using dma fd, the virtual/phyical address is assigned
611 	 * to the address of the corresponding channel.
612 	 */
613 
614 	//img->yrgb_addr = img->uv_addr;
615 
616 	/*
617 	 * if before_vir_get_channel is true, then convert addr by default
618 	 * when has iova (before_vir_get_channel is false),
619 	 * need to consider whether fbc case
620 	 */
621 	if (img->rd_mode != RGA_FBC_MODE || before_vir_get_channel) {
622 		img->uv_addr = img->yrgb_addr + (img->vir_w * img->vir_h);
623 
624 		//warning: rga3 may need /2 for all
625 		if (rga_is_yuv422p_format(img->format))
626 			img->v_addr =
627 				img->uv_addr + (img->vir_w * img->vir_h) / 2;
628 		else
629 			img->v_addr =
630 				img->uv_addr + (img->vir_w * img->vir_h) / 4;
631 	} else {
632 		img->uv_addr = img->yrgb_addr;
633 		img->v_addr = 0;
634 	}
635 }
636 
rga_swap_pd_mode(struct rga_req * req_rga)637 void rga_swap_pd_mode(struct rga_req *req_rga)
638 {
639 	if (((req_rga->alpha_rop_flag) & 1)) {
640 		if ((req_rga->alpha_rop_flag >> 3) & 1) {
641 			if (req_rga->PD_mode == 1)
642 				req_rga->PD_mode = 2;
643 			else if (req_rga->PD_mode == 2)
644 				req_rga->PD_mode = 1;
645 			else if (req_rga->PD_mode == 3)
646 				req_rga->PD_mode = 4;
647 			else if (req_rga->PD_mode == 4)
648 				req_rga->PD_mode = 3;
649 		}
650 	}
651 }
652 
rga_image_size_cal(int w,int h,int format,int * yrgb_size,int * uv_size,int * v_size)653 int rga_image_size_cal(int w, int h, int format,
654 		       int *yrgb_size, int *uv_size, int *v_size)
655 {
656 	int yrgb = 0;
657 	int uv = 0;
658 	int v = 0;
659 
660 	switch (format) {
661 	case RGA_FORMAT_RGBA_8888:
662 	case RGA_FORMAT_RGBX_8888:
663 	case RGA_FORMAT_BGRA_8888:
664 	case RGA_FORMAT_BGRX_8888:
665 	case RGA_FORMAT_ARGB_8888:
666 	case RGA_FORMAT_XRGB_8888:
667 	case RGA_FORMAT_ABGR_8888:
668 	case RGA_FORMAT_XBGR_8888:
669 		yrgb = w * h * 4;
670 		break;
671 	case RGA_FORMAT_RGB_888:
672 	case RGA_FORMAT_BGR_888:
673 		yrgb = w * h * 3;
674 		break;
675 	case RGA_FORMAT_RGB_565:
676 	case RGA_FORMAT_RGBA_5551:
677 	case RGA_FORMAT_RGBA_4444:
678 	case RGA_FORMAT_BGR_565:
679 	case RGA_FORMAT_BGRA_5551:
680 	case RGA_FORMAT_BGRA_4444:
681 	case RGA_FORMAT_ARGB_5551:
682 	case RGA_FORMAT_ARGB_4444:
683 	case RGA_FORMAT_ABGR_5551:
684 	case RGA_FORMAT_ABGR_4444:
685 	case RGA_FORMAT_YVYU_422:
686 	case RGA_FORMAT_VYUY_422:
687 	case RGA_FORMAT_YUYV_422:
688 	case RGA_FORMAT_UYVY_422:
689 	/* YUV 420 packed according to the arrangement of YUV422 packed. */
690 	case RGA_FORMAT_YVYU_420:
691 	case RGA_FORMAT_VYUY_420:
692 	case RGA_FORMAT_YUYV_420:
693 	case RGA_FORMAT_UYVY_420:
694 		yrgb = w * h * 2;
695 		break;
696 	/* YUV FORMAT */
697 	case RGA_FORMAT_YCbCr_422_SP:
698 	case RGA_FORMAT_YCrCb_422_SP:
699 	/* 10bit format stride is externally configured. */
700 	case RGA_FORMAT_YCbCr_422_SP_10B:
701 	case RGA_FORMAT_YCrCb_422_SP_10B:
702 		yrgb = w * h;
703 		uv = w * h;
704 		break;
705 	case RGA_FORMAT_YCbCr_422_P:
706 	case RGA_FORMAT_YCrCb_422_P:
707 		yrgb = w * h;
708 		uv = (w * h) >> 1;
709 		v = uv;
710 		break;
711 	case RGA_FORMAT_YCbCr_420_SP:
712 	case RGA_FORMAT_YCrCb_420_SP:
713 	/* 10bit format stride is externally configured. */
714 	case RGA_FORMAT_YCbCr_420_SP_10B:
715 	case RGA_FORMAT_YCrCb_420_SP_10B:
716 		yrgb = w * h;
717 		uv = (w * h) >> 1;
718 		break;
719 	case RGA_FORMAT_YCbCr_420_P:
720 	case RGA_FORMAT_YCrCb_420_P:
721 		yrgb = w * h;
722 		uv = (w * h) >> 2;
723 		v = uv;
724 		break;
725 	case RGA_FORMAT_YCbCr_400:
726 		yrgb = w * h;
727 		break;
728 	case RGA_FORMAT_Y4:
729 		yrgb = (w * h) >> 1;
730 		break;
731 	default:
732 		pr_err("Unsuport format [0x%x]\n", format);
733 		return -EFAULT;
734 	}
735 
736 	if (yrgb_size != NULL)
737 		*yrgb_size = yrgb;
738 	if (uv_size != NULL)
739 		*uv_size = uv;
740 	if (v_size != NULL)
741 		*v_size = v;
742 
743 	return (yrgb + uv + v);
744 }
745 
rga_dump_memory_parm(struct rga_memory_parm * parm)746 void rga_dump_memory_parm(struct rga_memory_parm *parm)
747 {
748 	pr_info("memory param: w = %d, h = %d, f = %s(0x%x), size = %d\n",
749 		parm->width, parm->height, rga_get_format_name(parm->format),
750 		parm->format, parm->size);
751 }
752 
rga_dump_external_buffer(struct rga_external_buffer * buffer)753 void rga_dump_external_buffer(struct rga_external_buffer *buffer)
754 {
755 	pr_info("external: memory = 0x%lx, type = %s\n",
756 		(unsigned long)buffer->memory, rga_get_memory_type_str(buffer->type));
757 	rga_dump_memory_parm(&buffer->memory_parm);
758 }
759