.. | .. |
---|
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; |
---|
.. | .. |
---|
1141 | 1175 | *bRGA3_OVLP_OFF = msg->wr.x_offset | (msg->wr.y_offset << 16); |
---|
1142 | 1176 | } |
---|
1143 | 1177 | |
---|
1144 | | -int rga3_gen_reg_info(u8 *base, struct rga3_req *msg) |
---|
| 1178 | +static int rga3_gen_reg_info(u8 *base, struct rga3_req *msg) |
---|
1145 | 1179 | { |
---|
1146 | 1180 | switch (msg->render_mode) { |
---|
1147 | 1181 | case BITBLT_MODE: |
---|
.. | .. |
---|
1225 | 1259 | } |
---|
1226 | 1260 | |
---|
1227 | 1261 | /* TODO: common part */ |
---|
1228 | | -void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req) |
---|
| 1262 | +static void rga_cmd_to_rga3_cmd(struct rga_req *req_rga, struct rga3_req *req) |
---|
1229 | 1263 | { |
---|
1230 | 1264 | u16 alpha_mode_0, alpha_mode_1; |
---|
1231 | 1265 | struct rga_img_info_t tmp; |
---|
.. | .. |
---|
1385 | 1419 | if (req->win0.x_offset || req->win0.y_offset) { |
---|
1386 | 1420 | req->win0.src_act_w = req->win0.src_act_w + req->win0.x_offset; |
---|
1387 | 1421 | 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; |
---|
| 1422 | + req->win0.dst_act_w = req_rga->dst.act_w + req->win0.x_offset; |
---|
| 1423 | + req->win0.dst_act_h = req_rga->dst.act_h + req->win0.y_offset; |
---|
1390 | 1424 | |
---|
1391 | 1425 | req->win0.x_offset = 0; |
---|
1392 | 1426 | req->win0.y_offset = 0; |
---|
1393 | 1427 | } else { |
---|
1394 | | - req->win0.dst_act_w = req_rga->pat.act_w; |
---|
1395 | | - req->win0.dst_act_h = req_rga->pat.act_h; |
---|
| 1428 | + req->win0.dst_act_w = req_rga->dst.act_w; |
---|
| 1429 | + req->win0.dst_act_h = req_rga->dst.act_h; |
---|
1396 | 1430 | } |
---|
1397 | 1431 | /* 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; |
---|
| 1432 | + req->win1.dst_act_w = req_rga->dst.act_w; |
---|
| 1433 | + req->win1.dst_act_h = req_rga->dst.act_h; |
---|
1400 | 1434 | } else { |
---|
1401 | 1435 | /* A+B->B mode */ |
---|
1402 | 1436 | set_win_info(&req->win0, &req_rga->dst); |
---|
.. | .. |
---|
1589 | 1623 | } |
---|
1590 | 1624 | } |
---|
1591 | 1625 | |
---|
1592 | | -void rga3_soft_reset(struct rga_scheduler_t *scheduler) |
---|
| 1626 | +static void rga3_soft_reset(struct rga_scheduler_t *scheduler) |
---|
1593 | 1627 | { |
---|
1594 | 1628 | u32 i; |
---|
1595 | | - u32 reg; |
---|
1596 | | - u32 mmu_addr; |
---|
| 1629 | + u32 iommu_dte_addr = 0; |
---|
1597 | 1630 | |
---|
1598 | | - mmu_addr = rga_read(0xf00, scheduler); |
---|
| 1631 | + if (scheduler->data->mmu == RGA_IOMMU) |
---|
| 1632 | + iommu_dte_addr = rga_read(RGA_IOMMU_DTE_ADDR, scheduler); |
---|
1599 | 1633 | |
---|
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)); |
---|
| 1634 | + rga_write(s_RGA3_SYS_CTRL_CCLK_SRESET(1) | s_RGA3_SYS_CTRL_ACLK_SRESET(1), |
---|
| 1635 | + RGA3_SYS_CTRL, scheduler); |
---|
1628 | 1636 | |
---|
1629 | 1637 | for (i = 0; i < RGA_RESET_TIMEOUT; i++) { |
---|
1630 | | - reg = rga_read(RGA3_SYS_CTRL, scheduler) & 1; |
---|
1631 | | - |
---|
1632 | | - if (reg == 0) |
---|
| 1638 | + if (rga_read(RGA3_RO_SRST, scheduler) & m_RGA3_RO_SRST_RO_RST_DONE) |
---|
1633 | 1639 | break; |
---|
1634 | 1640 | |
---|
1635 | 1641 | udelay(1); |
---|
1636 | 1642 | } |
---|
1637 | 1643 | |
---|
| 1644 | + rga_write(s_RGA3_SYS_CTRL_CCLK_SRESET(0) | s_RGA3_SYS_CTRL_ACLK_SRESET(0), |
---|
| 1645 | + RGA3_SYS_CTRL, scheduler); |
---|
| 1646 | + |
---|
| 1647 | + if (scheduler->data->mmu == RGA_IOMMU) { |
---|
| 1648 | + rga_write(iommu_dte_addr, RGA_IOMMU_DTE_ADDR, scheduler); |
---|
| 1649 | + /* enable iommu */ |
---|
| 1650 | + rga_write(RGA_IOMMU_CMD_ENABLE_PAGING, RGA_IOMMU_COMMAND, scheduler); |
---|
| 1651 | + } |
---|
| 1652 | + |
---|
1638 | 1653 | if (i == RGA_RESET_TIMEOUT) |
---|
1639 | | - pr_err("soft reset timeout.\n"); |
---|
| 1654 | + pr_err("RGA3 soft reset timeout. SYS_CTRL[0x%x], RO_SRST[0x%x]\n", |
---|
| 1655 | + rga_read(RGA3_SYS_CTRL, scheduler), rga_read(RGA3_RO_SRST, scheduler)); |
---|
| 1656 | + else |
---|
| 1657 | + pr_info("RGA3 soft reset complete.\n"); |
---|
1640 | 1658 | } |
---|
1641 | 1659 | |
---|
1642 | 1660 | static int rga3_scale_check(const struct rga3_req *req) |
---|
.. | .. |
---|
1836 | 1854 | return 0; |
---|
1837 | 1855 | } |
---|
1838 | 1856 | |
---|
1839 | | -int rga3_init_reg(struct rga_job *job) |
---|
| 1857 | +static int rga3_init_reg(struct rga_job *job) |
---|
1840 | 1858 | { |
---|
1841 | 1859 | struct rga3_req req; |
---|
1842 | 1860 | int ret = 0; |
---|
.. | .. |
---|
1893 | 1911 | cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]); |
---|
1894 | 1912 | } |
---|
1895 | 1913 | |
---|
1896 | | -int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
| 1914 | +static int rga3_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
1897 | 1915 | { |
---|
| 1916 | + int i; |
---|
| 1917 | + bool master_mode_en; |
---|
| 1918 | + uint32_t sys_ctrl; |
---|
1898 | 1919 | ktime_t now = ktime_get(); |
---|
1899 | 1920 | |
---|
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 |
---|
| 1921 | + /* |
---|
| 1922 | + * Currently there is no iova allocated for storing cmd for the IOMMU device, |
---|
| 1923 | + * so the iommu device needs to use the slave mode. |
---|
| 1924 | + */ |
---|
| 1925 | + if (scheduler->data->mmu != RGA_IOMMU) |
---|
| 1926 | + master_mode_en = true; |
---|
| 1927 | + else |
---|
| 1928 | + master_mode_en = false; |
---|
1916 | 1929 | |
---|
1917 | 1930 | if (DEBUGGER_EN(REG)) { |
---|
1918 | | - int32_t i, *p; |
---|
| 1931 | + uint32_t *p; |
---|
1919 | 1932 | |
---|
1920 | 1933 | p = job->cmd_reg; |
---|
1921 | 1934 | pr_info("CMD_REG\n"); |
---|
.. | .. |
---|
1925 | 1938 | p[2 + i * 4], p[3 + i * 4]); |
---|
1926 | 1939 | } |
---|
1927 | 1940 | |
---|
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 | 1941 | /* All CMD finish int */ |
---|
1938 | | - rga_write(1, RGA3_INT_EN, scheduler); |
---|
| 1942 | + rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK, |
---|
| 1943 | + RGA3_INT_EN, scheduler); |
---|
1939 | 1944 | |
---|
1940 | | - if (DEBUGGER_EN(MSG)) { |
---|
1941 | | - pr_info("sys_ctrl = %x, int_en = %x, int_raw = %x\n", |
---|
| 1945 | + if (master_mode_en) { |
---|
| 1946 | + /* master mode */ |
---|
| 1947 | + sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(1); |
---|
| 1948 | + |
---|
| 1949 | + /* cmd buffer flush cache to ddr */ |
---|
| 1950 | + rga_dma_sync_flush_range(&job->cmd_reg[0], &job->cmd_reg[50], scheduler); |
---|
| 1951 | + |
---|
| 1952 | + rga_write(virt_to_phys(job->cmd_reg), RGA3_CMD_ADDR, scheduler); |
---|
| 1953 | + rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler); |
---|
| 1954 | + rga_write(m_RGA3_CMD_CTRL_CMD_LINE_ST_P, RGA3_CMD_CTRL, scheduler); |
---|
| 1955 | + } else { |
---|
| 1956 | + /* slave mode */ |
---|
| 1957 | + sys_ctrl = s_RGA3_SYS_CTRL_CMD_MODE(0) | m_RGA3_SYS_CTRL_RGA_SART; |
---|
| 1958 | + |
---|
| 1959 | + for (i = 0; i <= 50; i++) |
---|
| 1960 | + rga_write(job->cmd_reg[i], 0x100 + i * 4, scheduler); |
---|
| 1961 | + |
---|
| 1962 | + rga_write(sys_ctrl, RGA3_SYS_CTRL, scheduler); |
---|
| 1963 | + } |
---|
| 1964 | + |
---|
| 1965 | + if (DEBUGGER_EN(REG)) { |
---|
| 1966 | + pr_info("sys_ctrl = 0x%x, int_en = 0x%x, int_raw = 0x%x\n", |
---|
1942 | 1967 | rga_read(RGA3_SYS_CTRL, scheduler), |
---|
1943 | 1968 | rga_read(RGA3_INT_EN, scheduler), |
---|
1944 | 1969 | rga_read(RGA3_INT_RAW, scheduler)); |
---|
1945 | 1970 | |
---|
1946 | | - pr_info("status0 = %x, status1 = %x\n", |
---|
| 1971 | + pr_info("hw_status = 0x%x, cmd_status = 0x%x\n", |
---|
1947 | 1972 | rga_read(RGA3_STATUS0, scheduler), |
---|
1948 | | - rga_read(RGA3_STATUS1, scheduler)); |
---|
| 1973 | + rga_read(RGA3_CMD_STATE, scheduler)); |
---|
1949 | 1974 | } |
---|
1950 | 1975 | |
---|
1951 | 1976 | if (DEBUGGER_EN(TIME)) |
---|
.. | .. |
---|
1954 | 1979 | job->hw_running_time = now; |
---|
1955 | 1980 | job->hw_recoder_time = now; |
---|
1956 | 1981 | |
---|
1957 | | - rga_write(1, RGA3_SYS_CTRL, scheduler); |
---|
1958 | | - |
---|
1959 | 1982 | if (DEBUGGER_EN(REG)) |
---|
1960 | 1983 | rga3_dump_read_back_reg(scheduler); |
---|
1961 | 1984 | |
---|
1962 | 1985 | return 0; |
---|
1963 | 1986 | } |
---|
1964 | 1987 | |
---|
1965 | | -int rga3_get_version(struct rga_scheduler_t *scheduler) |
---|
| 1988 | +static int rga3_get_version(struct rga_scheduler_t *scheduler) |
---|
1966 | 1989 | { |
---|
1967 | 1990 | u32 major_version, minor_version, svn_version; |
---|
1968 | 1991 | u32 reg_version; |
---|
.. | .. |
---|
1987 | 2010 | |
---|
1988 | 2011 | return 0; |
---|
1989 | 2012 | } |
---|
| 2013 | + |
---|
| 2014 | +static int rga3_irq(struct rga_scheduler_t *scheduler) |
---|
| 2015 | +{ |
---|
| 2016 | + struct rga_job *job = scheduler->running_job; |
---|
| 2017 | + |
---|
| 2018 | + if (job == NULL) |
---|
| 2019 | + return IRQ_HANDLED; |
---|
| 2020 | + |
---|
| 2021 | + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) |
---|
| 2022 | + return IRQ_WAKE_THREAD; |
---|
| 2023 | + |
---|
| 2024 | + job->intr_status = rga_read(RGA3_INT_RAW, scheduler); |
---|
| 2025 | + job->hw_status = rga_read(RGA3_STATUS0, scheduler); |
---|
| 2026 | + job->cmd_status = rga_read(RGA3_CMD_STATE, scheduler); |
---|
| 2027 | + |
---|
| 2028 | + if (DEBUGGER_EN(INT_FLAG)) |
---|
| 2029 | + pr_info("irq handler, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", |
---|
| 2030 | + job->intr_status, job->hw_status, job->cmd_status); |
---|
| 2031 | + |
---|
| 2032 | + if (job->intr_status & (m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH)) { |
---|
| 2033 | + set_bit(RGA_JOB_STATE_FINISH, &job->state); |
---|
| 2034 | + } else if (job->intr_status & m_RGA3_INT_ERROR_MASK) { |
---|
| 2035 | + set_bit(RGA_JOB_STATE_INTR_ERR, &job->state); |
---|
| 2036 | + |
---|
| 2037 | + pr_err("irq handler err! INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", |
---|
| 2038 | + job->intr_status, job->hw_status, job->cmd_status); |
---|
| 2039 | + scheduler->ops->soft_reset(scheduler); |
---|
| 2040 | + } |
---|
| 2041 | + |
---|
| 2042 | + /*clear INTR */ |
---|
| 2043 | + rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK, |
---|
| 2044 | + RGA3_INT_CLR, scheduler); |
---|
| 2045 | + |
---|
| 2046 | + return IRQ_WAKE_THREAD; |
---|
| 2047 | +} |
---|
| 2048 | + |
---|
| 2049 | +static int rga3_isr_thread(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
| 2050 | +{ |
---|
| 2051 | + if (DEBUGGER_EN(INT_FLAG)) |
---|
| 2052 | + pr_info("isr thread, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", |
---|
| 2053 | + rga_read(RGA3_INT_RAW, scheduler), |
---|
| 2054 | + rga_read(RGA3_STATUS0, scheduler), |
---|
| 2055 | + rga_read(RGA3_CMD_STATE, scheduler)); |
---|
| 2056 | + |
---|
| 2057 | + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) { |
---|
| 2058 | + if (job->intr_status & m_RGA3_INT_RAG_MI_RD_BUS_ERR) { |
---|
| 2059 | + pr_err("DMA read bus error, please check size of the input_buffer or whether the buffer has been freed.\n"); |
---|
| 2060 | + job->ret = -EFAULT; |
---|
| 2061 | + } else if (job->intr_status & m_RGA3_INT_WIN0_FBCD_DEC_ERR) { |
---|
| 2062 | + pr_err("win0 FBC decoder error, please check the fbc image of the source.\n"); |
---|
| 2063 | + job->ret = -EFAULT; |
---|
| 2064 | + } else if (job->intr_status & m_RGA3_INT_WIN1_FBCD_DEC_ERR) { |
---|
| 2065 | + pr_err("win1 FBC decoder error, please check the fbc image of the source.\n"); |
---|
| 2066 | + job->ret = -EFAULT; |
---|
| 2067 | + } else if (job->intr_status & m_RGA3_INT_RGA_MI_WR_BUS_ERR) { |
---|
| 2068 | + pr_err("wr buss error, please check size of the output_buffer or whether the buffer has been freed.\n"); |
---|
| 2069 | + job->ret = -EFAULT; |
---|
| 2070 | + } |
---|
| 2071 | + |
---|
| 2072 | + if (job->ret == 0) { |
---|
| 2073 | + pr_err("rga intr error[0x%x]!\n", job->intr_status); |
---|
| 2074 | + job->ret = -EFAULT; |
---|
| 2075 | + } |
---|
| 2076 | + } |
---|
| 2077 | + |
---|
| 2078 | + return IRQ_HANDLED; |
---|
| 2079 | +} |
---|
| 2080 | + |
---|
| 2081 | +const struct rga_backend_ops rga3_ops = { |
---|
| 2082 | + .get_version = rga3_get_version, |
---|
| 2083 | + .set_reg = rga3_set_reg, |
---|
| 2084 | + .init_reg = rga3_init_reg, |
---|
| 2085 | + .soft_reset = rga3_soft_reset, |
---|
| 2086 | + .read_back_reg = NULL, |
---|
| 2087 | + .irq = rga3_irq, |
---|
| 2088 | + .isr_thread = rga3_isr_thread, |
---|
| 2089 | +}; |
---|