hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/video/rockchip/vehicle/vehicle_flinger.c
....@@ -46,7 +46,6 @@
4646 static int vehicle_dump_cif;
4747 static int vehicle_dump_rga;
4848 static int vehicle_dump_vop;
49
-static bool nv12_display = true;
5049
5150 enum force_value {
5251 FORCE_WIDTH = 1920,
....@@ -326,8 +325,11 @@
326325 if (inited)
327326 return 0;
328327
328
+ VEHICLE_INFO("%s: v_cfg->rotate_mirror(0x%x)\n", __func__, v_cfg->rotate_mirror);
329
+
329330 // if (FORCE_ROTATION == RGA_TRANSFORM_ROT_270 || FORCE_ROTATION == RGA_TRANSFORM_ROT_90) {
330
- if (v_cfg->rotate_mirror == 0x01 || v_cfg->rotate_mirror == 0x04) {
331
+ if ((v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x01 ||
332
+ (v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x04) {
331333 w = FORCE_WIDTH;
332334 h = ALIGN(FORCE_HEIGHT, 64);
333335 s = ALIGN(FORCE_HEIGHT, 64);
....@@ -387,7 +389,8 @@
387389 // f = HAL_PIXEL_FORMAT_RGBX_8888;
388390 // if (FORCE_ROTATION == RGA_TRANSFORM_ROT_270 ||
389391 // FORCE_ROTATION == RGA_TRANSFORM_ROT_90)
390
- if (v_cfg->rotate_mirror == 0x01 || v_cfg->rotate_mirror == 0x04)
392
+ if ((v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x01 ||
393
+ (v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) == 0x04)
391394 ret = rk_flinger_alloc_buffer(flg, buffer, h, w, s, f);
392395 else
393396 ret = rk_flinger_alloc_buffer(flg, buffer, w, h, s, f);
....@@ -528,7 +531,7 @@
528531 src_rect = &buffer->src;
529532 dst_rect = &buffer->dst;
530533
531
- switch (buffer->rotation) {
534
+ switch (buffer->rotation & RGA_TRANSFORM_ROT_MASK) {
532535 case RGA_TRANSFORM_ROT_90:
533536 case RGA_TRANSFORM_ROT_270:
534537 dst_rect->x = src_rect->x;
....@@ -662,7 +665,10 @@
662665 rga_request.rotate_mode = 0;
663666 rga_request.sina = 0;
664667 rga_request.cosa = 0;
665
- rga_request.yuv2rgb_mode = 0x1 << 0; // limit range
668
+
669
+ rga_request.yuv2rgb_mode = 0x0 << 0; // yuvtoyuv config 0
670
+ /* yuv to rgb color space transform if need */
671
+ //rga_request.yuv2rgb_mode = 0x1 << 0; // limit range
666672 //rga_request.yuv2rgb_mode = 0x2 << 0; // full range
667673
668674 rga_request.src.act_w = src_buffer->src.w;
....@@ -685,7 +691,7 @@
685691 rga_request.dst.yrgb_addr = dst_buffer->fd;
686692 rga_request.dst.uv_addr = 0;
687693 rga_request.dst.v_addr = 0;
688
- rga_request.dst.format = RGA_FORMAT_RGBX_8888;
694
+ rga_request.dst.format = RGA_FORMAT_YCrCb_420_SP;
689695
690696 rga_request.scale_mode = 1;
691697
....@@ -834,7 +840,7 @@
834840 rga_request.rotate_mode = 0;
835841 rga_request.sina = 0;
836842 rga_request.cosa = 0;
837
- rga_request.dst.vir_w = ALIGN(ds, 64);
843
+ rga_request.dst.vir_w = ds;
838844 rga_request.dst.vir_h = dh;
839845 rga_request.dst.act_w = dw;
840846 rga_request.dst.act_h = dh;
....@@ -843,7 +849,7 @@
843849 break;
844850 case RGA_TRANSFORM_FLIP_H:/*x mirror*/
845851 rga_request.rotate_mode = 2;
846
- rga_request.dst.vir_w = ALIGN(ds, 64);
852
+ rga_request.dst.vir_w = ds;
847853 rga_request.dst.vir_h = dh;
848854 rga_request.dst.act_w = dw;
849855 rga_request.dst.act_h = dh;
....@@ -852,7 +858,7 @@
852858 break;
853859 case RGA_TRANSFORM_FLIP_V:/*y mirror*/
854860 rga_request.rotate_mode = 3;
855
- rga_request.dst.vir_w = ALIGN(ds, 64);
861
+ rga_request.dst.vir_w = ds;
856862 rga_request.dst.vir_h = dh;
857863 rga_request.dst.act_w = dw;
858864 rga_request.dst.act_h = dh;
....@@ -863,7 +869,7 @@
863869 rga_request.rotate_mode = 1;
864870 rga_request.sina = 65536;
865871 rga_request.cosa = 0;
866
- rga_request.dst.vir_w = ALIGN(ds, 64);
872
+ rga_request.dst.vir_w = ds;
867873 rga_request.dst.vir_h = dh;
868874 rga_request.dst.act_w = dh;
869875 rga_request.dst.act_h = dw;
....@@ -874,7 +880,7 @@
874880 rga_request.rotate_mode = 1;
875881 rga_request.sina = 0;
876882 rga_request.cosa = -65536;
877
- rga_request.dst.vir_w = ALIGN(ds, 64);
883
+ rga_request.dst.vir_w = ds;
878884 rga_request.dst.vir_h = dh;
879885 rga_request.dst.act_w = dw;
880886 rga_request.dst.act_h = dh;
....@@ -885,7 +891,7 @@
885891 rga_request.rotate_mode = 1;
886892 rga_request.sina = -65536;
887893 rga_request.cosa = 0;
888
- rga_request.dst.vir_w = ALIGN(ds, 64);
894
+ rga_request.dst.vir_w = ds;
889895 rga_request.dst.vir_h = dh;
890896 rga_request.dst.act_w = dh;
891897 rga_request.dst.act_h = dw;
....@@ -896,7 +902,7 @@
896902 rga_request.rotate_mode = 0;
897903 rga_request.sina = 0;
898904 rga_request.cosa = 0;
899
- rga_request.dst.vir_w = ALIGN(ds, 64);
905
+ rga_request.dst.vir_w = ds;
900906 rga_request.dst.vir_h = dh;
901907 rga_request.dst.act_w = dw;
902908 rga_request.dst.act_h = dh;
....@@ -952,19 +958,41 @@
952958
953959 static int rk_flinger_rga_render(struct flinger *flinger,
954960 struct graphic_buffer *src_buffer,
955
- struct graphic_buffer *dst_buffer)
961
+ struct graphic_buffer *dst_buffer,
962
+ struct graphic_buffer *tmp_buffer)
956963 {
964
+ int rotation;
965
+
957966 if (!flinger || !src_buffer || !dst_buffer)
958967 return -EINVAL;
959968
960969 if (dst_buffer && dst_buffer->rel_fence)
961970 dst_buffer->rel_fence = NULL;
962971
963
- rk_flinger_rga_blit(flinger, src_buffer, dst_buffer);
964
- rk_flinger_fill_buffer_rects(dst_buffer, &src_buffer->dst,
965
- &src_buffer->dst);
966
- dst_buffer->src.f = src_buffer->dst.f;
972
+ if ((src_buffer->rotation & RGA_TRANSFORM_ROT_MASK) &&
973
+ (src_buffer->rotation & RGA_TRANSFORM_FLIP_MASK)) {
967974
975
+ rotation = flinger->v_cfg.rotate_mirror;
976
+ /* 1. rotate */
977
+ src_buffer->rotation = rotation & RGA_TRANSFORM_ROT_MASK;
978
+ rk_flinger_rga_blit(flinger, src_buffer, tmp_buffer);
979
+ rk_flinger_fill_buffer_rects(tmp_buffer, &src_buffer->dst,
980
+ &src_buffer->dst);
981
+ tmp_buffer->src.f = src_buffer->dst.f;
982
+ tmp_buffer->rotation = rotation & RGA_TRANSFORM_FLIP_MASK;
983
+ /* 2. mirror */
984
+ rk_flinger_rga_blit(flinger, tmp_buffer, dst_buffer);
985
+ rk_flinger_fill_buffer_rects(dst_buffer, &tmp_buffer->dst,
986
+ &tmp_buffer->dst);
987
+ dst_buffer->src.f = src_buffer->dst.f;
988
+
989
+ src_buffer->rotation = rotation;
990
+ } else {
991
+ rk_flinger_rga_blit(flinger, src_buffer, dst_buffer);
992
+ rk_flinger_fill_buffer_rects(dst_buffer, &src_buffer->dst,
993
+ &src_buffer->dst);
994
+ dst_buffer->src.f = src_buffer->dst.f;
995
+ }
968996 /* save rga out buffer */
969997 if (vehicle_dump_rga) {
970998 struct file *filep = NULL;
....@@ -1074,6 +1102,7 @@
10741102 rockchip_drm_direct_show_commit(flinger->drm_dev, &commit_info);
10751103 }
10761104
1105
+static int drop_frames_number;
10771106 static int rk_flinger_vop_show(struct flinger *flinger,
10781107 struct graphic_buffer *buffer)
10791108 {
....@@ -1082,6 +1111,12 @@
10821111
10831112 VEHICLE_DG("flinger vop show buffer wxh(%zux%zu)\n",
10841113 buffer->src.w, buffer->src.h);
1114
+ if (drop_frames_number > 0) {
1115
+ VEHICLE_INFO("%s discard the frame num(%d)!\n", __func__, drop_frames_number);
1116
+ drop_frames_number--;
1117
+ return 0;
1118
+ }
1119
+
10851120 if (!flinger->running)
10861121 return 0;
10871122
....@@ -1160,9 +1195,11 @@
11601195 FORCE_XOFFSET, FORCE_YOFFSET,
11611196 v_cfg->width, v_cfg->height,
11621197 v_cfg->width, FORCE_FORMAT);
1163
- rk_flinger_set_buffer_rotation(buffer, FORCE_ROTATION);
1198
+ rk_flinger_set_buffer_rotation(buffer, v_cfg->rotate_mirror);
11641199 rk_flinger_cacultae_dst_rect_by_rotation(buffer);
11651200 buffer->dst.f = buffer->src.f;
1201
+ VEHICLE_INFO("buffer[%d]->rotation(%d).\n",
1202
+ i, buffer->rotation);
11661203 }
11671204 }
11681205 }
....@@ -1294,20 +1331,12 @@
12941331 VEHICLE_DG("it is ypbpr signal\n");
12951332 iep_buffer = &(flg->target_buffer[NUM_TARGET_BUFFERS - 1]);
12961333 iep_buffer->state = ACQUIRE;
1297
- //scaler by rga for rgbx8888/rgb888/rgb565 display
1298
- if (!nv12_display) {
1299
- rk_flinger_rga_render(flg, src_buffer, iep_buffer);
1300
- src_buffer->state = FREE;
1301
- rk_flinger_rga_scaler(flg, iep_buffer, dst_buffer);
1302
- iep_buffer->state = FREE;
1303
- rk_flinger_vop_show(flg, dst_buffer);
1304
- } else {
1305
- rk_flinger_rga_render(flg, src_buffer, dst_buffer);
1306
- src_buffer->state = FREE;
1307
- rk_flinger_vop_show(flg, dst_buffer);
1308
- // rk_flinger_vop_show(flg, src_buffer);
1309
- }
1310
-
1334
+ //scaler by rga to force widthxheight display
1335
+ rk_flinger_rga_render(flg, src_buffer, iep_buffer, dst_buffer);
1336
+ src_buffer->state = FREE;
1337
+ rk_flinger_rga_scaler(flg, iep_buffer, dst_buffer);
1338
+ iep_buffer->state = FREE;
1339
+ rk_flinger_vop_show(flg, dst_buffer);
13111340 for (i = 0; i < NUM_TARGET_BUFFERS; i++) {
13121341 buffer = &(flinger->target_buffer[i]);
13131342 if (buffer->state == DISPLAY)
....@@ -1318,7 +1347,7 @@
13181347 } else {
13191348 // cvbs
13201349 VEHICLE_DG("it is a cvbs signal\n");
1321
- rk_flinger_rga_render(flg, src_buffer, dst_buffer);
1350
+ rk_flinger_rga_render(flg, src_buffer, dst_buffer, iep_buffer);
13221351 src_buffer->state = FREE;
13231352 rk_flinger_iep_deinterlace(flg, dst_buffer, iep_buffer);
13241353 dst_buffer->state = FREE;
....@@ -1384,18 +1413,27 @@
13841413
13851414 static bool vehicle_rotation_param_check(struct vehicle_cfg *v_cfg)
13861415 {
1387
- switch (v_cfg->rotate_mirror) {
1416
+ switch (v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK) {
13881417 case RGA_TRANSFORM_ROT_90:
13891418 case RGA_TRANSFORM_ROT_270:
13901419 case RGA_TRANSFORM_ROT_0:
13911420 case RGA_TRANSFORM_ROT_180:
1421
+ return true;
1422
+ default:
1423
+ VEHICLE_INFO("invalid rotate-mirror param %d\n",
1424
+ v_cfg->rotate_mirror);
1425
+ v_cfg->rotate_mirror = v_cfg->rotate_mirror & RGA_TRANSFORM_FLIP_MASK;
1426
+ return false;
1427
+ }
1428
+
1429
+ switch (v_cfg->rotate_mirror & RGA_TRANSFORM_FLIP_MASK) {
13921430 case RGA_TRANSFORM_FLIP_H:
13931431 case RGA_TRANSFORM_FLIP_V:
13941432 return true;
13951433 default:
13961434 VEHICLE_INFO("invalid rotate-mirror param %d\n",
13971435 v_cfg->rotate_mirror);
1398
- v_cfg->rotate_mirror = 0;
1436
+ v_cfg->rotate_mirror = v_cfg->rotate_mirror & RGA_TRANSFORM_ROT_MASK;
13991437 return false;
14001438 }
14011439 }
....@@ -1450,6 +1488,7 @@
14501488 flg->cvbs_field_count = 0;
14511489 memcpy(&flg->v_cfg, v_cfg, sizeof(struct vehicle_cfg));
14521490 flg->running = true;
1491
+ drop_frames_number = v_cfg->drop_frames;
14531492
14541493 return 0;
14551494 }
....@@ -1475,9 +1514,8 @@
14751514 int i;
14761515
14771516 src_buffer = NULL;
1478
- found = last_src_index + 1;
14791517 for (i = 1; i < NUM_SOURCE_BUFFERS; i++) {
1480
- found = (found + i) % NUM_SOURCE_BUFFERS;
1518
+ found = (last_src_index + i) % NUM_SOURCE_BUFFERS;
14811519 VEHICLE_DG("%s,flg->source_buffer[%d].state(%d)",
14821520 __func__, found, flg->source_buffer[found].state);
14831521 if (flg->source_buffer[found].state == FREE) {