.. | .. |
---|
8 | 8 | #define pr_fmt(fmt) "rga3_reg: " fmt |
---|
9 | 9 | |
---|
10 | 10 | #include "rga3_reg_info.h" |
---|
| 11 | +#include "rga_dma_buf.h" |
---|
| 12 | +#include "rga_iommu.h" |
---|
11 | 13 | #include "rga_common.h" |
---|
12 | 14 | #include "rga_debugger.h" |
---|
13 | 15 | #include "rga_hw_config.h" |
---|
.. | .. |
---|
91 | 93 | dw = msg->win0.dst_act_w; |
---|
92 | 94 | dh = msg->win0.dst_act_h; |
---|
93 | 95 | |
---|
94 | | - if (msg->win0.rotate_mode != 0) { |
---|
95 | | - if (rotate_mode) { |
---|
96 | | - sh = msg->win0.src_act_w; |
---|
97 | | - sw = msg->win0.src_act_h; |
---|
98 | | - } else { |
---|
99 | | - sw = msg->win0.src_act_w; |
---|
100 | | - sh = msg->win0.src_act_h; |
---|
101 | | - } |
---|
| 96 | + if (rotate_mode) { |
---|
| 97 | + sh = msg->win0.src_act_w; |
---|
| 98 | + sw = msg->win0.src_act_h; |
---|
| 99 | + } else { |
---|
| 100 | + sw = msg->win0.src_act_w; |
---|
| 101 | + sh = msg->win0.src_act_h; |
---|
102 | 102 | } |
---|
103 | 103 | |
---|
104 | 104 | if (sw > dw) { |
---|
.. | .. |
---|
289 | 289 | } |
---|
290 | 290 | |
---|
291 | 291 | /* rotate & mirror */ |
---|
292 | | - if (msg->win1.yrgb_addr == 0) { |
---|
| 292 | + if (msg->win0.rotate_mode == 1) { |
---|
293 | 293 | reg = |
---|
294 | 294 | ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT)) | |
---|
295 | 295 | (s_RGA3_WIN0_RD_CTRL_SW_WIN0_ROT(rotate_mode))); |
---|
.. | .. |
---|
299 | 299 | reg = |
---|
300 | 300 | ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR)) | |
---|
301 | 301 | (s_RGA3_WIN0_RD_CTRL_SW_WIN0_YMIRROR(ymirror))); |
---|
302 | | - |
---|
303 | | - /* scale */ |
---|
304 | | - *bRGA3_WIN0_SCL_FAC = param_x | param_y << 16; |
---|
305 | | - |
---|
306 | | - reg = |
---|
307 | | - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY)) | |
---|
308 | | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(x_by))); |
---|
309 | | - reg = |
---|
310 | | - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP)) | |
---|
311 | | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(x_up))); |
---|
312 | | - reg = |
---|
313 | | - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY)) | |
---|
314 | | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(y_by))); |
---|
315 | | - reg = |
---|
316 | | - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP)) | |
---|
317 | | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(y_up))); |
---|
318 | | - } else { |
---|
319 | | - reg = |
---|
320 | | - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY)) | |
---|
321 | | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(1))); |
---|
322 | | - reg = |
---|
323 | | - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP)) | |
---|
324 | | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(0))); |
---|
325 | | - reg = |
---|
326 | | - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY)) | |
---|
327 | | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(1))); |
---|
328 | | - reg = |
---|
329 | | - ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP)) | |
---|
330 | | - (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(0))); |
---|
331 | 302 | } |
---|
| 303 | + |
---|
| 304 | + /* scale */ |
---|
| 305 | + *bRGA3_WIN0_SCL_FAC = param_x | param_y << 16; |
---|
| 306 | + |
---|
| 307 | + reg = |
---|
| 308 | + ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY)) | |
---|
| 309 | + (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_BY(x_by))); |
---|
| 310 | + reg = |
---|
| 311 | + ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP)) | |
---|
| 312 | + (s_RGA3_WIN0_RD_CTRL_SW_WIN0_HOR_UP(x_up))); |
---|
| 313 | + reg = |
---|
| 314 | + ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY)) | |
---|
| 315 | + (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_BY(y_by))); |
---|
| 316 | + reg = |
---|
| 317 | + ((reg & (~m_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP)) | |
---|
| 318 | + (s_RGA3_WIN0_RD_CTRL_SW_WIN0_VER_UP(y_up))); |
---|
332 | 319 | |
---|
333 | 320 | /* rd_mode */ |
---|
334 | 321 | reg = |
---|
.. | .. |
---|
357 | 344 | |
---|
358 | 345 | *bRGA3_WIN0_RD_CTRL = reg; |
---|
359 | 346 | |
---|
360 | | - /* stride need align to 16 */ |
---|
361 | | - if (msg->win0.rd_mode != 1) |
---|
| 347 | + switch (msg->win0.rd_mode) { |
---|
| 348 | + case 0: /* raster */ |
---|
362 | 349 | stride = (((msg->win0.vir_w * pixel_width) + 15) & ~15) >> 2; |
---|
363 | | - else |
---|
364 | | - stride = ((msg->win0.vir_w + 15) & ~15) >> 2; |
---|
| 350 | + if (rga_is_yuv420_semi_planar_format(msg->win0.format)) |
---|
| 351 | + uv_stride = ((msg->win0.vir_w + 15) & ~15) >> 2; |
---|
| 352 | + else |
---|
| 353 | + uv_stride = stride; |
---|
| 354 | + break; |
---|
365 | 355 | |
---|
366 | | - if (msg->win0.format == RGA_FORMAT_YCbCr_420_SP |
---|
367 | | - || msg->win0.format == RGA_FORMAT_YCrCb_420_SP |
---|
368 | | - || msg->win0.format == RGA_FORMAT_YCbCr_420_SP_10B |
---|
369 | | - || msg->win0.format == RGA_FORMAT_YCrCb_420_SP_10B) |
---|
370 | | - uv_stride = ((msg->win0.vir_w + 15) & ~15) >> 2; |
---|
371 | | - else |
---|
372 | | - uv_stride = stride; |
---|
| 356 | + case 1: /* fbc */ |
---|
| 357 | + stride = ((msg->win0.vir_w + 15) & ~15) >> 2; |
---|
| 358 | + if (rga_is_yuv420_semi_planar_format(msg->win0.format)) |
---|
| 359 | + uv_stride = ((msg->win0.vir_w + 15) & ~15) >> 2; |
---|
| 360 | + else |
---|
| 361 | + uv_stride = stride; |
---|
| 362 | + break; |
---|
| 363 | + |
---|
| 364 | + case 2: /* tile 8*8 */ |
---|
| 365 | + /* |
---|
| 366 | + * tile 8*8 mode 8 lines of data are read/written at one time, |
---|
| 367 | + * so stride needs * 8. YUV420 only has 4 lines of UV data, so |
---|
| 368 | + * it needs to >>1. |
---|
| 369 | + */ |
---|
| 370 | + stride = (((msg->win0.vir_w * pixel_width * 8) + 15) & ~15) >> 2; |
---|
| 371 | + if (rga_is_yuv420_semi_planar_format(msg->win0.format)) |
---|
| 372 | + uv_stride = ((((msg->win0.vir_w * 8) + 15) & ~15) >> 1) >> 2; |
---|
| 373 | + else |
---|
| 374 | + uv_stride = stride; |
---|
| 375 | + break; |
---|
| 376 | + } |
---|
373 | 377 | |
---|
374 | 378 | *bRGA3_WIN0_Y_BASE = (u32) msg->win0.yrgb_addr; |
---|
375 | 379 | *bRGA3_WIN0_U_BASE = (u32) msg->win0.uv_addr; |
---|
.. | .. |
---|
386 | 390 | */ |
---|
387 | 391 | |
---|
388 | 392 | /* do not use win0 src size except fbcd */ |
---|
389 | | - *bRGA3_WIN0_SRC_SIZE = (msg->win0.src_act_w + |
---|
390 | | - msg->win0.x_offset) | ((msg->win0.y_offset + |
---|
391 | | - msg->win0.src_act_h) << 16); |
---|
| 393 | + /* in FBCD, src_width needs to be aligned at 16 */ |
---|
| 394 | + *bRGA3_WIN0_SRC_SIZE = ALIGN(msg->win0.src_act_w + msg->win0.x_offset, 16) | |
---|
| 395 | + (ALIGN(msg->win0.y_offset + msg->win0.src_act_h, 16) << 16); |
---|
392 | 396 | *bRGA3_WIN0_ACT_SIZE = |
---|
393 | 397 | msg->win0.src_act_w | (msg->win0.src_act_h << 16); |
---|
394 | 398 | *bRGA3_WIN0_DST_SIZE = |
---|
.. | .. |
---|
721 | 725 | |
---|
722 | 726 | *bRGA3_WIN1_RD_CTRL = reg; |
---|
723 | 727 | |
---|
724 | | - /* stride need align to 16 */ |
---|
725 | | - if (msg->win1.rd_mode != 1) |
---|
| 728 | + switch (msg->win1.rd_mode) { |
---|
| 729 | + case 0: /* raster */ |
---|
726 | 730 | stride = (((msg->win1.vir_w * pixel_width) + 15) & ~15) >> 2; |
---|
727 | | - else |
---|
728 | | - stride = ((msg->win1.vir_w + 15) & ~15) >> 2; |
---|
| 731 | + if (rga_is_yuv420_semi_planar_format(msg->win1.format)) |
---|
| 732 | + uv_stride = ((msg->win1.vir_w + 15) & ~15) >> 2; |
---|
| 733 | + else |
---|
| 734 | + uv_stride = stride; |
---|
| 735 | + break; |
---|
729 | 736 | |
---|
730 | | - if (msg->win1.format == RGA_FORMAT_YCbCr_420_SP |
---|
731 | | - || msg->win1.format == RGA_FORMAT_YCrCb_420_SP |
---|
732 | | - || msg->win1.format == RGA_FORMAT_YCbCr_420_SP_10B |
---|
733 | | - || msg->win1.format == RGA_FORMAT_YCrCb_420_SP_10B) |
---|
734 | | - uv_stride = ((msg->win1.vir_w + 15) & ~15) >> 2; |
---|
735 | | - else |
---|
736 | | - uv_stride = stride; |
---|
| 737 | + case 1: /* fbc */ |
---|
| 738 | + stride = ((msg->win1.vir_w + 15) & ~15) >> 2; |
---|
| 739 | + if (rga_is_yuv420_semi_planar_format(msg->win1.format)) |
---|
| 740 | + uv_stride = ((msg->win1.vir_w + 15) & ~15) >> 2; |
---|
| 741 | + else |
---|
| 742 | + uv_stride = stride; |
---|
| 743 | + break; |
---|
| 744 | + |
---|
| 745 | + case 2: /* tile 8*8 */ |
---|
| 746 | + stride = (((msg->win1.vir_w * pixel_width * 8) + 15) & ~15) >> 2; |
---|
| 747 | + if (rga_is_yuv420_semi_planar_format(msg->win1.format)) |
---|
| 748 | + uv_stride = ((((msg->win1.vir_w * 8) + 15) & ~15) >> 1) >> 2; |
---|
| 749 | + else |
---|
| 750 | + uv_stride = stride; |
---|
| 751 | + break; |
---|
| 752 | + } |
---|
737 | 753 | |
---|
738 | 754 | *bRGA3_WIN1_Y_BASE = (u32) msg->win1.yrgb_addr; |
---|
739 | 755 | *bRGA3_WIN1_U_BASE = (u32) msg->win1.uv_addr; |
---|
.. | .. |
---|
947 | 963 | *bRGA3_WR_RD_CTRL = reg; |
---|
948 | 964 | *bRGA3_WR_FBCD_CTRL = fbcd_reg; |
---|
949 | 965 | |
---|
950 | | - /* stride need align to 16 */ |
---|
951 | | - if (msg->wr.rd_mode != 1) { |
---|
| 966 | + switch (msg->wr.rd_mode) { |
---|
| 967 | + case 0: /* raster */ |
---|
952 | 968 | stride = (((msg->wr.vir_w * pixel_width) + 15) & ~15) >> 2; |
---|
953 | | - *bRGA3_WR_U_BASE = (u32) msg->wr.uv_addr; |
---|
954 | 969 | uv_stride = ((msg->wr.vir_w + 15) & ~15) >> 2; |
---|
955 | | - } else { |
---|
| 970 | + |
---|
| 971 | + *bRGA3_WR_U_BASE = (u32) msg->wr.uv_addr; |
---|
| 972 | + |
---|
| 973 | + break; |
---|
| 974 | + |
---|
| 975 | + case 1: /* fbc */ |
---|
956 | 976 | stride = ((msg->wr.vir_w + 15) & ~15) >> 2; |
---|
957 | 977 | /* need to calculate fbcd header size */ |
---|
958 | 978 | vir_h = ((msg->wr.vir_h + 15) & ~15); |
---|
959 | | - *bRGA3_WR_U_BASE = (u32) (msg->wr.uv_addr + ((stride * vir_h)>>2)); |
---|
| 979 | + |
---|
960 | 980 | /* RGBA8888 */ |
---|
961 | 981 | if (wr_format == 0x6) |
---|
962 | 982 | uv_stride = ((msg->wr.vir_w + 15) & ~15); |
---|
.. | .. |
---|
972 | 992 | /* yuv422 10bit */ |
---|
973 | 993 | else if (wr_format == 0x3) |
---|
974 | 994 | uv_stride = (((msg->wr.vir_w + 15) & ~15) >> 3) * 5; |
---|
| 995 | + |
---|
| 996 | + *bRGA3_WR_U_BASE = (u32) (msg->wr.uv_addr + ((stride * vir_h)>>2)); |
---|
| 997 | + |
---|
| 998 | + break; |
---|
| 999 | + |
---|
| 1000 | + case 2: /* tile 8*8 */ |
---|
| 1001 | + stride = (((msg->wr.vir_w * pixel_width * 8) + 15) & ~15) >> 2; |
---|
| 1002 | + if (rga_is_yuv420_semi_planar_format(msg->win0.format)) |
---|
| 1003 | + uv_stride = ((((msg->wr.vir_w * 8) + 15) & ~15) >> 1) >> 2; |
---|
| 1004 | + else |
---|
| 1005 | + uv_stride = stride; |
---|
| 1006 | + |
---|
| 1007 | + *bRGA3_WR_U_BASE = (u32) msg->wr.uv_addr; |
---|
| 1008 | + break; |
---|
975 | 1009 | } |
---|
976 | 1010 | |
---|
977 | 1011 | *bRGA3_WR_Y_BASE = (u32) msg->wr.yrgb_addr; |
---|
.. | .. |
---|
994 | 1028 | u32 *bRGA3_OVLP_OFF; |
---|
995 | 1029 | |
---|
996 | 1030 | u32 reg; |
---|
| 1031 | + union rga3_color_ctrl top_color_ctrl, bottom_color_ctrl; |
---|
| 1032 | + union rga3_alpha_ctrl top_alpha_ctrl, bottom_alpha_ctrl; |
---|
| 1033 | + struct rga_alpha_config *config; |
---|
997 | 1034 | |
---|
998 | 1035 | bRGA_OVERLAP_TOP_CTRL = (u32 *) (base + RGA3_OVLP_TOP_CTRL_OFFSET); |
---|
999 | 1036 | bRGA_OVERLAP_BOT_CTRL = (u32 *) (base + RGA3_OVLP_BOT_CTRL_OFFSET); |
---|
.. | .. |
---|
1005 | 1042 | |
---|
1006 | 1043 | /* Alpha blend */ |
---|
1007 | 1044 | /*bot -> win0(dst), top -> win1(src). */ |
---|
1008 | | - reg = 0; |
---|
1009 | | - reg = |
---|
1010 | | - ((reg & (~m_RGA3_OVLP_TOP_CTRL_SW_TOP_COLOR_M0)) | |
---|
1011 | | - (s_RGA3_OVLP_TOP_CTRL_SW_TOP_COLOR_M0 |
---|
1012 | | - (msg->alpha_mode_0 >> 7))); |
---|
1013 | | - reg = |
---|
1014 | | - ((reg & (~m_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_M0)) | |
---|
1015 | | - (s_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_M0 |
---|
1016 | | - (msg->alpha_mode_0 >> 0))); |
---|
1017 | | - reg = |
---|
1018 | | - ((reg & (~m_RGA3_OVLP_TOP_CTRL_SW_TOP_BLEND_M0)) | |
---|
1019 | | - (s_RGA3_OVLP_TOP_CTRL_SW_TOP_BLEND_M0 |
---|
1020 | | - (msg->alpha_mode_0 >> 1))); |
---|
1021 | | - reg = |
---|
1022 | | - ((reg & (~m_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_CAL_M0)) | |
---|
1023 | | - (s_RGA3_OVLP_TOP_CTRL_SW_TOP_ALPHA_CAL_M0 |
---|
1024 | | - (msg->alpha_mode_0 >> 3))); |
---|
1025 | | - reg = |
---|
1026 | | - ((reg & (~m_RGA3_OVLP_TOP_CTRL_SW_TOP_FACTOR_M0)) | |
---|
1027 | | - (s_RGA3_OVLP_TOP_CTRL_SW_TOP_FACTOR_M0 |
---|
1028 | | - (msg->alpha_mode_0 >> 4))); |
---|
1029 | | - reg = |
---|
1030 | | - ((reg & (~m_RGA3_OVLP_TOP_CTRL_SW_TOP_GLOBAL_ALPHA)) | |
---|
1031 | | - (s_RGA3_OVLP_TOP_CTRL_SW_TOP_GLOBAL_ALPHA |
---|
1032 | | - (msg->win1_a_global_val))); |
---|
1033 | | - *bRGA_OVERLAP_TOP_CTRL = reg; |
---|
| 1045 | + top_color_ctrl.value = 0; |
---|
| 1046 | + bottom_color_ctrl.value = 0; |
---|
| 1047 | + top_alpha_ctrl.value = 0; |
---|
| 1048 | + bottom_alpha_ctrl.value = 0; |
---|
| 1049 | + config = &msg->alpha_config; |
---|
1034 | 1050 | |
---|
1035 | | - reg = 0; |
---|
1036 | | - reg = |
---|
1037 | | - ((reg & (~m_RGA3_OVLP_BOT_CTRL_SW_BOT_COLOR_M0)) | |
---|
1038 | | - (s_RGA3_OVLP_BOT_CTRL_SW_BOT_COLOR_M0 |
---|
1039 | | - (msg->alpha_mode_0 >> 15))); |
---|
1040 | | - reg = |
---|
1041 | | - ((reg & (~m_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_M0)) | |
---|
1042 | | - (s_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_M0 |
---|
1043 | | - (msg->alpha_mode_0 >> 8))); |
---|
1044 | | - reg = |
---|
1045 | | - ((reg & (~m_RGA3_OVLP_BOT_CTRL_SW_BOT_BLEND_M0)) | |
---|
1046 | | - (s_RGA3_OVLP_BOT_CTRL_SW_BOT_BLEND_M0 |
---|
1047 | | - (msg->alpha_mode_0 >> 9))); |
---|
1048 | | - reg = |
---|
1049 | | - ((reg & (~m_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_CAL_M0)) | |
---|
1050 | | - (s_RGA3_OVLP_BOT_CTRL_SW_BOT_ALPHA_CAL_M0 |
---|
1051 | | - (msg->alpha_mode_0 >> 11))); |
---|
1052 | | - reg = |
---|
1053 | | - ((reg & (~m_RGA3_OVLP_BOT_CTRL_SW_BOT_FACTOR_M0)) | |
---|
1054 | | - (s_RGA3_OVLP_BOT_CTRL_SW_BOT_FACTOR_M0 |
---|
1055 | | - (msg->alpha_mode_0 >> 12))); |
---|
1056 | | - reg = |
---|
1057 | | - ((reg & (~m_RGA3_OVLP_BOT_CTRL_SW_BOT_GLOBAL_ALPHA)) | |
---|
1058 | | - (s_RGA3_OVLP_BOT_CTRL_SW_BOT_GLOBAL_ALPHA |
---|
1059 | | - (msg->win0_a_global_val))); |
---|
1060 | | - *bRGA_OVERLAP_BOT_CTRL = reg; |
---|
| 1051 | + if (config->fg_pixel_alpha_en) |
---|
| 1052 | + top_color_ctrl.bits.blend_mode = |
---|
| 1053 | + config->fg_global_alpha_en ? RGA_ALPHA_PER_PIXEL_GLOBAL : |
---|
| 1054 | + RGA_ALPHA_PER_PIXEL; |
---|
| 1055 | + else |
---|
| 1056 | + top_color_ctrl.bits.blend_mode = RGA_ALPHA_GLOBAL; |
---|
1061 | 1057 | |
---|
1062 | | - reg = 0; |
---|
1063 | | - reg = |
---|
1064 | | - ((reg & (~m_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_M1)) | |
---|
1065 | | - (s_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_M1 |
---|
1066 | | - (msg->alpha_mode_1 >> 0))); |
---|
1067 | | - reg = |
---|
1068 | | - ((reg & (~m_RGA3_OVLP_TOP_ALPHA_SW_TOP_BLEND_M1)) | |
---|
1069 | | - (s_RGA3_OVLP_TOP_ALPHA_SW_TOP_BLEND_M1 |
---|
1070 | | - (msg->alpha_mode_1 >> 1))); |
---|
1071 | | - reg = |
---|
1072 | | - ((reg & (~m_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_CAL_M1)) | |
---|
1073 | | - (s_RGA3_OVLP_TOP_ALPHA_SW_TOP_ALPHA_CAL_M1 |
---|
1074 | | - (msg->alpha_mode_1 >> 3))); |
---|
1075 | | - reg = |
---|
1076 | | - ((reg & (~m_RGA3_OVLP_TOP_ALPHA_SW_TOP_FACTOR_M1)) | |
---|
1077 | | - (s_RGA3_OVLP_TOP_ALPHA_SW_TOP_FACTOR_M1 |
---|
1078 | | - (msg->alpha_mode_1 >> 4))); |
---|
1079 | | - *bRGA_OVERLAP_TOP_ALPHA = reg; |
---|
| 1058 | + if (config->bg_pixel_alpha_en) |
---|
| 1059 | + bottom_color_ctrl.bits.blend_mode = |
---|
| 1060 | + config->bg_global_alpha_en ? RGA_ALPHA_PER_PIXEL_GLOBAL : |
---|
| 1061 | + RGA_ALPHA_PER_PIXEL; |
---|
| 1062 | + else |
---|
| 1063 | + bottom_color_ctrl.bits.blend_mode = RGA_ALPHA_GLOBAL; |
---|
1080 | 1064 | |
---|
1081 | | - reg = 0; |
---|
1082 | | - reg = |
---|
1083 | | - ((reg & (~m_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_M1)) | |
---|
1084 | | - (s_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_M1 |
---|
1085 | | - (msg->alpha_mode_1 >> 8))); |
---|
1086 | | - reg = |
---|
1087 | | - ((reg & (~m_RGA3_OVLP_BOT_ALPHA_SW_BOT_BLEND_M1)) | |
---|
1088 | | - (s_RGA3_OVLP_BOT_ALPHA_SW_BOT_BLEND_M1 |
---|
1089 | | - (msg->alpha_mode_1 >> 9))); |
---|
1090 | | - reg = |
---|
1091 | | - ((reg & (~m_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_CAL_M1)) | |
---|
1092 | | - (s_RGA3_OVLP_BOT_ALPHA_SW_BOT_ALPHA_CAL_M1 |
---|
1093 | | - (msg->alpha_mode_1 >> 11))); |
---|
1094 | | - reg = |
---|
1095 | | - ((reg & (~m_RGA3_OVLP_BOT_ALPHA_SW_BOT_FACTOR_M1)) | |
---|
1096 | | - (s_RGA3_OVLP_BOT_ALPHA_SW_BOT_FACTOR_M1 |
---|
1097 | | - (msg->alpha_mode_1 >> 12))); |
---|
| 1065 | + /* |
---|
| 1066 | + * Since the hardware uses 256 as 1, the original alpha value needs to |
---|
| 1067 | + * be + (alpha >> 7). |
---|
| 1068 | + */ |
---|
| 1069 | + top_color_ctrl.bits.alpha_cal_mode = RGA_ALPHA_SATURATION; |
---|
| 1070 | + bottom_color_ctrl.bits.alpha_cal_mode = RGA_ALPHA_SATURATION; |
---|
1098 | 1071 | |
---|
1099 | | - *bRGA_OVERLAP_BOT_ALPHA = reg; |
---|
| 1072 | + top_color_ctrl.bits.global_alpha = config->fg_global_alpha_value; |
---|
| 1073 | + bottom_color_ctrl.bits.global_alpha = config->bg_global_alpha_value; |
---|
| 1074 | + |
---|
| 1075 | + /* porter duff alpha enable */ |
---|
| 1076 | + switch (config->mode) { |
---|
| 1077 | + case RGA_ALPHA_BLEND_SRC: |
---|
| 1078 | + /* |
---|
| 1079 | + * SRC mode: |
---|
| 1080 | + * Sf = 1, Df = 0; |
---|
| 1081 | + * [Rc,Ra] = [Sc,Sa]; |
---|
| 1082 | + */ |
---|
| 1083 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1084 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_ONE; |
---|
| 1085 | + |
---|
| 1086 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1087 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_ZERO; |
---|
| 1088 | + |
---|
| 1089 | + break; |
---|
| 1090 | + |
---|
| 1091 | + case RGA_ALPHA_BLEND_DST: |
---|
| 1092 | + /* |
---|
| 1093 | + * SRC mode: |
---|
| 1094 | + * Sf = 0, Df = 1; |
---|
| 1095 | + * [Rc,Ra] = [Dc,Da]; |
---|
| 1096 | + */ |
---|
| 1097 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1098 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_ZERO; |
---|
| 1099 | + |
---|
| 1100 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1101 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_ONE; |
---|
| 1102 | + |
---|
| 1103 | + break; |
---|
| 1104 | + |
---|
| 1105 | + case RGA_ALPHA_BLEND_SRC_OVER: |
---|
| 1106 | + /* |
---|
| 1107 | + * SRC-OVER mode: |
---|
| 1108 | + * Sf = 1, Df = (1 - Sa) |
---|
| 1109 | + * [Rc,Ra] = [ Sc + (1 - Sa) * Dc, Sa + (1 - Sa) * Da ] |
---|
| 1110 | + */ |
---|
| 1111 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1112 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_ONE; |
---|
| 1113 | + |
---|
| 1114 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1115 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1116 | + |
---|
| 1117 | + break; |
---|
| 1118 | + |
---|
| 1119 | + case RGA_ALPHA_BLEND_DST_OVER: |
---|
| 1120 | + /* |
---|
| 1121 | + * DST-OVER mode: |
---|
| 1122 | + * Sf = (1 - Da) , Df = 1 |
---|
| 1123 | + * [Rc,Ra] = [ Sc * (1 - Da) + Dc, Sa * (1 - Da) + Da ] |
---|
| 1124 | + */ |
---|
| 1125 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1126 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1127 | + |
---|
| 1128 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1129 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_ONE; |
---|
| 1130 | + |
---|
| 1131 | + break; |
---|
| 1132 | + |
---|
| 1133 | + case RGA_ALPHA_BLEND_SRC_IN: |
---|
| 1134 | + /* |
---|
| 1135 | + * SRC-IN mode: |
---|
| 1136 | + * Sf = Da , Df = 0 |
---|
| 1137 | + * [Rc,Ra] = [ Sc * Da, Sa * Da ] |
---|
| 1138 | + */ |
---|
| 1139 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1140 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE; |
---|
| 1141 | + |
---|
| 1142 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1143 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_ZERO; |
---|
| 1144 | + |
---|
| 1145 | + break; |
---|
| 1146 | + |
---|
| 1147 | + case RGA_ALPHA_BLEND_DST_IN: |
---|
| 1148 | + /* |
---|
| 1149 | + * DST-IN mode: |
---|
| 1150 | + * Sf = 0 , Df = Sa |
---|
| 1151 | + * [Rc,Ra] = [ Dc * Sa, Da * Sa ] |
---|
| 1152 | + */ |
---|
| 1153 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1154 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_ZERO; |
---|
| 1155 | + |
---|
| 1156 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1157 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE; |
---|
| 1158 | + |
---|
| 1159 | + break; |
---|
| 1160 | + |
---|
| 1161 | + case RGA_ALPHA_BLEND_SRC_OUT: |
---|
| 1162 | + /* |
---|
| 1163 | + * SRC-OUT mode: |
---|
| 1164 | + * Sf = (1 - Da) , Df = 0 |
---|
| 1165 | + * [Rc,Ra] = [ Sc * (1 - Da), Sa * (1 - Da) ] |
---|
| 1166 | + */ |
---|
| 1167 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1168 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1169 | + |
---|
| 1170 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1171 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_ZERO; |
---|
| 1172 | + |
---|
| 1173 | + break; |
---|
| 1174 | + |
---|
| 1175 | + case RGA_ALPHA_BLEND_DST_OUT: |
---|
| 1176 | + /* |
---|
| 1177 | + * DST-OUT mode: |
---|
| 1178 | + * Sf = 0 , Df = (1 - Sa) |
---|
| 1179 | + * [Rc,Ra] = [ Dc * (1 - Sa), Da * (1 - Sa) ] |
---|
| 1180 | + */ |
---|
| 1181 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1182 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_ZERO; |
---|
| 1183 | + |
---|
| 1184 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1185 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1186 | + |
---|
| 1187 | + break; |
---|
| 1188 | + |
---|
| 1189 | + case RGA_ALPHA_BLEND_SRC_ATOP: |
---|
| 1190 | + /* |
---|
| 1191 | + * SRC-ATOP mode: |
---|
| 1192 | + * Sf = Da , Df = (1 - Sa) |
---|
| 1193 | + * [Rc,Ra] = [ Sc * Da + Dc * (1 - Sa), Sa * Da + Da * (1 - Sa) ] |
---|
| 1194 | + */ |
---|
| 1195 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1196 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE; |
---|
| 1197 | + |
---|
| 1198 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1199 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1200 | + |
---|
| 1201 | + break; |
---|
| 1202 | + |
---|
| 1203 | + case RGA_ALPHA_BLEND_DST_ATOP: |
---|
| 1204 | + /* |
---|
| 1205 | + * DST-ATOP mode: |
---|
| 1206 | + * Sf = (1 - Da) , Df = Sa |
---|
| 1207 | + * [Rc,Ra] = [ Sc * (1 - Da) + Dc * Sa, Sa * (1 - Da) + Da * Sa ] |
---|
| 1208 | + */ |
---|
| 1209 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1210 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1211 | + |
---|
| 1212 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1213 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE; |
---|
| 1214 | + |
---|
| 1215 | + break; |
---|
| 1216 | + |
---|
| 1217 | + case RGA_ALPHA_BLEND_XOR: |
---|
| 1218 | + /* |
---|
| 1219 | + * DST-XOR mode: |
---|
| 1220 | + * Sf = (1 - Da) , Df = (1 - Sa) |
---|
| 1221 | + * [Rc,Ra] = [ Sc * (1 - Da) + Dc * (1 - Sa), Sa * (1 - Da) + Da * (1 - Sa) ] |
---|
| 1222 | + */ |
---|
| 1223 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1224 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1225 | + |
---|
| 1226 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1227 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1228 | + |
---|
| 1229 | + break; |
---|
| 1230 | + |
---|
| 1231 | + case RGA_ALPHA_BLEND_CLEAR: |
---|
| 1232 | + /* |
---|
| 1233 | + * DST-CLEAR mode: |
---|
| 1234 | + * Sf = 0 , Df = 0 |
---|
| 1235 | + * [Rc,Ra] = [ 0, 0 ] |
---|
| 1236 | + */ |
---|
| 1237 | + top_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1238 | + top_color_ctrl.bits.factor_mode = RGA_ALPHA_ZERO; |
---|
| 1239 | + |
---|
| 1240 | + bottom_color_ctrl.bits.alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1241 | + bottom_color_ctrl.bits.factor_mode = RGA_ALPHA_ZERO; |
---|
| 1242 | + |
---|
| 1243 | + break; |
---|
| 1244 | + |
---|
| 1245 | + default: |
---|
| 1246 | + break; |
---|
| 1247 | + } |
---|
| 1248 | + |
---|
| 1249 | + if (!config->enable && msg->abb_alpha_pass) { |
---|
| 1250 | + /* |
---|
| 1251 | + * enabled by default bot_blend_m1 && bot_alpha_cal_m1 for src channel(win0) |
---|
| 1252 | + * In ABB mode, the number will be fetched according to 16*16, so it needs to |
---|
| 1253 | + * be enabled top_blend_m1 && top_alpha_cal_m1 for dst channel(wr). |
---|
| 1254 | + */ |
---|
| 1255 | + top_color_ctrl.bits.color_mode = RGA_ALPHA_PRE_MULTIPLIED; |
---|
| 1256 | + |
---|
| 1257 | + top_alpha_ctrl.bits.blend_mode = RGA_ALPHA_PER_PIXEL; |
---|
| 1258 | + top_alpha_ctrl.bits.alpha_cal_mode = RGA_ALPHA_NO_SATURATION; |
---|
| 1259 | + |
---|
| 1260 | + bottom_color_ctrl.bits.color_mode = RGA_ALPHA_PRE_MULTIPLIED; |
---|
| 1261 | + |
---|
| 1262 | + bottom_alpha_ctrl.bits.blend_mode = RGA_ALPHA_PER_PIXEL; |
---|
| 1263 | + bottom_alpha_ctrl.bits.alpha_cal_mode = RGA_ALPHA_NO_SATURATION; |
---|
| 1264 | + } else { |
---|
| 1265 | + top_color_ctrl.bits.color_mode = |
---|
| 1266 | + config->fg_pre_multiplied ? |
---|
| 1267 | + RGA_ALPHA_PRE_MULTIPLIED : RGA_ALPHA_NO_PRE_MULTIPLIED; |
---|
| 1268 | + |
---|
| 1269 | + top_alpha_ctrl.bits.blend_mode = top_color_ctrl.bits.blend_mode; |
---|
| 1270 | + top_alpha_ctrl.bits.alpha_cal_mode = top_color_ctrl.bits.alpha_cal_mode; |
---|
| 1271 | + top_alpha_ctrl.bits.alpha_mode = top_color_ctrl.bits.alpha_mode; |
---|
| 1272 | + top_alpha_ctrl.bits.factor_mode = top_color_ctrl.bits.factor_mode; |
---|
| 1273 | + |
---|
| 1274 | + bottom_color_ctrl.bits.color_mode = |
---|
| 1275 | + config->bg_pre_multiplied ? |
---|
| 1276 | + RGA_ALPHA_PRE_MULTIPLIED : RGA_ALPHA_NO_PRE_MULTIPLIED; |
---|
| 1277 | + |
---|
| 1278 | + bottom_alpha_ctrl.bits.blend_mode = bottom_color_ctrl.bits.blend_mode; |
---|
| 1279 | + bottom_alpha_ctrl.bits.alpha_cal_mode = bottom_color_ctrl.bits.alpha_cal_mode; |
---|
| 1280 | + bottom_alpha_ctrl.bits.alpha_mode = bottom_color_ctrl.bits.alpha_mode; |
---|
| 1281 | + bottom_alpha_ctrl.bits.factor_mode = bottom_color_ctrl.bits.factor_mode; |
---|
| 1282 | + } |
---|
| 1283 | + |
---|
| 1284 | + *bRGA_OVERLAP_TOP_CTRL = top_color_ctrl.value; |
---|
| 1285 | + *bRGA_OVERLAP_BOT_CTRL = bottom_color_ctrl.value; |
---|
| 1286 | + *bRGA_OVERLAP_TOP_ALPHA = top_alpha_ctrl.value; |
---|
| 1287 | + *bRGA_OVERLAP_BOT_ALPHA = bottom_alpha_ctrl.value; |
---|
1100 | 1288 | |
---|
1101 | 1289 | /* set RGA_OVERLAP_CTRL */ |
---|
1102 | 1290 | reg = 0; |
---|
.. | .. |
---|
1132 | 1320 | * warning: if m1 & m0 need config split,need to redesign |
---|
1133 | 1321 | * this judge, which consider RGBA8888 format |
---|
1134 | 1322 | */ |
---|
1135 | | - if (msg->alpha_mode_1 > 0 && msg->alpha_mode_0 > 0) |
---|
1136 | | - reg = ((reg & (~m_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN)) | |
---|
1137 | | - (s_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN(1))); |
---|
| 1323 | + reg = ((reg & (~m_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN)) | |
---|
| 1324 | + (s_RGA3_OVLP_CTRL_SW_TOP_ALPHA_EN(config->enable))); |
---|
1138 | 1325 | |
---|
1139 | 1326 | *bRGA_OVERLAP_CTRL = reg; |
---|
1140 | 1327 | |
---|
1141 | 1328 | *bRGA3_OVLP_OFF = msg->wr.x_offset | (msg->wr.y_offset << 16); |
---|
1142 | 1329 | } |
---|
1143 | 1330 | |
---|
1144 | | -int rga3_gen_reg_info(u8 *base, struct rga3_req *msg) |
---|
| 1331 | +static int rga3_gen_reg_info(u8 *base, struct rga3_req *msg) |
---|
1145 | 1332 | { |
---|
1146 | 1333 | switch (msg->render_mode) { |
---|
1147 | 1334 | case BITBLT_MODE: |
---|
.. | .. |
---|
1225 | 1412 | } |
---|
1226 | 1413 | |
---|
1227 | 1414 | /* TODO: common part */ |
---|
1228 | | -void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req) |
---|
| 1415 | +static void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req) |
---|
1229 | 1416 | { |
---|
1230 | | - u16 alpha_mode_0, alpha_mode_1; |
---|
1231 | 1417 | struct rga_img_info_t tmp; |
---|
1232 | 1418 | |
---|
1233 | 1419 | req->render_mode = BITBLT_MODE; |
---|
.. | .. |
---|
1290 | 1476 | if (!(req_rga->alpha_rop_flag & 1)) { |
---|
1291 | 1477 | if (!rga_is_alpha_format(req_rga->src.format) && |
---|
1292 | 1478 | rga_is_alpha_format(req_rga->dst.format)) { |
---|
1293 | | - req->win0_a_global_val = 0xff; |
---|
1294 | | - req->win1_a_global_val = 0xff; |
---|
| 1479 | + req->alpha_config.fg_global_alpha_value = 0xff; |
---|
| 1480 | + req->alpha_config.bg_global_alpha_value = 0xff; |
---|
1295 | 1481 | } |
---|
1296 | 1482 | } |
---|
1297 | 1483 | |
---|
.. | .. |
---|
1311 | 1497 | * be enabled top_blend_m1 && top_alpha_cal_m1 for dst channel(wr). |
---|
1312 | 1498 | */ |
---|
1313 | 1499 | if (rga_is_alpha_format(req_rga->src.format)) |
---|
1314 | | - req->alpha_mode_1 = 0x0a0a; |
---|
| 1500 | + req->abb_alpha_pass = true; |
---|
1315 | 1501 | |
---|
1316 | 1502 | set_win_info(&req->win0, &req_rga->src); |
---|
1317 | 1503 | |
---|
.. | .. |
---|
1341 | 1527 | * be enabled bot_blend_m1 && bot_alpha_cal_m1 for src1/dst channel(win0). |
---|
1342 | 1528 | */ |
---|
1343 | 1529 | if (rga_is_alpha_format(req_rga->src.format)) |
---|
1344 | | - req->alpha_mode_1 = 0x0a0a; |
---|
| 1530 | + req->abb_alpha_pass = true; |
---|
1345 | 1531 | |
---|
1346 | 1532 | if (req_rga->pat.yrgb_addr != 0) { |
---|
1347 | 1533 | if (req_rga->src.yrgb_addr == req_rga->dst.yrgb_addr) { |
---|
.. | .. |
---|
1385 | 1571 | if (req->win0.x_offset || req->win0.y_offset) { |
---|
1386 | 1572 | req->win0.src_act_w = req->win0.src_act_w + req->win0.x_offset; |
---|
1387 | 1573 | req->win0.src_act_h = req->win0.src_act_h + req->win0.y_offset; |
---|
1388 | | - req->win0.dst_act_w = req_rga->pat.act_w + req->win0.x_offset; |
---|
1389 | | - req->win0.dst_act_h = req_rga->pat.act_h + req->win0.y_offset; |
---|
| 1574 | + req->win0.dst_act_w = req_rga->dst.act_w + req->win0.x_offset; |
---|
| 1575 | + req->win0.dst_act_h = req_rga->dst.act_h + req->win0.y_offset; |
---|
1390 | 1576 | |
---|
1391 | 1577 | req->win0.x_offset = 0; |
---|
1392 | 1578 | req->win0.y_offset = 0; |
---|
1393 | 1579 | } else { |
---|
1394 | | - req->win0.dst_act_w = req_rga->pat.act_w; |
---|
1395 | | - req->win0.dst_act_h = req_rga->pat.act_h; |
---|
| 1580 | + req->win0.dst_act_w = req_rga->dst.act_w; |
---|
| 1581 | + req->win0.dst_act_h = req_rga->dst.act_h; |
---|
1396 | 1582 | } |
---|
1397 | 1583 | /* set win1 dst size */ |
---|
1398 | | - req->win1.dst_act_w = req_rga->pat.act_w; |
---|
1399 | | - req->win1.dst_act_h = req_rga->pat.act_h; |
---|
| 1584 | + req->win1.dst_act_w = req_rga->dst.act_w; |
---|
| 1585 | + req->win1.dst_act_h = req_rga->dst.act_h; |
---|
1400 | 1586 | } else { |
---|
1401 | 1587 | /* A+B->B mode */ |
---|
1402 | 1588 | set_win_info(&req->win0, &req_rga->dst); |
---|
.. | .. |
---|
1444 | 1630 | /* Alpha blend mode */ |
---|
1445 | 1631 | if (((req_rga->alpha_rop_flag) & 1)) { |
---|
1446 | 1632 | if ((req_rga->alpha_rop_flag >> 3) & 1) { |
---|
1447 | | - /* porter duff alpha enable */ |
---|
1448 | | - switch (req_rga->PD_mode) { |
---|
1449 | | - /* dst = 0 */ |
---|
1450 | | - case 0: |
---|
1451 | | - break; |
---|
1452 | | - /* dst = src */ |
---|
1453 | | - case 1: |
---|
1454 | | - req->alpha_mode_0 = 0x0212; |
---|
1455 | | - req->alpha_mode_1 = 0x0212; |
---|
1456 | | - break; |
---|
1457 | | - /* dst = dst */ |
---|
1458 | | - case 2: |
---|
1459 | | - req->alpha_mode_0 = 0x1202; |
---|
1460 | | - req->alpha_mode_1 = 0x1202; |
---|
1461 | | - break; |
---|
1462 | | - /* dst = (256*sc + (256 - sa)*dc) >> 8 */ |
---|
1463 | | - case 3: |
---|
1464 | | - if ((req_rga->alpha_rop_mode & 3) == 0) { |
---|
1465 | | - /* both use globalAlpha. */ |
---|
1466 | | - alpha_mode_0 = 0x3010; |
---|
1467 | | - alpha_mode_1 = 0x3010; |
---|
1468 | | - } else if ((req_rga->alpha_rop_mode & 3) == 1) { |
---|
1469 | | - /* Do not use globalAlpha. */ |
---|
1470 | | - alpha_mode_0 = 0x3212; |
---|
1471 | | - alpha_mode_1 = 0x3212; |
---|
1472 | | - } else if ((req_rga->alpha_rop_mode & 3) == 2) { |
---|
1473 | | - /* |
---|
1474 | | - * dst use globalAlpha, |
---|
1475 | | - * and dst has pixelAlpha. |
---|
1476 | | - */ |
---|
1477 | | - alpha_mode_0 = 0x3014; |
---|
1478 | | - alpha_mode_1 = 0x3014; |
---|
1479 | | - } else { |
---|
1480 | | - /* |
---|
1481 | | - * dst use globalAlpha, |
---|
1482 | | - * and dst does not have pixelAlpha. |
---|
1483 | | - */ |
---|
1484 | | - alpha_mode_0 = 0x3012; |
---|
1485 | | - alpha_mode_1 = 0x3012; |
---|
1486 | | - } |
---|
1487 | | - req->alpha_mode_0 = alpha_mode_0; |
---|
1488 | | - req->alpha_mode_1 = alpha_mode_1; |
---|
1489 | | - break; |
---|
1490 | | - /* dst = (sc*(256-da) + 256*dc) >> 8 */ |
---|
1491 | | - case 4: |
---|
1492 | | - /* Do not use globalAlpha. */ |
---|
1493 | | - req->alpha_mode_0 = 0x1232; |
---|
1494 | | - req->alpha_mode_1 = 0x1232; |
---|
1495 | | - break; |
---|
1496 | | - /* dst = (da*sc) >> 8 */ |
---|
1497 | | - case 5: |
---|
1498 | | - break; |
---|
1499 | | - /* dst = (sa*dc) >> 8 */ |
---|
1500 | | - case 6: |
---|
1501 | | - break; |
---|
1502 | | - /* dst = ((256-da)*sc) >> 8 */ |
---|
1503 | | - case 7: |
---|
1504 | | - break; |
---|
1505 | | - /* dst = ((256-sa)*dc) >> 8 */ |
---|
1506 | | - case 8: |
---|
1507 | | - break; |
---|
1508 | | - /* dst = (da*sc + (256-sa)*dc) >> 8 */ |
---|
1509 | | - case 9: |
---|
1510 | | - req->alpha_mode_0 = 0x3040; |
---|
1511 | | - req->alpha_mode_1 = 0x3040; |
---|
1512 | | - break; |
---|
1513 | | - /* dst = ((256-da)*sc + (sa*dc)) >> 8 */ |
---|
1514 | | - case 10: |
---|
1515 | | - break; |
---|
1516 | | - /* dst = ((256-da)*sc + (256-sa)*dc) >> 8 */ |
---|
1517 | | - case 11: |
---|
1518 | | - break; |
---|
1519 | | - case 12: |
---|
1520 | | - req->alpha_mode_0 = 0x0010; |
---|
1521 | | - req->alpha_mode_1 = 0x0820; |
---|
1522 | | - break; |
---|
1523 | | - default: |
---|
1524 | | - break; |
---|
1525 | | - } |
---|
1526 | | - /* Real color mode */ |
---|
| 1633 | + req->alpha_config.enable = true; |
---|
| 1634 | + |
---|
1527 | 1635 | if ((req_rga->alpha_rop_flag >> 9) & 1) { |
---|
1528 | | - if (req->alpha_mode_0 & (0x01 << 1)) |
---|
1529 | | - req->alpha_mode_0 |= (1 << 7); |
---|
1530 | | - if (req->alpha_mode_0 & (0x01 << 9)) |
---|
1531 | | - req->alpha_mode_0 |= (1 << 15); |
---|
| 1636 | + req->alpha_config.fg_pre_multiplied = false; |
---|
| 1637 | + req->alpha_config.bg_pre_multiplied = false; |
---|
| 1638 | + } else { |
---|
| 1639 | + req->alpha_config.fg_pre_multiplied = true; |
---|
| 1640 | + req->alpha_config.bg_pre_multiplied = true; |
---|
1532 | 1641 | } |
---|
1533 | | - } else { |
---|
1534 | | - if ((req_rga->alpha_rop_mode & 3) == 0) { |
---|
1535 | | - req->alpha_mode_0 = 0x3040; |
---|
1536 | | - req->alpha_mode_1 = 0x3040; |
---|
1537 | | - } else if ((req_rga->alpha_rop_mode & 3) == 1) { |
---|
1538 | | - req->alpha_mode_0 = 0x3042; |
---|
1539 | | - req->alpha_mode_1 = 0x3242; |
---|
1540 | | - } else if ((req_rga->alpha_rop_mode & 3) == 2) { |
---|
1541 | | - req->alpha_mode_0 = 0x3044; |
---|
1542 | | - req->alpha_mode_1 = 0x3044; |
---|
| 1642 | + |
---|
| 1643 | + req->alpha_config.fg_pixel_alpha_en = rga_is_alpha_format(req->win1.format); |
---|
| 1644 | + req->alpha_config.bg_pixel_alpha_en = rga_is_alpha_format(req->win0.format); |
---|
| 1645 | + |
---|
| 1646 | + if (req_rga->feature.global_alpha_en) { |
---|
| 1647 | + if (req_rga->fg_global_alpha < 0xff) { |
---|
| 1648 | + req->alpha_config.fg_global_alpha_en = true; |
---|
| 1649 | + req->alpha_config.fg_global_alpha_value = |
---|
| 1650 | + req_rga->fg_global_alpha; |
---|
| 1651 | + } else if (!req->alpha_config.fg_pixel_alpha_en) { |
---|
| 1652 | + req->alpha_config.fg_global_alpha_en = true; |
---|
| 1653 | + req->alpha_config.fg_global_alpha_value = 0xff; |
---|
| 1654 | + } |
---|
| 1655 | + |
---|
| 1656 | + if (req_rga->bg_global_alpha < 0xff) { |
---|
| 1657 | + req->alpha_config.bg_global_alpha_en = true; |
---|
| 1658 | + req->alpha_config.bg_global_alpha_value = |
---|
| 1659 | + req_rga->bg_global_alpha; |
---|
| 1660 | + } else if (!req->alpha_config.bg_pixel_alpha_en) { |
---|
| 1661 | + req->alpha_config.bg_global_alpha_en = true; |
---|
| 1662 | + req->alpha_config.bg_global_alpha_value = 0xff; |
---|
| 1663 | + } |
---|
| 1664 | + } else { |
---|
| 1665 | + req->alpha_config.bg_global_alpha_value = 0xff; |
---|
| 1666 | + req->alpha_config.bg_global_alpha_value = 0xff; |
---|
1543 | 1667 | } |
---|
| 1668 | + |
---|
| 1669 | + req->alpha_config.mode = req_rga->PD_mode; |
---|
1544 | 1670 | } |
---|
1545 | 1671 | } |
---|
1546 | 1672 | |
---|
.. | .. |
---|
1589 | 1715 | } |
---|
1590 | 1716 | } |
---|
1591 | 1717 | |
---|
1592 | | -void rga3_soft_reset(struct rga_scheduler_t *scheduler) |
---|
| 1718 | +static void rga3_soft_reset(struct rga_scheduler_t *scheduler) |
---|
1593 | 1719 | { |
---|
1594 | 1720 | u32 i; |
---|
1595 | | - u32 reg; |
---|
1596 | | - u32 mmu_addr; |
---|
| 1721 | + u32 iommu_dte_addr = 0; |
---|
1597 | 1722 | |
---|
1598 | | - mmu_addr = rga_read(0xf00, scheduler); |
---|
| 1723 | + if (scheduler->data->mmu == RGA_IOMMU) |
---|
| 1724 | + iommu_dte_addr = rga_read(RGA_IOMMU_DTE_ADDR, scheduler); |
---|
1599 | 1725 | |
---|
1600 | | - rga_write((1 << 3) | (1 << 4), RGA3_SYS_CTRL, scheduler); |
---|
1601 | | - |
---|
1602 | | - pr_err("soft reset sys_ctrl = %x, ro_rest = %x", |
---|
1603 | | - rga_read(RGA3_SYS_CTRL, scheduler), |
---|
1604 | | - rga_read(RGA3_RO_SRST, scheduler)); |
---|
1605 | | - |
---|
1606 | | - mdelay(20); |
---|
1607 | | - |
---|
1608 | | - pr_err("soft reset sys_ctrl = %x, ro_rest = %x", |
---|
1609 | | - rga_read(RGA3_SYS_CTRL, scheduler), |
---|
1610 | | - rga_read(RGA3_RO_SRST, scheduler)); |
---|
1611 | | - |
---|
1612 | | - rga_write((0 << 3) | (0 << 4), RGA3_SYS_CTRL, scheduler); |
---|
1613 | | - |
---|
1614 | | - pr_err("soft after reset sys_ctrl = %x, ro_rest = %x", |
---|
1615 | | - rga_read(RGA3_SYS_CTRL, scheduler), |
---|
1616 | | - rga_read(RGA3_RO_SRST, scheduler)); |
---|
1617 | | - |
---|
1618 | | - rga_write(1, RGA3_INT_CLR, scheduler); |
---|
1619 | | - |
---|
1620 | | - rga_write(mmu_addr, 0xf00, scheduler); |
---|
1621 | | - rga_write(0, 0xf08, scheduler); |
---|
1622 | | - |
---|
1623 | | - if (DEBUGGER_EN(INT_FLAG)) |
---|
1624 | | - pr_info("irq INT[%x], STATS0[%x], STATS1[%x]\n", |
---|
1625 | | - rga_read(RGA3_INT_RAW, scheduler), |
---|
1626 | | - rga_read(RGA3_STATUS0, scheduler), |
---|
1627 | | - rga_read(RGA3_STATUS1, scheduler)); |
---|
| 1726 | + rga_write(s_RGA3_SYS_CTRL_CCLK_SRESET(1) | s_RGA3_SYS_CTRL_ACLK_SRESET(1), |
---|
| 1727 | + RGA3_SYS_CTRL, scheduler); |
---|
1628 | 1728 | |
---|
1629 | 1729 | for (i = 0; i < RGA_RESET_TIMEOUT; i++) { |
---|
1630 | | - reg = rga_read(RGA3_SYS_CTRL, scheduler) & 1; |
---|
1631 | | - |
---|
1632 | | - if (reg == 0) |
---|
| 1730 | + if (rga_read(RGA3_RO_SRST, scheduler) & m_RGA3_RO_SRST_RO_RST_DONE) |
---|
1633 | 1731 | break; |
---|
1634 | 1732 | |
---|
1635 | 1733 | udelay(1); |
---|
1636 | 1734 | } |
---|
1637 | 1735 | |
---|
| 1736 | + rga_write(s_RGA3_SYS_CTRL_CCLK_SRESET(0) | s_RGA3_SYS_CTRL_ACLK_SRESET(0), |
---|
| 1737 | + RGA3_SYS_CTRL, scheduler); |
---|
| 1738 | + |
---|
| 1739 | + if (scheduler->data->mmu == RGA_IOMMU) { |
---|
| 1740 | + rga_write(iommu_dte_addr, RGA_IOMMU_DTE_ADDR, scheduler); |
---|
| 1741 | + /* enable iommu */ |
---|
| 1742 | + rga_write(RGA_IOMMU_CMD_ENABLE_PAGING, RGA_IOMMU_COMMAND, scheduler); |
---|
| 1743 | + } |
---|
| 1744 | + |
---|
1638 | 1745 | if (i == RGA_RESET_TIMEOUT) |
---|
1639 | | - pr_err("soft reset timeout.\n"); |
---|
| 1746 | + pr_err("RGA3 core[%d] soft reset timeout. SYS_CTRL[0x%x], RO_SRST[0x%x]\n", |
---|
| 1747 | + scheduler->core, rga_read(RGA3_SYS_CTRL, scheduler), |
---|
| 1748 | + rga_read(RGA3_RO_SRST, scheduler)); |
---|
| 1749 | + else |
---|
| 1750 | + pr_info("RGA3 core[%d] soft reset complete.\n", scheduler->core); |
---|
1640 | 1751 | } |
---|
1641 | 1752 | |
---|
1642 | 1753 | static int rga3_scale_check(const struct rga3_req *req) |
---|
.. | .. |
---|
1803 | 1914 | pr_info("mmu: win0 = %.2x win1 = %.2x wr = %.2x\n", |
---|
1804 | 1915 | req->mmu_info.src0_mmu_flag, req->mmu_info.src1_mmu_flag, |
---|
1805 | 1916 | req->mmu_info.dst_mmu_flag); |
---|
1806 | | - pr_info("alpha: flag %x mode0=%x mode1=%x\n", req->alpha_rop_flag, |
---|
1807 | | - req->alpha_mode_0, req->alpha_mode_1); |
---|
1808 | | - pr_info("blend mode is %s\n", |
---|
1809 | | - rga_get_blend_mode_str(req->alpha_rop_flag, req->alpha_mode_0, |
---|
1810 | | - req->alpha_mode_1)); |
---|
| 1917 | + pr_info("alpha: flag %x mode=%s\n", |
---|
| 1918 | + req->alpha_rop_flag, rga_get_blend_mode_str(req->alpha_config.mode)); |
---|
| 1919 | + pr_info("alpha: pre_multi=[%d,%d] pixl=[%d,%d] glb=[%d,%d]\n", |
---|
| 1920 | + req->alpha_config.fg_pre_multiplied, req->alpha_config.bg_pre_multiplied, |
---|
| 1921 | + req->alpha_config.fg_pixel_alpha_en, req->alpha_config.bg_pixel_alpha_en, |
---|
| 1922 | + req->alpha_config.fg_global_alpha_en, req->alpha_config.bg_global_alpha_en); |
---|
| 1923 | + pr_info("alpha: fg_global_alpha=%x bg_global_alpha=%x\n", |
---|
| 1924 | + req->alpha_config.fg_global_alpha_value, req->alpha_config.bg_global_alpha_value); |
---|
1811 | 1925 | pr_info("yuv2rgb mode is %x\n", req->yuv2rgb_mode); |
---|
1812 | 1926 | } |
---|
1813 | 1927 | |
---|
.. | .. |
---|
1836 | 1950 | return 0; |
---|
1837 | 1951 | } |
---|
1838 | 1952 | |
---|
1839 | | -int rga3_init_reg(struct rga_job *job) |
---|
| 1953 | +static int rga3_init_reg(struct rga_job *job) |
---|
1840 | 1954 | { |
---|
1841 | 1955 | struct rga3_req req; |
---|
1842 | 1956 | int ret = 0; |
---|
1843 | 1957 | struct rga_scheduler_t *scheduler = NULL; |
---|
| 1958 | + ktime_t timestamp = ktime_get(); |
---|
1844 | 1959 | |
---|
1845 | 1960 | scheduler = job->scheduler; |
---|
1846 | 1961 | if (unlikely(scheduler == NULL)) { |
---|
.. | .. |
---|
1870 | 1985 | return -EINVAL; |
---|
1871 | 1986 | } |
---|
1872 | 1987 | |
---|
| 1988 | + if (DEBUGGER_EN(TIME)) |
---|
| 1989 | + pr_info("request[%d], generate register cost time %lld us\n", |
---|
| 1990 | + job->request_id, ktime_us_delta(ktime_get(), timestamp)); |
---|
| 1991 | + |
---|
1873 | 1992 | return ret; |
---|
1874 | 1993 | } |
---|
1875 | 1994 | |
---|
.. | .. |
---|
1893 | 2012 | cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]); |
---|
1894 | 2013 | } |
---|
1895 | 2014 | |
---|
1896 | | -int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
| 2015 | +static int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
1897 | 2016 | { |
---|
| 2017 | + int i; |
---|
| 2018 | + bool master_mode_en; |
---|
| 2019 | + uint32_t sys_ctrl; |
---|
1898 | 2020 | ktime_t now = ktime_get(); |
---|
1899 | 2021 | |
---|
1900 | | - //rga_dma_flush_range(&job->cmd_reg[0], &job->cmd_reg[50], scheduler); |
---|
1901 | | - |
---|
1902 | | - rga_write(0x0, RGA3_SYS_CTRL, scheduler); |
---|
1903 | | - |
---|
1904 | | -#if 0 |
---|
1905 | | - /* CMD buff */ |
---|
1906 | | - rga_write(virt_to_phys(job->cmd_reg), RGA3_CMD_ADDR, scheduler); |
---|
1907 | | -#else |
---|
1908 | | - { |
---|
1909 | | - int32_t m, *cmd; |
---|
1910 | | - |
---|
1911 | | - cmd = job->cmd_reg; |
---|
1912 | | - for (m = 0; m <= 50; m++) |
---|
1913 | | - rga_write(cmd[m], 0x100 + m * 4, scheduler); |
---|
1914 | | - } |
---|
1915 | | -#endif |
---|
| 2022 | + /* |
---|
| 2023 | + * Currently there is no iova allocated for storing cmd for the IOMMU device, |
---|
| 2024 | + * so the iommu device needs to use the slave mode. |
---|
| 2025 | + */ |
---|
| 2026 | + if (scheduler->data->mmu != RGA_IOMMU) |
---|
| 2027 | + master_mode_en = true; |
---|
| 2028 | + else |
---|
| 2029 | + master_mode_en = false; |
---|
1916 | 2030 | |
---|
1917 | 2031 | if (DEBUGGER_EN(REG)) { |
---|
1918 | | - int32_t i, *p; |
---|
| 2032 | + uint32_t *p; |
---|
1919 | 2033 | |
---|
1920 | 2034 | p = job->cmd_reg; |
---|
1921 | 2035 | pr_info("CMD_REG\n"); |
---|
.. | .. |
---|
1925 | 2039 | p[2 + i * 4], p[3 + i * 4]); |
---|
1926 | 2040 | } |
---|
1927 | 2041 | |
---|
1928 | | -#if 0 |
---|
1929 | | - /* master mode */ |
---|
1930 | | - rga_write((0x1 << 1) | (0x1 << 2) | (0x1 << 5) | (0x1 << 6), |
---|
1931 | | - RGA3_SYS_CTRL, scheduler); |
---|
1932 | | -#else |
---|
1933 | | - /* slave mode */ |
---|
1934 | | - //rga_write(1, 0xf08, scheduler); |
---|
1935 | | -#endif |
---|
1936 | | - |
---|
1937 | 2042 | /* All CMD finish int */ |
---|
1938 | | - rga_write(1, RGA3_INT_EN, scheduler); |
---|
| 2043 | + rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK, |
---|
| 2044 | + RGA3_INT_EN, scheduler); |
---|
1939 | 2045 | |
---|
1940 | | - if (DEBUGGER_EN(MSG)) { |
---|
1941 | | - pr_info("sys_ctrl = %x, int_en = %x, int_raw = %x\n", |
---|
| 2046 | + if (master_mode_en) { |
---|
| 2047 | + /* master mode */ |
---|
| 2048 | + sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(1); |
---|
| 2049 | + |
---|
| 2050 | + /* cmd buffer flush cache to ddr */ |
---|
| 2051 | + rga_dma_sync_flush_range(&job->cmd_reg[0], &job->cmd_reg[50], scheduler); |
---|
| 2052 | + |
---|
| 2053 | + rga_write(virt_to_phys(job->cmd_reg), RGA3_CMD_ADDR, scheduler); |
---|
| 2054 | + rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler); |
---|
| 2055 | + rga_write(m_RGA3_CMD_CTRL_CMD_LINE_ST_P, RGA3_CMD_CTRL, scheduler); |
---|
| 2056 | + } else { |
---|
| 2057 | + /* slave mode */ |
---|
| 2058 | + sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(0) | m_RGA3_SYS_CTRL_RGA_SART; |
---|
| 2059 | + |
---|
| 2060 | + for (i = 0; i <= 50; i++) |
---|
| 2061 | + rga_write(job->cmd_reg[i], 0x100 + i * 4, scheduler); |
---|
| 2062 | + |
---|
| 2063 | + rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler); |
---|
| 2064 | + } |
---|
| 2065 | + |
---|
| 2066 | + if (DEBUGGER_EN(REG)) { |
---|
| 2067 | + pr_info("sys_ctrl = 0x%x, int_en = 0x%x, int_raw = 0x%x\n", |
---|
1942 | 2068 | rga_read(RGA3_SYS_CTRL, scheduler), |
---|
1943 | 2069 | rga_read(RGA3_INT_EN, scheduler), |
---|
1944 | 2070 | rga_read(RGA3_INT_RAW, scheduler)); |
---|
1945 | 2071 | |
---|
1946 | | - pr_info("status0 = %x, status1 = %x\n", |
---|
| 2072 | + pr_info("hw_status = 0x%x, cmd_status = 0x%x\n", |
---|
1947 | 2073 | rga_read(RGA3_STATUS0, scheduler), |
---|
1948 | | - rga_read(RGA3_STATUS1, scheduler)); |
---|
| 2074 | + rga_read(RGA3_CMD_STATE, scheduler)); |
---|
1949 | 2075 | } |
---|
1950 | 2076 | |
---|
1951 | 2077 | if (DEBUGGER_EN(TIME)) |
---|
1952 | | - pr_info("set cmd use time = %lld\n", ktime_us_delta(now, job->timestamp)); |
---|
| 2078 | + pr_info("request[%d], set register cost time %lld us\n", |
---|
| 2079 | + job->request_id, ktime_us_delta(now, job->timestamp)); |
---|
1953 | 2080 | |
---|
1954 | 2081 | job->hw_running_time = now; |
---|
1955 | 2082 | job->hw_recoder_time = now; |
---|
1956 | | - |
---|
1957 | | - rga_write(1, RGA3_SYS_CTRL, scheduler); |
---|
1958 | 2083 | |
---|
1959 | 2084 | if (DEBUGGER_EN(REG)) |
---|
1960 | 2085 | rga3_dump_read_back_reg(scheduler); |
---|
.. | .. |
---|
1962 | 2087 | return 0; |
---|
1963 | 2088 | } |
---|
1964 | 2089 | |
---|
1965 | | -int rga3_get_version(struct rga_scheduler_t *scheduler) |
---|
| 2090 | +static int rga3_get_version(struct rga_scheduler_t *scheduler) |
---|
1966 | 2091 | { |
---|
1967 | 2092 | u32 major_version, minor_version, svn_version; |
---|
1968 | 2093 | u32 reg_version; |
---|
.. | .. |
---|
1987 | 2112 | |
---|
1988 | 2113 | return 0; |
---|
1989 | 2114 | } |
---|
| 2115 | + |
---|
| 2116 | +static int rga3_irq(struct rga_scheduler_t *scheduler) |
---|
| 2117 | +{ |
---|
| 2118 | + struct rga_job *job = scheduler->running_job; |
---|
| 2119 | + |
---|
| 2120 | + if (job == NULL) |
---|
| 2121 | + return IRQ_HANDLED; |
---|
| 2122 | + |
---|
| 2123 | + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) |
---|
| 2124 | + return IRQ_WAKE_THREAD; |
---|
| 2125 | + |
---|
| 2126 | + job->intr_status = rga_read(RGA3_INT_RAW, scheduler); |
---|
| 2127 | + job->hw_status = rga_read(RGA3_STATUS0, scheduler); |
---|
| 2128 | + job->cmd_status = rga_read(RGA3_CMD_STATE, scheduler); |
---|
| 2129 | + |
---|
| 2130 | + if (DEBUGGER_EN(INT_FLAG)) |
---|
| 2131 | + pr_info("irq handler, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", |
---|
| 2132 | + job->intr_status, job->hw_status, job->cmd_status); |
---|
| 2133 | + |
---|
| 2134 | + if (job->intr_status & (m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH)) { |
---|
| 2135 | + set_bit(RGA_JOB_STATE_FINISH, &job->state); |
---|
| 2136 | + } else if (job->intr_status & m_RGA3_INT_ERROR_MASK) { |
---|
| 2137 | + set_bit(RGA_JOB_STATE_INTR_ERR, &job->state); |
---|
| 2138 | + |
---|
| 2139 | + pr_err("irq handler err! INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", |
---|
| 2140 | + job->intr_status, job->hw_status, job->cmd_status); |
---|
| 2141 | + scheduler->ops->soft_reset(scheduler); |
---|
| 2142 | + } |
---|
| 2143 | + |
---|
| 2144 | + /*clear INTR */ |
---|
| 2145 | + rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK, |
---|
| 2146 | + RGA3_INT_CLR, scheduler); |
---|
| 2147 | + |
---|
| 2148 | + return IRQ_WAKE_THREAD; |
---|
| 2149 | +} |
---|
| 2150 | + |
---|
| 2151 | +static int rga3_isr_thread(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
| 2152 | +{ |
---|
| 2153 | + if (DEBUGGER_EN(INT_FLAG)) |
---|
| 2154 | + pr_info("isr thread, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", |
---|
| 2155 | + rga_read(RGA3_INT_RAW, scheduler), |
---|
| 2156 | + rga_read(RGA3_STATUS0, scheduler), |
---|
| 2157 | + rga_read(RGA3_CMD_STATE, scheduler)); |
---|
| 2158 | + |
---|
| 2159 | + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) { |
---|
| 2160 | + if (job->intr_status & m_RGA3_INT_RAG_MI_RD_BUS_ERR) { |
---|
| 2161 | + pr_err("DMA read bus error, please check size of the input_buffer or whether the buffer has been freed.\n"); |
---|
| 2162 | + job->ret = -EFAULT; |
---|
| 2163 | + } else if (job->intr_status & m_RGA3_INT_WIN0_FBCD_DEC_ERR) { |
---|
| 2164 | + pr_err("win0 FBC decoder error, please check the fbc image of the source.\n"); |
---|
| 2165 | + job->ret = -EFAULT; |
---|
| 2166 | + } else if (job->intr_status & m_RGA3_INT_WIN1_FBCD_DEC_ERR) { |
---|
| 2167 | + pr_err("win1 FBC decoder error, please check the fbc image of the source.\n"); |
---|
| 2168 | + job->ret = -EFAULT; |
---|
| 2169 | + } else if (job->intr_status & m_RGA3_INT_RGA_MI_WR_BUS_ERR) { |
---|
| 2170 | + pr_err("wr buss error, please check size of the output_buffer or whether the buffer has been freed.\n"); |
---|
| 2171 | + job->ret = -EFAULT; |
---|
| 2172 | + } |
---|
| 2173 | + |
---|
| 2174 | + if (job->ret == 0) { |
---|
| 2175 | + pr_err("rga intr error[0x%x]!\n", job->intr_status); |
---|
| 2176 | + job->ret = -EFAULT; |
---|
| 2177 | + } |
---|
| 2178 | + } |
---|
| 2179 | + |
---|
| 2180 | + return IRQ_HANDLED; |
---|
| 2181 | +} |
---|
| 2182 | + |
---|
| 2183 | +const struct rga_backend_ops rga3_ops = { |
---|
| 2184 | + .get_version = rga3_get_version, |
---|
| 2185 | + .set_reg = rga3_set_reg, |
---|
| 2186 | + .init_reg = rga3_init_reg, |
---|
| 2187 | + .soft_reset = rga3_soft_reset, |
---|
| 2188 | + .read_back_reg = NULL, |
---|
| 2189 | + .irq = rga3_irq, |
---|
| 2190 | + .isr_thread = rga3_isr_thread, |
---|
| 2191 | +}; |
---|