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