.. | .. |
---|
7 | 7 | |
---|
8 | 8 | #define pr_fmt(fmt) "rga2_reg: " fmt |
---|
9 | 9 | |
---|
10 | | -#include "rga_job.h" |
---|
11 | 10 | #include "rga2_reg_info.h" |
---|
12 | 11 | #include "rga_dma_buf.h" |
---|
13 | 12 | #include "rga_iommu.h" |
---|
.. | .. |
---|
165 | 164 | |
---|
166 | 165 | bRGA_MODE_CTL = (u32 *) (base + RGA2_MODE_CTRL_OFFSET); |
---|
167 | 166 | |
---|
168 | | - if (msg->render_mode == 4) |
---|
169 | | - render_mode = 3; |
---|
170 | | - |
---|
171 | | - /* In slave mode, the current frame completion interrupt must be enabled. */ |
---|
172 | | - if (!RGA2_USE_MASTER_MODE) |
---|
173 | | - msg->CMD_fin_int_enable = 1; |
---|
| 167 | + if (msg->render_mode == UPDATE_PALETTE_TABLE_MODE) |
---|
| 168 | + render_mode = 0x3; |
---|
174 | 169 | |
---|
175 | 170 | reg = |
---|
176 | 171 | ((reg & (~m_RGA2_MODE_CTRL_SW_RENDER_MODE)) | |
---|
.. | .. |
---|
231 | 226 | u32 sw, sh; |
---|
232 | 227 | u32 dw, dh; |
---|
233 | 228 | u8 rotate_mode; |
---|
| 229 | + u8 vsp_scale_mode = 0; |
---|
234 | 230 | u8 scale_w_flag, scale_h_flag; |
---|
235 | 231 | |
---|
236 | 232 | bRGA_SRC_INFO = (u32 *) (base + RGA2_SRC_INFO_OFFSET); |
---|
.. | .. |
---|
292 | 288 | /* uvvds need to force tile mode. */ |
---|
293 | 289 | if (msg->uvvds_mode && scale_w_flag == 0) |
---|
294 | 290 | scale_w_flag = 3; |
---|
| 291 | + } |
---|
| 292 | + |
---|
| 293 | + /* VSP scale mode select, HSD > VSD > VSP > HSP */ |
---|
| 294 | + if (scale_h_flag == 0x2) { |
---|
| 295 | + /* After HSD, VSP needs to check dst_width */ |
---|
| 296 | + if ((scale_w_flag == 0x1) && (dw < RGA2_VSP_BICUBIC_LIMIT)) |
---|
| 297 | + vsp_scale_mode = 0x0; |
---|
| 298 | + else if (sw < RGA2_VSP_BICUBIC_LIMIT) |
---|
| 299 | + vsp_scale_mode = 0x0; |
---|
| 300 | + else |
---|
| 301 | + /* default select bilinear */ |
---|
| 302 | + vsp_scale_mode = 0x1; |
---|
295 | 303 | } |
---|
296 | 304 | |
---|
297 | 305 | switch (msg->src.format) { |
---|
.. | .. |
---|
564 | 572 | ((msg->alpha_rop_flag >> 4) & 0x1))); |
---|
565 | 573 | reg = |
---|
566 | 574 | ((reg & (~m_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL)) | |
---|
567 | | - (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL(( |
---|
568 | | - msg->scale_bicu_mode >> 4)))); |
---|
| 575 | + (s_RGA2_SRC_INFO_SW_SW_VSP_MODE_SEL((vsp_scale_mode)))); |
---|
569 | 576 | reg = |
---|
570 | 577 | ((reg & (~m_RGA2_SRC_INFO_SW_SW_YUV10_E)) | |
---|
571 | 578 | (s_RGA2_SRC_INFO_SW_SW_YUV10_E((yuv10)))); |
---|
.. | .. |
---|
1270 | 1277 | u32 *bRGA_ALPHA_CTRL0; |
---|
1271 | 1278 | u32 *bRGA_ALPHA_CTRL1; |
---|
1272 | 1279 | u32 *bRGA_FADING_CTRL; |
---|
1273 | | - u32 reg0 = 0; |
---|
1274 | | - u32 reg1 = 0; |
---|
| 1280 | + u32 reg = 0; |
---|
| 1281 | + union rga2_color_ctrl color_ctrl; |
---|
| 1282 | + union rga2_alpha_ctrl alpha_ctrl; |
---|
| 1283 | + struct rga_alpha_config *config; |
---|
1275 | 1284 | |
---|
1276 | 1285 | bRGA_ALPHA_CTRL0 = (u32 *) (base + RGA2_ALPHA_CTRL0_OFFSET); |
---|
1277 | 1286 | bRGA_ALPHA_CTRL1 = (u32 *) (base + RGA2_ALPHA_CTRL1_OFFSET); |
---|
1278 | 1287 | bRGA_FADING_CTRL = (u32 *) (base + RGA2_FADING_CTRL_OFFSET); |
---|
1279 | 1288 | |
---|
1280 | | - reg0 = |
---|
1281 | | - ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0)) | |
---|
| 1289 | + color_ctrl.value = 0; |
---|
| 1290 | + alpha_ctrl.value = 0; |
---|
| 1291 | + config = &msg->alpha_config; |
---|
| 1292 | + |
---|
| 1293 | + color_ctrl.bits.src_color_mode = |
---|
| 1294 | + config->fg_pre_multiplied ? RGA_ALPHA_PRE_MULTIPLIED : RGA_ALPHA_NO_PRE_MULTIPLIED; |
---|
| 1295 | + color_ctrl.bits.dst_color_mode = |
---|
| 1296 | + config->bg_pre_multiplied ? RGA_ALPHA_PRE_MULTIPLIED : RGA_ALPHA_NO_PRE_MULTIPLIED; |
---|
| 1297 | + |
---|
| 1298 | + if (config->fg_pixel_alpha_en) |
---|
| 1299 | + color_ctrl.bits.src_blend_mode = |
---|
| 1300 | + config->fg_global_alpha_en ? RGA_ALPHA_PER_PIXEL_GLOBAL : |
---|
| 1301 | + RGA_ALPHA_PER_PIXEL; |
---|
| 1302 | + else |
---|
| 1303 | + color_ctrl.bits.src_blend_mode = RGA_ALPHA_GLOBAL; |
---|
| 1304 | + |
---|
| 1305 | + if (config->bg_pixel_alpha_en) |
---|
| 1306 | + color_ctrl.bits.dst_blend_mode = |
---|
| 1307 | + config->bg_global_alpha_en ? RGA_ALPHA_PER_PIXEL_GLOBAL : |
---|
| 1308 | + RGA_ALPHA_PER_PIXEL; |
---|
| 1309 | + else |
---|
| 1310 | + color_ctrl.bits.dst_blend_mode = RGA_ALPHA_GLOBAL; |
---|
| 1311 | + |
---|
| 1312 | + /* |
---|
| 1313 | + * Since the hardware uses 256 as 1, the original alpha value needs to |
---|
| 1314 | + * be + (alpha >> 7). |
---|
| 1315 | + */ |
---|
| 1316 | + color_ctrl.bits.src_alpha_cal_mode = RGA_ALPHA_SATURATION; |
---|
| 1317 | + color_ctrl.bits.dst_alpha_cal_mode = RGA_ALPHA_SATURATION; |
---|
| 1318 | + |
---|
| 1319 | + /* porter duff alpha enable */ |
---|
| 1320 | + switch (config->mode) { |
---|
| 1321 | + case RGA_ALPHA_BLEND_SRC: |
---|
| 1322 | + /* |
---|
| 1323 | + * SRC mode: |
---|
| 1324 | + * Sf = 1, Df = 0; |
---|
| 1325 | + * [Rc,Ra] = [Sc,Sa]; |
---|
| 1326 | + */ |
---|
| 1327 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1328 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_ONE; |
---|
| 1329 | + |
---|
| 1330 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1331 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ZERO; |
---|
| 1332 | + |
---|
| 1333 | + break; |
---|
| 1334 | + |
---|
| 1335 | + case RGA_ALPHA_BLEND_DST: |
---|
| 1336 | + /* |
---|
| 1337 | + * SRC mode: |
---|
| 1338 | + * Sf = 0, Df = 1; |
---|
| 1339 | + * [Rc,Ra] = [Dc,Da]; |
---|
| 1340 | + */ |
---|
| 1341 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1342 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_ZERO; |
---|
| 1343 | + |
---|
| 1344 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1345 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ONE; |
---|
| 1346 | + |
---|
| 1347 | + break; |
---|
| 1348 | + |
---|
| 1349 | + case RGA_ALPHA_BLEND_SRC_OVER: |
---|
| 1350 | + /* |
---|
| 1351 | + * SRC-OVER mode: |
---|
| 1352 | + * Sf = 1, Df = (1 - Sa) |
---|
| 1353 | + * [Rc,Ra] = [ Sc + (1 - Sa) * Dc, Sa + (1 - Sa) * Da ] |
---|
| 1354 | + */ |
---|
| 1355 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1356 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_ONE; |
---|
| 1357 | + |
---|
| 1358 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1359 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1360 | + |
---|
| 1361 | + break; |
---|
| 1362 | + |
---|
| 1363 | + case RGA_ALPHA_BLEND_DST_OVER: |
---|
| 1364 | + /* |
---|
| 1365 | + * DST-OVER mode: |
---|
| 1366 | + * Sf = (1 - Da) , Df = 1 |
---|
| 1367 | + * [Rc,Ra] = [ Sc * (1 - Da) + Dc, Sa * (1 - Da) + Da ] |
---|
| 1368 | + */ |
---|
| 1369 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1370 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1371 | + |
---|
| 1372 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1373 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ONE; |
---|
| 1374 | + |
---|
| 1375 | + break; |
---|
| 1376 | + |
---|
| 1377 | + case RGA_ALPHA_BLEND_SRC_IN: |
---|
| 1378 | + /* |
---|
| 1379 | + * SRC-IN mode: |
---|
| 1380 | + * Sf = Da , Df = 0 |
---|
| 1381 | + * [Rc,Ra] = [ Sc * Da, Sa * Da ] |
---|
| 1382 | + */ |
---|
| 1383 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1384 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE; |
---|
| 1385 | + |
---|
| 1386 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1387 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ZERO; |
---|
| 1388 | + |
---|
| 1389 | + break; |
---|
| 1390 | + |
---|
| 1391 | + case RGA_ALPHA_BLEND_DST_IN: |
---|
| 1392 | + /* |
---|
| 1393 | + * DST-IN mode: |
---|
| 1394 | + * Sf = 0 , Df = Sa |
---|
| 1395 | + * [Rc,Ra] = [ Dc * Sa, Da * Sa ] |
---|
| 1396 | + */ |
---|
| 1397 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1398 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_ZERO; |
---|
| 1399 | + |
---|
| 1400 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1401 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE; |
---|
| 1402 | + |
---|
| 1403 | + break; |
---|
| 1404 | + |
---|
| 1405 | + case RGA_ALPHA_BLEND_SRC_OUT: |
---|
| 1406 | + /* |
---|
| 1407 | + * SRC-OUT mode: |
---|
| 1408 | + * Sf = (1 - Da) , Df = 0 |
---|
| 1409 | + * [Rc,Ra] = [ Sc * (1 - Da), Sa * (1 - Da) ] |
---|
| 1410 | + */ |
---|
| 1411 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1412 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1413 | + |
---|
| 1414 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1415 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ZERO; |
---|
| 1416 | + |
---|
| 1417 | + break; |
---|
| 1418 | + |
---|
| 1419 | + case RGA_ALPHA_BLEND_DST_OUT: |
---|
| 1420 | + /* |
---|
| 1421 | + * DST-OUT mode: |
---|
| 1422 | + * Sf = 0 , Df = (1 - Sa) |
---|
| 1423 | + * [Rc,Ra] = [ Dc * (1 - Sa), Da * (1 - Sa) ] |
---|
| 1424 | + */ |
---|
| 1425 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1426 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_ZERO; |
---|
| 1427 | + |
---|
| 1428 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1429 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1430 | + |
---|
| 1431 | + break; |
---|
| 1432 | + |
---|
| 1433 | + case RGA_ALPHA_BLEND_SRC_ATOP: |
---|
| 1434 | + /* |
---|
| 1435 | + * SRC-ATOP mode: |
---|
| 1436 | + * Sf = Da , Df = (1 - Sa) |
---|
| 1437 | + * [Rc,Ra] = [ Sc * Da + Dc * (1 - Sa), Sa * Da + Da * (1 - Sa) ] |
---|
| 1438 | + */ |
---|
| 1439 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1440 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE; |
---|
| 1441 | + |
---|
| 1442 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1443 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1444 | + |
---|
| 1445 | + break; |
---|
| 1446 | + |
---|
| 1447 | + case RGA_ALPHA_BLEND_DST_ATOP: |
---|
| 1448 | + /* |
---|
| 1449 | + * DST-ATOP mode: |
---|
| 1450 | + * Sf = (1 - Da) , Df = Sa |
---|
| 1451 | + * [Rc,Ra] = [ Sc * (1 - Da) + Dc * Sa, Sa * (1 - Da) + Da * Sa ] |
---|
| 1452 | + */ |
---|
| 1453 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1454 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1455 | + |
---|
| 1456 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1457 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE; |
---|
| 1458 | + |
---|
| 1459 | + break; |
---|
| 1460 | + |
---|
| 1461 | + case RGA_ALPHA_BLEND_XOR: |
---|
| 1462 | + /* |
---|
| 1463 | + * DST-XOR mode: |
---|
| 1464 | + * Sf = (1 - Da) , Df = (1 - Sa) |
---|
| 1465 | + * [Rc,Ra] = [ Sc * (1 - Da) + Dc * (1 - Sa), Sa * (1 - Da) + Da * (1 - Sa) ] |
---|
| 1466 | + */ |
---|
| 1467 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1468 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1469 | + |
---|
| 1470 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1471 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_OPPOSITE_INVERSE; |
---|
| 1472 | + |
---|
| 1473 | + break; |
---|
| 1474 | + |
---|
| 1475 | + case RGA_ALPHA_BLEND_CLEAR: |
---|
| 1476 | + /* |
---|
| 1477 | + * DST-CLEAR mode: |
---|
| 1478 | + * Sf = 0 , Df = 0 |
---|
| 1479 | + * [Rc,Ra] = [ 0, 0 ] |
---|
| 1480 | + */ |
---|
| 1481 | + color_ctrl.bits.src_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1482 | + color_ctrl.bits.src_factor_mode = RGA_ALPHA_ZERO; |
---|
| 1483 | + |
---|
| 1484 | + color_ctrl.bits.dst_alpha_mode = RGA_ALPHA_STRAIGHT; |
---|
| 1485 | + color_ctrl.bits.dst_factor_mode = RGA_ALPHA_ZERO; |
---|
| 1486 | + |
---|
| 1487 | + break; |
---|
| 1488 | + |
---|
| 1489 | + default: |
---|
| 1490 | + break; |
---|
| 1491 | + } |
---|
| 1492 | + |
---|
| 1493 | + alpha_ctrl.bits.src_blend_mode = color_ctrl.bits.src_blend_mode; |
---|
| 1494 | + alpha_ctrl.bits.dst_blend_mode = color_ctrl.bits.dst_blend_mode; |
---|
| 1495 | + |
---|
| 1496 | + alpha_ctrl.bits.src_alpha_cal_mode = color_ctrl.bits.src_alpha_cal_mode; |
---|
| 1497 | + alpha_ctrl.bits.dst_alpha_cal_mode = color_ctrl.bits.dst_alpha_cal_mode; |
---|
| 1498 | + |
---|
| 1499 | + alpha_ctrl.bits.src_alpha_mode = color_ctrl.bits.src_alpha_mode; |
---|
| 1500 | + alpha_ctrl.bits.src_factor_mode = color_ctrl.bits.src_factor_mode; |
---|
| 1501 | + |
---|
| 1502 | + alpha_ctrl.bits.dst_alpha_mode = color_ctrl.bits.dst_alpha_mode; |
---|
| 1503 | + alpha_ctrl.bits.dst_factor_mode = color_ctrl.bits.dst_factor_mode; |
---|
| 1504 | + |
---|
| 1505 | + reg = |
---|
| 1506 | + ((reg & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0)) | |
---|
1282 | 1507 | (s_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_0(msg->alpha_rop_flag))); |
---|
1283 | | - reg0 = |
---|
1284 | | - ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL)) | |
---|
| 1508 | + reg = |
---|
| 1509 | + ((reg & (~m_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL)) | |
---|
1285 | 1510 | (s_RGA2_ALPHA_CTRL0_SW_ALPHA_ROP_SEL |
---|
1286 | 1511 | (msg->alpha_rop_flag >> 1))); |
---|
1287 | | - reg0 = |
---|
1288 | | - ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_ROP_MODE)) | |
---|
| 1512 | + reg = |
---|
| 1513 | + ((reg & (~m_RGA2_ALPHA_CTRL0_SW_ROP_MODE)) | |
---|
1289 | 1514 | (s_RGA2_ALPHA_CTRL0_SW_ROP_MODE(msg->rop_mode))); |
---|
1290 | | - reg0 = |
---|
1291 | | - ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA)) | |
---|
| 1515 | + reg = |
---|
| 1516 | + ((reg & (~m_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA)) | |
---|
1292 | 1517 | (s_RGA2_ALPHA_CTRL0_SW_SRC_GLOBAL_ALPHA |
---|
1293 | | - (msg->src_a_global_val))); |
---|
1294 | | - reg0 = |
---|
1295 | | - ((reg0 & (~m_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA)) | |
---|
| 1518 | + ((uint8_t)config->fg_global_alpha_value))); |
---|
| 1519 | + reg = |
---|
| 1520 | + ((reg & (~m_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA)) | |
---|
1296 | 1521 | (s_RGA2_ALPHA_CTRL0_SW_DST_GLOBAL_ALPHA |
---|
1297 | | - (msg->dst_a_global_val))); |
---|
| 1522 | + ((uint8_t)config->bg_global_alpha_value))); |
---|
1298 | 1523 | |
---|
1299 | | - reg1 = |
---|
1300 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_COLOR_M0)) | |
---|
1301 | | - (s_RGA2_ALPHA_CTRL1_SW_DST_COLOR_M0 |
---|
1302 | | - (msg->alpha_mode_0 >> 15))); |
---|
1303 | | - reg1 = |
---|
1304 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_COLOR_M0)) | |
---|
1305 | | - (s_RGA2_ALPHA_CTRL1_SW_SRC_COLOR_M0 |
---|
1306 | | - (msg->alpha_mode_0 >> 7))); |
---|
1307 | | - reg1 = |
---|
1308 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M0)) | |
---|
1309 | | - (s_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M0 |
---|
1310 | | - (msg->alpha_mode_0 >> 12))); |
---|
1311 | | - reg1 = |
---|
1312 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M0)) | |
---|
1313 | | - (s_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M0 |
---|
1314 | | - (msg->alpha_mode_0 >> 4))); |
---|
1315 | | - reg1 = |
---|
1316 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M0)) | |
---|
1317 | | - (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M0 |
---|
1318 | | - (msg->alpha_mode_0 >> 11))); |
---|
1319 | | - reg1 = |
---|
1320 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M0)) | |
---|
1321 | | - (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M0 |
---|
1322 | | - (msg->alpha_mode_0 >> 3))); |
---|
1323 | | - reg1 = |
---|
1324 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M0)) | |
---|
1325 | | - (s_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M0 |
---|
1326 | | - (msg->alpha_mode_0 >> 9))); |
---|
1327 | | - reg1 = |
---|
1328 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M0)) | |
---|
1329 | | - (s_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M0 |
---|
1330 | | - (msg->alpha_mode_0 >> 1))); |
---|
1331 | | - reg1 = |
---|
1332 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M0)) | |
---|
1333 | | - (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M0 |
---|
1334 | | - (msg->alpha_mode_0 >> 8))); |
---|
1335 | | - reg1 = |
---|
1336 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M0)) | |
---|
1337 | | - (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M0 |
---|
1338 | | - (msg->alpha_mode_0 >> 0))); |
---|
| 1524 | + *bRGA_ALPHA_CTRL0 = reg; |
---|
| 1525 | + *bRGA_ALPHA_CTRL1 = color_ctrl.value | (alpha_ctrl.value << 16); |
---|
1339 | 1526 | |
---|
1340 | | - reg1 = |
---|
1341 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M1)) | |
---|
1342 | | - (s_RGA2_ALPHA_CTRL1_SW_DST_FACTOR_M1 |
---|
1343 | | - (msg->alpha_mode_1 >> 12))); |
---|
1344 | | - reg1 = |
---|
1345 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M1)) | |
---|
1346 | | - (s_RGA2_ALPHA_CTRL1_SW_SRC_FACTOR_M1 |
---|
1347 | | - (msg->alpha_mode_1 >> 4))); |
---|
1348 | | - reg1 = |
---|
1349 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M1)) | |
---|
1350 | | - (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_CAL_M1 |
---|
1351 | | - (msg->alpha_mode_1 >> 11))); |
---|
1352 | | - reg1 = |
---|
1353 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M1)) | |
---|
1354 | | - (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_CAL_M1 |
---|
1355 | | - (msg->alpha_mode_1 >> 3))); |
---|
1356 | | - reg1 = |
---|
1357 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M1)) | |
---|
1358 | | - (s_RGA2_ALPHA_CTRL1_SW_DST_BLEND_M1(msg->alpha_mode_1 >> 9))); |
---|
1359 | | - reg1 = |
---|
1360 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M1)) | |
---|
1361 | | - (s_RGA2_ALPHA_CTRL1_SW_SRC_BLEND_M1(msg->alpha_mode_1 >> 1))); |
---|
1362 | | - reg1 = |
---|
1363 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M1)) | |
---|
1364 | | - (s_RGA2_ALPHA_CTRL1_SW_DST_ALPHA_M1(msg->alpha_mode_1 >> 8))); |
---|
1365 | | - reg1 = |
---|
1366 | | - ((reg1 & (~m_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M1)) | |
---|
1367 | | - (s_RGA2_ALPHA_CTRL1_SW_SRC_ALPHA_M1(msg->alpha_mode_1 >> 0))); |
---|
1368 | | - |
---|
1369 | | - *bRGA_ALPHA_CTRL0 = reg0; |
---|
1370 | | - *bRGA_ALPHA_CTRL1 = reg1; |
---|
1371 | 1527 | |
---|
1372 | 1528 | if ((msg->alpha_rop_flag >> 2) & 1) { |
---|
1373 | 1529 | *bRGA_FADING_CTRL = (1 << 24) | (msg->fading_b_value << 16) | |
---|
.. | .. |
---|
1715 | 1871 | *bRGA_MMU_ELS_BASE = (u32) (msg->mmu_info.els_base_addr) >> 4; |
---|
1716 | 1872 | } |
---|
1717 | 1873 | |
---|
1718 | | -int rga2_gen_reg_info(u8 *base, struct rga2_req *msg) |
---|
| 1874 | +static int rga2_gen_reg_info(u8 *base, struct rga2_req *msg) |
---|
1719 | 1875 | { |
---|
1720 | 1876 | u8 dst_nn_quantize_en = 0; |
---|
1721 | 1877 | |
---|
.. | .. |
---|
1769 | 1925 | static void rga_cmd_to_rga2_cmd(struct rga_scheduler_t *scheduler, |
---|
1770 | 1926 | struct rga_req *req_rga, struct rga2_req *req) |
---|
1771 | 1927 | { |
---|
1772 | | - u16 alpha_mode_0, alpha_mode_1; |
---|
1773 | | - |
---|
1774 | 1928 | if (req_rga->render_mode == 6) |
---|
1775 | 1929 | req->render_mode = UPDATE_PALETTE_TABLE_MODE; |
---|
1776 | 1930 | else if (req_rga->render_mode == 7) |
---|
.. | .. |
---|
1848 | 2002 | break; |
---|
1849 | 2003 | } |
---|
1850 | 2004 | |
---|
1851 | | - if ((req->dst.act_w > 2048) && (req->src.act_h < req->dst.act_h)) |
---|
1852 | | - req->scale_bicu_mode |= (1 << 4); |
---|
1853 | | - |
---|
1854 | 2005 | req->LUT_addr = req_rga->LUT_addr; |
---|
1855 | 2006 | req->rop_mask_addr = req_rga->rop_mask_addr; |
---|
1856 | 2007 | |
---|
.. | .. |
---|
1873 | 2024 | |
---|
1874 | 2025 | req->palette_mode = req_rga->palette_mode; |
---|
1875 | 2026 | req->yuv2rgb_mode = req_rga->yuv2rgb_mode; |
---|
| 2027 | + if (req_rga->full_csc.flag & 0x1) |
---|
| 2028 | + req->full_csc_en = 1; |
---|
1876 | 2029 | req->endian_mode = req_rga->endian_mode; |
---|
1877 | 2030 | req->rgb2yuv_mode = 0; |
---|
1878 | 2031 | |
---|
.. | .. |
---|
1914 | 2067 | |
---|
1915 | 2068 | if (((req_rga->alpha_rop_flag) & 1)) { |
---|
1916 | 2069 | if ((req_rga->alpha_rop_flag >> 3) & 1) { |
---|
1917 | | - /* porter duff alpha enable */ |
---|
1918 | | - switch (req_rga->PD_mode) { |
---|
1919 | | - /* dst = 0 */ |
---|
1920 | | - case 0: |
---|
1921 | | - break; |
---|
1922 | | - /* dst = src */ |
---|
1923 | | - case 1: |
---|
1924 | | - req->alpha_mode_0 = 0x0212; |
---|
1925 | | - req->alpha_mode_1 = 0x0212; |
---|
1926 | | - break; |
---|
1927 | | - /* dst = dst */ |
---|
1928 | | - case 2: |
---|
1929 | | - req->alpha_mode_0 = 0x1202; |
---|
1930 | | - req->alpha_mode_1 = 0x1202; |
---|
1931 | | - break; |
---|
1932 | | - /* dst = (256*sc + (256 - sa)*dc) >> 8 */ |
---|
1933 | | - case 3: |
---|
1934 | | - if ((req_rga->alpha_rop_mode & 3) == 0) { |
---|
1935 | | - /* both use globalAlpha. */ |
---|
1936 | | - alpha_mode_0 = 0x3010; |
---|
1937 | | - alpha_mode_1 = 0x3010; |
---|
1938 | | - } else if ((req_rga->alpha_rop_mode & 3) == 1) { |
---|
1939 | | - /* Do not use globalAlpha. */ |
---|
1940 | | - alpha_mode_0 = 0x3212; |
---|
1941 | | - alpha_mode_1 = 0x3212; |
---|
1942 | | - } else if ((req_rga->alpha_rop_mode & 3) == 2) { |
---|
1943 | | - /* |
---|
1944 | | - * dst use globalAlpha, |
---|
1945 | | - * and dst has pixelAlpha. |
---|
1946 | | - */ |
---|
1947 | | - alpha_mode_0 = 0x3014; |
---|
1948 | | - alpha_mode_1 = 0x3014; |
---|
1949 | | - } else { |
---|
1950 | | - /* |
---|
1951 | | - * dst use globalAlpha, and |
---|
1952 | | - * dst does not have pixelAlpha. |
---|
1953 | | - */ |
---|
1954 | | - alpha_mode_0 = 0x3012; |
---|
1955 | | - alpha_mode_1 = 0x3012; |
---|
1956 | | - } |
---|
1957 | | - req->alpha_mode_0 = alpha_mode_0; |
---|
1958 | | - req->alpha_mode_1 = alpha_mode_1; |
---|
1959 | | - break; |
---|
1960 | | - /* dst = (sc*(256-da) + 256*dc) >> 8 */ |
---|
1961 | | - case 4: |
---|
1962 | | - /* Do not use globalAlpha. */ |
---|
1963 | | - req->alpha_mode_0 = 0x1232; |
---|
1964 | | - req->alpha_mode_1 = 0x1232; |
---|
1965 | | - break; |
---|
1966 | | - /* dst = (da*sc) >> 8 */ |
---|
1967 | | - case 5: |
---|
1968 | | - break; |
---|
1969 | | - /* dst = (sa*dc) >> 8 */ |
---|
1970 | | - case 6: |
---|
1971 | | - break; |
---|
1972 | | - /* dst = ((256-da)*sc) >> 8 */ |
---|
1973 | | - case 7: |
---|
1974 | | - break; |
---|
1975 | | - /* dst = ((256-sa)*dc) >> 8 */ |
---|
1976 | | - case 8: |
---|
1977 | | - break; |
---|
1978 | | - /* dst = (da*sc + (256-sa)*dc) >> 8 */ |
---|
1979 | | - case 9: |
---|
1980 | | - req->alpha_mode_0 = 0x3040; |
---|
1981 | | - req->alpha_mode_1 = 0x3040; |
---|
1982 | | - break; |
---|
1983 | | - /* dst = ((256-da)*sc + (sa*dc)) >> 8 */ |
---|
1984 | | - case 10: |
---|
1985 | | - break; |
---|
1986 | | - /* dst = ((256-da)*sc + (256-sa)*dc) >> 8 */ |
---|
1987 | | - case 11: |
---|
1988 | | - break; |
---|
1989 | | - case 12: |
---|
1990 | | - req->alpha_mode_0 = 0x0010; |
---|
1991 | | - req->alpha_mode_1 = 0x0820; |
---|
1992 | | - break; |
---|
1993 | | - default: |
---|
1994 | | - break; |
---|
1995 | | - } |
---|
| 2070 | + req->alpha_config.enable = true; |
---|
1996 | 2071 | |
---|
1997 | | - if (req->osd_info.enable) { |
---|
1998 | | - /* set dst(osd_block) real color mode */ |
---|
1999 | | - if (req->alpha_mode_0 & (0x01 << 9)) |
---|
2000 | | - req->alpha_mode_0 |= (1 << 15); |
---|
2001 | | - } |
---|
2002 | | - |
---|
2003 | | - /* Real color mode */ |
---|
2004 | 2072 | if ((req_rga->alpha_rop_flag >> 9) & 1) { |
---|
2005 | | - if (req->alpha_mode_0 & (0x01 << 1)) |
---|
2006 | | - req->alpha_mode_0 |= (1 << 7); |
---|
2007 | | - if (req->alpha_mode_0 & (0x01 << 9)) |
---|
2008 | | - req->alpha_mode_0 |= (1 << 15); |
---|
| 2073 | + req->alpha_config.fg_pre_multiplied = false; |
---|
| 2074 | + req->alpha_config.bg_pre_multiplied = false; |
---|
| 2075 | + } else if (req->osd_info.enable) { |
---|
| 2076 | + req->alpha_config.fg_pre_multiplied = true; |
---|
| 2077 | + /* set dst(osd_block) real color mode */ |
---|
| 2078 | + req->alpha_config.bg_pre_multiplied = false; |
---|
| 2079 | + } else { |
---|
| 2080 | + req->alpha_config.fg_pre_multiplied = true; |
---|
| 2081 | + req->alpha_config.bg_pre_multiplied = true; |
---|
2009 | 2082 | } |
---|
2010 | | - } else { |
---|
2011 | | - if ((req_rga->alpha_rop_mode & 3) == 0) { |
---|
2012 | | - req->alpha_mode_0 = 0x3040; |
---|
2013 | | - req->alpha_mode_1 = 0x3040; |
---|
2014 | | - } else if ((req_rga->alpha_rop_mode & 3) == 1) { |
---|
2015 | | - req->alpha_mode_0 = 0x3042; |
---|
2016 | | - req->alpha_mode_1 = 0x3242; |
---|
2017 | | - } else if ((req_rga->alpha_rop_mode & 3) == 2) { |
---|
2018 | | - req->alpha_mode_0 = 0x3044; |
---|
2019 | | - req->alpha_mode_1 = 0x3044; |
---|
| 2083 | + |
---|
| 2084 | + req->alpha_config.fg_pixel_alpha_en = rga_is_alpha_format(req->src.format); |
---|
| 2085 | + if (req->bitblt_mode) |
---|
| 2086 | + req->alpha_config.bg_pixel_alpha_en = |
---|
| 2087 | + rga_is_alpha_format(req->src1.format); |
---|
| 2088 | + else |
---|
| 2089 | + req->alpha_config.bg_pixel_alpha_en = |
---|
| 2090 | + rga_is_alpha_format(req->dst.format); |
---|
| 2091 | + |
---|
| 2092 | + if (req_rga->feature.global_alpha_en) { |
---|
| 2093 | + if (req_rga->fg_global_alpha < 0xff) { |
---|
| 2094 | + req->alpha_config.fg_global_alpha_en = true; |
---|
| 2095 | + req->alpha_config.fg_global_alpha_value = |
---|
| 2096 | + req_rga->fg_global_alpha; |
---|
| 2097 | + } else if (!req->alpha_config.fg_pixel_alpha_en) { |
---|
| 2098 | + req->alpha_config.fg_global_alpha_en = true; |
---|
| 2099 | + req->alpha_config.fg_global_alpha_value = 0xff; |
---|
| 2100 | + } |
---|
| 2101 | + |
---|
| 2102 | + if (req_rga->bg_global_alpha < 0xff) { |
---|
| 2103 | + req->alpha_config.bg_global_alpha_en = true; |
---|
| 2104 | + req->alpha_config.bg_global_alpha_value = |
---|
| 2105 | + req_rga->bg_global_alpha; |
---|
| 2106 | + } else if (!req->alpha_config.bg_pixel_alpha_en) { |
---|
| 2107 | + req->alpha_config.bg_global_alpha_en = true; |
---|
| 2108 | + req->alpha_config.bg_global_alpha_value = 0xff; |
---|
| 2109 | + } |
---|
| 2110 | + } else { |
---|
| 2111 | + req->alpha_config.bg_global_alpha_value = 0xff; |
---|
| 2112 | + req->alpha_config.bg_global_alpha_value = 0xff; |
---|
2020 | 2113 | } |
---|
| 2114 | + |
---|
| 2115 | + req->alpha_config.mode = req_rga->PD_mode; |
---|
2021 | 2116 | } |
---|
2022 | 2117 | } |
---|
2023 | 2118 | |
---|
.. | .. |
---|
2060 | 2155 | } |
---|
2061 | 2156 | } |
---|
2062 | 2157 | |
---|
2063 | | -void rga2_soft_reset(struct rga_scheduler_t *scheduler) |
---|
| 2158 | +static void rga2_soft_reset(struct rga_scheduler_t *scheduler) |
---|
2064 | 2159 | { |
---|
2065 | 2160 | u32 i; |
---|
2066 | 2161 | u32 reg; |
---|
2067 | | - u32 iommu_dte_addr; |
---|
| 2162 | + u32 iommu_dte_addr = 0; |
---|
2068 | 2163 | |
---|
2069 | 2164 | if (scheduler->data->mmu == RGA_IOMMU) |
---|
2070 | | - iommu_dte_addr = rga_read(0xf00, scheduler); |
---|
| 2165 | + iommu_dte_addr = rga_read(RGA_IOMMU_DTE_ADDR, scheduler); |
---|
2071 | 2166 | |
---|
2072 | | - rga_write((1 << 3) | (1 << 4) | (1 << 6), RGA2_SYS_CTRL, scheduler); |
---|
| 2167 | + rga_write(m_RGA2_SYS_CTRL_ACLK_SRESET_P | m_RGA2_SYS_CTRL_CCLK_SRESET_P | |
---|
| 2168 | + m_RGA2_SYS_CTRL_RST_PROTECT_P, |
---|
| 2169 | + RGA2_SYS_CTRL, scheduler); |
---|
2073 | 2170 | |
---|
2074 | 2171 | for (i = 0; i < RGA_RESET_TIMEOUT; i++) { |
---|
2075 | 2172 | /* RGA_SYS_CTRL */ |
---|
.. | .. |
---|
2082 | 2179 | } |
---|
2083 | 2180 | |
---|
2084 | 2181 | if (scheduler->data->mmu == RGA_IOMMU) { |
---|
2085 | | - rga_write(iommu_dte_addr, 0xf00, scheduler); |
---|
| 2182 | + rga_write(iommu_dte_addr, RGA_IOMMU_DTE_ADDR, scheduler); |
---|
2086 | 2183 | /* enable iommu */ |
---|
2087 | | - rga_write(0, 0xf08, scheduler); |
---|
| 2184 | + rga_write(RGA_IOMMU_CMD_ENABLE_PAGING, RGA_IOMMU_COMMAND, scheduler); |
---|
2088 | 2185 | } |
---|
2089 | 2186 | |
---|
2090 | 2187 | if (i == RGA_RESET_TIMEOUT) |
---|
2091 | | - pr_err("soft reset timeout.\n"); |
---|
| 2188 | + pr_err("RAG2 core[%d] soft reset timeout.\n", scheduler->core); |
---|
| 2189 | + else |
---|
| 2190 | + pr_info("RGA2 core[%d] soft reset complete.\n", scheduler->core); |
---|
| 2191 | + |
---|
2092 | 2192 | } |
---|
2093 | 2193 | |
---|
2094 | 2194 | static int rga2_check_param(const struct rga_hw_data *data, const struct rga2_req *req) |
---|
.. | .. |
---|
2207 | 2307 | pr_info("mmu: src=%.2x src1=%.2x dst=%.2x els=%.2x\n", |
---|
2208 | 2308 | req->mmu_info.src0_mmu_flag, req->mmu_info.src1_mmu_flag, |
---|
2209 | 2309 | req->mmu_info.dst_mmu_flag, req->mmu_info.els_mmu_flag); |
---|
2210 | | - pr_info("alpha: flag %x mode0=%x mode1=%x\n", req->alpha_rop_flag, |
---|
2211 | | - req->alpha_mode_0, req->alpha_mode_1); |
---|
2212 | | - pr_info("blend mode is %s\n", |
---|
2213 | | - rga_get_blend_mode_str(req->alpha_rop_flag, req->alpha_mode_0, |
---|
2214 | | - req->alpha_mode_1)); |
---|
| 2310 | + pr_info("alpha: flag %x mode=%s\n", |
---|
| 2311 | + req->alpha_rop_flag, rga_get_blend_mode_str(req->alpha_config.mode)); |
---|
| 2312 | + pr_info("alpha: pre_multi=[%d,%d] pixl=[%d,%d] glb=[%d,%d]\n", |
---|
| 2313 | + req->alpha_config.fg_pre_multiplied, req->alpha_config.bg_pre_multiplied, |
---|
| 2314 | + req->alpha_config.fg_pixel_alpha_en, req->alpha_config.bg_pixel_alpha_en, |
---|
| 2315 | + req->alpha_config.fg_global_alpha_en, req->alpha_config.bg_global_alpha_en); |
---|
| 2316 | + pr_info("alpha: fg_global_alpha=%x bg_global_alpha=%x\n", |
---|
| 2317 | + req->alpha_config.fg_global_alpha_value, req->alpha_config.bg_global_alpha_value); |
---|
2215 | 2318 | pr_info("yuv2rgb mode is %x\n", req->yuv2rgb_mode); |
---|
2216 | 2319 | } |
---|
2217 | 2320 | |
---|
2218 | | -int rga2_init_reg(struct rga_job *job) |
---|
| 2321 | +static int rga2_init_reg(struct rga_job *job) |
---|
2219 | 2322 | { |
---|
2220 | 2323 | struct rga2_req req; |
---|
2221 | 2324 | int ret = 0; |
---|
2222 | 2325 | struct rga_scheduler_t *scheduler = NULL; |
---|
| 2326 | + ktime_t timestamp = ktime_get(); |
---|
2223 | 2327 | |
---|
2224 | 2328 | scheduler = job->scheduler; |
---|
2225 | 2329 | if (unlikely(scheduler == NULL)) { |
---|
.. | .. |
---|
2230 | 2334 | memset(&req, 0x0, sizeof(req)); |
---|
2231 | 2335 | |
---|
2232 | 2336 | rga_cmd_to_rga2_cmd(scheduler, &job->rga_command_base, &req); |
---|
2233 | | - memcpy(&job->full_csc, &job->rga_command_base.full_csc, sizeof(job->full_csc)); |
---|
| 2337 | + if (req.full_csc_en) { |
---|
| 2338 | + memcpy(&job->full_csc, &job->rga_command_base.full_csc, sizeof(job->full_csc)); |
---|
| 2339 | + if (job->rga_command_base.feature.full_csc_clip_en) { |
---|
| 2340 | + memcpy(&job->full_csc_clip, &job->rga_command_base.full_csc_clip, |
---|
| 2341 | + sizeof(job->full_csc_clip)); |
---|
| 2342 | + } else { |
---|
| 2343 | + job->full_csc_clip.y.max = 0xff; |
---|
| 2344 | + job->full_csc_clip.y.min = 0x0; |
---|
| 2345 | + job->full_csc_clip.uv.max = 0xff; |
---|
| 2346 | + job->full_csc_clip.uv.min = 0x0; |
---|
| 2347 | + } |
---|
| 2348 | + |
---|
| 2349 | + } else { |
---|
| 2350 | + job->full_csc_clip.y.max = 0xff; |
---|
| 2351 | + job->full_csc_clip.y.min = 0x0; |
---|
| 2352 | + job->full_csc_clip.uv.max = 0xff; |
---|
| 2353 | + job->full_csc_clip.uv.min = 0x0; |
---|
| 2354 | + } |
---|
2234 | 2355 | memcpy(&job->pre_intr_info, &job->rga_command_base.pre_intr_info, |
---|
2235 | 2356 | sizeof(job->pre_intr_info)); |
---|
2236 | 2357 | |
---|
.. | .. |
---|
2267 | 2388 | } |
---|
2268 | 2389 | } |
---|
2269 | 2390 | |
---|
| 2391 | + /* In slave mode, the current frame completion interrupt must be enabled. */ |
---|
| 2392 | + if (scheduler->data->mmu == RGA_IOMMU) |
---|
| 2393 | + req.CMD_fin_int_enable = 1; |
---|
| 2394 | + |
---|
2270 | 2395 | if (rga2_gen_reg_info((uint8_t *)job->cmd_reg, &req) == -1) { |
---|
2271 | 2396 | pr_err("gen reg info error\n"); |
---|
2272 | 2397 | return -EINVAL; |
---|
2273 | 2398 | } |
---|
| 2399 | + |
---|
| 2400 | + if (DEBUGGER_EN(TIME)) |
---|
| 2401 | + pr_info("request[%d], generate register cost time %lld us\n", |
---|
| 2402 | + job->request_id, ktime_us_delta(ktime_get(), timestamp)); |
---|
2274 | 2403 | |
---|
2275 | 2404 | return ret; |
---|
2276 | 2405 | } |
---|
.. | .. |
---|
2338 | 2467 | cmd_reg[2 + i * 4], cmd_reg[3 + i * 4]); |
---|
2339 | 2468 | } |
---|
2340 | 2469 | |
---|
2341 | | -void rga2_dump_read_back_reg(struct rga_scheduler_t *scheduler) |
---|
| 2470 | +static void rga2_dump_read_back_reg(struct rga_scheduler_t *scheduler) |
---|
2342 | 2471 | { |
---|
2343 | 2472 | rga2_dump_read_back_sys_reg(scheduler); |
---|
2344 | 2473 | rga2_dump_read_back_csc_reg(scheduler); |
---|
.. | .. |
---|
2351 | 2480 | |
---|
2352 | 2481 | if (job->pre_intr_info.read_intr_en) { |
---|
2353 | 2482 | reg = s_RGA2_READ_LINE_SW_INTR_LINE_RD_TH(job->pre_intr_info.read_threshold); |
---|
2354 | | - rga_write(reg, RGA2_READ_LINE_CNT_OFFSET, scheduler); |
---|
| 2483 | + rga_write(reg, RGA2_READ_LINE_CNT, scheduler); |
---|
2355 | 2484 | } |
---|
2356 | 2485 | |
---|
2357 | 2486 | if (job->pre_intr_info.write_intr_en) { |
---|
2358 | 2487 | reg = s_RGA2_WRITE_LINE_SW_INTR_LINE_WR_START(job->pre_intr_info.write_start); |
---|
2359 | 2488 | reg = ((reg & (~m_RGA2_WRITE_LINE_SW_INTR_LINE_WR_STEP)) | |
---|
2360 | 2489 | (s_RGA2_WRITE_LINE_SW_INTR_LINE_WR_STEP(job->pre_intr_info.write_step))); |
---|
2361 | | - rga_write(reg, RGA2_WRITE_LINE_CNT_OFFSET, scheduler); |
---|
| 2490 | + rga_write(reg, RGA2_WRITE_LINE_CNT, scheduler); |
---|
2362 | 2491 | } |
---|
2363 | 2492 | |
---|
2364 | | - reg = rga_read(RGA2_SYS_CTRL_OFFSET, scheduler); |
---|
2365 | | - reg = ((reg & (~m_RGA2_SYS_HOLD_MODE_EN)) | |
---|
2366 | | - (s_RGA2_SYS_HOLD_MODE_EN(job->pre_intr_info.read_hold_en))); |
---|
2367 | | - rga_write(reg, RGA2_SYS_CTRL_OFFSET, scheduler); |
---|
| 2493 | + reg = rga_read(RGA2_SYS_CTRL, scheduler); |
---|
| 2494 | + reg = ((reg & (~m_RGA2_SYS_CTRL_HOLD_MODE_EN)) | |
---|
| 2495 | + (s_RGA2_SYS_CTRL_HOLD_MODE_EN(job->pre_intr_info.read_hold_en))); |
---|
| 2496 | + rga_write(reg, RGA2_SYS_CTRL, scheduler); |
---|
2368 | 2497 | |
---|
2369 | | - reg = rga_read(RGA2_INT_OFFSET, scheduler); |
---|
| 2498 | + reg = rga_read(RGA2_INT, scheduler); |
---|
2370 | 2499 | reg = (reg | s_RGA2_INT_LINE_RD_CLEAR(0x1) | s_RGA2_INT_LINE_WR_CLEAR(0x1)); |
---|
2371 | 2500 | reg = ((reg & (~m_RGA2_INT_LINE_RD_EN)) | |
---|
2372 | 2501 | (s_RGA2_INT_LINE_RD_EN(job->pre_intr_info.read_intr_en))); |
---|
2373 | 2502 | reg = ((reg & (~m_RGA2_INT_LINE_WR_EN)) | |
---|
2374 | 2503 | (s_RGA2_INT_LINE_WR_EN(job->pre_intr_info.write_intr_en))); |
---|
2375 | | - rga_write(reg, RGA2_INT_OFFSET, scheduler); |
---|
| 2504 | + rga_write(reg, RGA2_INT, scheduler); |
---|
2376 | 2505 | } |
---|
2377 | 2506 | |
---|
2378 | 2507 | static void rga2_set_reg_full_csc(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
2379 | 2508 | { |
---|
2380 | | - uint8_t clip_y_max, clip_y_min; |
---|
2381 | | - uint8_t clip_uv_max, clip_uv_min; |
---|
2382 | | - |
---|
2383 | | - clip_y_max = 0xff; |
---|
2384 | | - clip_y_min = 0x0; |
---|
2385 | | - clip_uv_max = 0xff; |
---|
2386 | | - clip_uv_min = 0; |
---|
2387 | | - |
---|
2388 | 2509 | /* full csc coefficient */ |
---|
2389 | 2510 | /* Y coefficient */ |
---|
2390 | | - rga_write(job->full_csc.coe_y.r_v | (clip_y_max << 16) | (clip_y_min << 24), |
---|
2391 | | - RGA2_DST_CSC_00_OFFSET, scheduler); |
---|
2392 | | - rga_write(job->full_csc.coe_y.g_y | (clip_uv_max << 16) | (clip_uv_min << 24), |
---|
2393 | | - RGA2_DST_CSC_01_OFFSET, scheduler); |
---|
2394 | | - rga_write(job->full_csc.coe_y.b_u, RGA2_DST_CSC_02_OFFSET, scheduler); |
---|
2395 | | - rga_write(job->full_csc.coe_y.off, RGA2_DST_CSC_OFF0_OFFSET, scheduler); |
---|
| 2511 | + rga_write(job->full_csc.coe_y.r_v | |
---|
| 2512 | + (job->full_csc_clip.y.max << 16) | (job->full_csc_clip.y.min << 24), |
---|
| 2513 | + RGA2_DST_CSC_00, scheduler); |
---|
| 2514 | + rga_write(job->full_csc.coe_y.g_y | |
---|
| 2515 | + (job->full_csc_clip.uv.max << 16) | (job->full_csc_clip.uv.min << 24), |
---|
| 2516 | + RGA2_DST_CSC_01, scheduler); |
---|
| 2517 | + rga_write(job->full_csc.coe_y.b_u, RGA2_DST_CSC_02, scheduler); |
---|
| 2518 | + rga_write(job->full_csc.coe_y.off, RGA2_DST_CSC_OFF0, scheduler); |
---|
2396 | 2519 | |
---|
2397 | 2520 | /* U coefficient */ |
---|
2398 | | - rga_write(job->full_csc.coe_u.r_v, RGA2_DST_CSC_10_OFFSET, scheduler); |
---|
2399 | | - rga_write(job->full_csc.coe_u.g_y, RGA2_DST_CSC_11_OFFSET, scheduler); |
---|
2400 | | - rga_write(job->full_csc.coe_u.b_u, RGA2_DST_CSC_12_OFFSET, scheduler); |
---|
2401 | | - rga_write(job->full_csc.coe_u.off, RGA2_DST_CSC_OFF1_OFFSET, scheduler); |
---|
| 2521 | + rga_write(job->full_csc.coe_u.r_v, RGA2_DST_CSC_10, scheduler); |
---|
| 2522 | + rga_write(job->full_csc.coe_u.g_y, RGA2_DST_CSC_11, scheduler); |
---|
| 2523 | + rga_write(job->full_csc.coe_u.b_u, RGA2_DST_CSC_12, scheduler); |
---|
| 2524 | + rga_write(job->full_csc.coe_u.off, RGA2_DST_CSC_OFF1, scheduler); |
---|
2402 | 2525 | |
---|
2403 | 2526 | /* V coefficient */ |
---|
2404 | | - rga_write(job->full_csc.coe_v.r_v, RGA2_DST_CSC_20_OFFSET, scheduler); |
---|
2405 | | - rga_write(job->full_csc.coe_v.g_y, RGA2_DST_CSC_21_OFFSET, scheduler); |
---|
2406 | | - rga_write(job->full_csc.coe_v.b_u, RGA2_DST_CSC_22_OFFSET, scheduler); |
---|
2407 | | - rga_write(job->full_csc.coe_v.off, RGA2_DST_CSC_OFF2_OFFSET, scheduler); |
---|
| 2527 | + rga_write(job->full_csc.coe_v.r_v, RGA2_DST_CSC_20, scheduler); |
---|
| 2528 | + rga_write(job->full_csc.coe_v.g_y, RGA2_DST_CSC_21, scheduler); |
---|
| 2529 | + rga_write(job->full_csc.coe_v.b_u, RGA2_DST_CSC_22, scheduler); |
---|
| 2530 | + rga_write(job->full_csc.coe_v.off, RGA2_DST_CSC_OFF2, scheduler); |
---|
2408 | 2531 | } |
---|
2409 | 2532 | |
---|
2410 | | -int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
| 2533 | +static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
2411 | 2534 | { |
---|
2412 | | - ktime_t now = ktime_get(); |
---|
2413 | 2535 | int i; |
---|
| 2536 | + bool master_mode_en; |
---|
| 2537 | + uint32_t sys_ctrl; |
---|
| 2538 | + ktime_t now = ktime_get(); |
---|
| 2539 | + |
---|
| 2540 | + /* |
---|
| 2541 | + * Currently there is no iova allocated for storing cmd for the IOMMU device, |
---|
| 2542 | + * so the iommu device needs to use the slave mode. |
---|
| 2543 | + */ |
---|
| 2544 | + if (scheduler->data->mmu != RGA_IOMMU) |
---|
| 2545 | + master_mode_en = true; |
---|
| 2546 | + else |
---|
| 2547 | + master_mode_en = false; |
---|
2414 | 2548 | |
---|
2415 | 2549 | if (job->pre_intr_info.enable) |
---|
2416 | 2550 | rga2_set_pre_intr_reg(job, scheduler); |
---|
.. | .. |
---|
2419 | 2553 | rga2_set_reg_full_csc(job, scheduler); |
---|
2420 | 2554 | |
---|
2421 | 2555 | if (DEBUGGER_EN(REG)) { |
---|
2422 | | - int32_t *p; |
---|
| 2556 | + uint32_t *p; |
---|
2423 | 2557 | |
---|
2424 | 2558 | rga2_dump_read_back_sys_reg(scheduler); |
---|
2425 | 2559 | rga2_dump_read_back_csc_reg(scheduler); |
---|
.. | .. |
---|
2434 | 2568 | |
---|
2435 | 2569 | /* All CMD finish int */ |
---|
2436 | 2570 | rga_write(rga_read(RGA2_INT, scheduler) | |
---|
2437 | | - (0x1 << 10) | (0x1 << 9) | (0x1 << 8), RGA2_INT, scheduler); |
---|
| 2571 | + m_RGA2_INT_ERROR_ENABLE_MASK | m_RGA2_INT_ALL_CMD_DONE_INT_EN, |
---|
| 2572 | + RGA2_INT, scheduler); |
---|
2438 | 2573 | |
---|
2439 | 2574 | /* sys_reg init */ |
---|
2440 | | - rga_write((0x1 << 2) | (0x1 << 5) | (0x1 << 6) | (0x1 << 11) | (0x1 << 12), |
---|
2441 | | - RGA2_SYS_CTRL, scheduler); |
---|
| 2575 | + sys_ctrl = m_RGA2_SYS_CTRL_AUTO_CKG | m_RGA2_SYS_CTRL_AUTO_RST | |
---|
| 2576 | + m_RGA2_SYS_CTRL_RST_PROTECT_P | m_RGA2_SYS_CTRL_DST_WR_OPT_DIS | |
---|
| 2577 | + m_RGA2_SYS_CTRL_SRC0YUV420SP_RD_OPT_DIS; |
---|
2442 | 2578 | |
---|
2443 | | - if (RGA2_USE_MASTER_MODE) { |
---|
| 2579 | + if (master_mode_en) { |
---|
2444 | 2580 | /* master mode */ |
---|
2445 | | - rga_write(rga_read(RGA2_SYS_CTRL, scheduler) | (0x1 << 1), |
---|
2446 | | - RGA2_SYS_CTRL, scheduler); |
---|
| 2581 | + sys_ctrl |= s_RGA2_SYS_CTRL_CMD_MODE(1); |
---|
2447 | 2582 | |
---|
2448 | 2583 | /* cmd buffer flush cache to ddr */ |
---|
2449 | 2584 | rga_dma_sync_flush_range(&job->cmd_reg[0], &job->cmd_reg[32], scheduler); |
---|
2450 | 2585 | |
---|
2451 | 2586 | /* set cmd_addr */ |
---|
2452 | 2587 | rga_write(virt_to_phys(job->cmd_reg), RGA2_CMD_BASE, scheduler); |
---|
2453 | | - |
---|
2454 | | - rga_write(1, RGA2_CMD_CTRL, scheduler); |
---|
| 2588 | + rga_write(sys_ctrl, RGA2_SYS_CTRL, scheduler); |
---|
| 2589 | + rga_write(m_RGA2_CMD_CTRL_CMD_LINE_ST_P, RGA2_CMD_CTRL, scheduler); |
---|
2455 | 2590 | } else { |
---|
2456 | 2591 | /* slave mode */ |
---|
2457 | | - rga_write(rga_read(RGA2_SYS_CTRL, scheduler) | (0x0 << 1), |
---|
2458 | | - RGA2_SYS_CTRL, scheduler); |
---|
| 2592 | + sys_ctrl |= s_RGA2_SYS_CTRL_CMD_MODE(0) | m_RGA2_SYS_CTRL_CMD_OP_ST_P; |
---|
2459 | 2593 | |
---|
2460 | 2594 | /* set cmd_reg */ |
---|
2461 | 2595 | for (i = 0; i <= 32; i++) |
---|
2462 | 2596 | rga_write(job->cmd_reg[i], 0x100 + i * 4, scheduler); |
---|
2463 | 2597 | |
---|
2464 | | - rga_write(rga_read(RGA2_SYS_CTRL, scheduler) | 0x1, RGA2_SYS_CTRL, scheduler); |
---|
| 2598 | + rga_write(sys_ctrl, RGA2_SYS_CTRL, scheduler); |
---|
2465 | 2599 | } |
---|
2466 | 2600 | |
---|
2467 | | - if (DEBUGGER_EN(TIME)) { |
---|
2468 | | - pr_info("sys_ctrl = %x, int = %x, set cmd use time = %lld\n", |
---|
| 2601 | + if (DEBUGGER_EN(REG)) |
---|
| 2602 | + pr_info("sys_ctrl = %x, int = %x\n", |
---|
2469 | 2603 | rga_read(RGA2_SYS_CTRL, scheduler), |
---|
2470 | | - rga_read(RGA2_INT, scheduler), |
---|
2471 | | - ktime_us_delta(now, job->timestamp)); |
---|
2472 | | - } |
---|
| 2604 | + rga_read(RGA2_INT, scheduler)); |
---|
| 2605 | + |
---|
| 2606 | + if (DEBUGGER_EN(TIME)) |
---|
| 2607 | + pr_info("request[%d], set register cost time %lld us\n", |
---|
| 2608 | + job->request_id, ktime_us_delta(now, job->timestamp)); |
---|
2473 | 2609 | |
---|
2474 | 2610 | job->hw_running_time = now; |
---|
2475 | 2611 | job->hw_recoder_time = now; |
---|
.. | .. |
---|
2480 | 2616 | return 0; |
---|
2481 | 2617 | } |
---|
2482 | 2618 | |
---|
2483 | | -int rga2_get_version(struct rga_scheduler_t *scheduler) |
---|
| 2619 | +static int rga2_get_version(struct rga_scheduler_t *scheduler) |
---|
2484 | 2620 | { |
---|
2485 | 2621 | u32 major_version, minor_version, svn_version; |
---|
2486 | 2622 | u32 reg_version; |
---|
.. | .. |
---|
2511 | 2647 | |
---|
2512 | 2648 | return 0; |
---|
2513 | 2649 | } |
---|
| 2650 | + |
---|
| 2651 | +static int rga2_read_back_reg(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
| 2652 | +{ |
---|
| 2653 | + if (job->rga_command_base.osd_info.enable) { |
---|
| 2654 | + job->rga_command_base.osd_info.cur_flags0 = rga_read(RGA2_OSD_CUR_FLAGS0, |
---|
| 2655 | + scheduler); |
---|
| 2656 | + job->rga_command_base.osd_info.cur_flags1 = rga_read(RGA2_OSD_CUR_FLAGS1, |
---|
| 2657 | + scheduler); |
---|
| 2658 | + } |
---|
| 2659 | + |
---|
| 2660 | + return 0; |
---|
| 2661 | +} |
---|
| 2662 | + |
---|
| 2663 | +static int rga2_irq(struct rga_scheduler_t *scheduler) |
---|
| 2664 | +{ |
---|
| 2665 | + struct rga_job *job = scheduler->running_job; |
---|
| 2666 | + |
---|
| 2667 | + /* The hardware interrupt top-half don't need to lock the scheduler. */ |
---|
| 2668 | + if (job == NULL) |
---|
| 2669 | + return IRQ_HANDLED; |
---|
| 2670 | + |
---|
| 2671 | + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) |
---|
| 2672 | + return IRQ_WAKE_THREAD; |
---|
| 2673 | + |
---|
| 2674 | + job->intr_status = rga_read(RGA2_INT, scheduler); |
---|
| 2675 | + job->hw_status = rga_read(RGA2_STATUS2, scheduler); |
---|
| 2676 | + job->cmd_status = rga_read(RGA2_STATUS1, scheduler); |
---|
| 2677 | + |
---|
| 2678 | + if (DEBUGGER_EN(INT_FLAG)) |
---|
| 2679 | + pr_info("irq handler, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", |
---|
| 2680 | + job->intr_status, job->hw_status, job->cmd_status); |
---|
| 2681 | + |
---|
| 2682 | + if (job->intr_status & |
---|
| 2683 | + (m_RGA2_INT_CUR_CMD_DONE_INT_FLAG | m_RGA2_INT_ALL_CMD_DONE_INT_FLAG)) { |
---|
| 2684 | + set_bit(RGA_JOB_STATE_FINISH, &job->state); |
---|
| 2685 | + } else if (job->intr_status & m_RGA2_INT_ERROR_FLAG_MASK) { |
---|
| 2686 | + set_bit(RGA_JOB_STATE_INTR_ERR, &job->state); |
---|
| 2687 | + |
---|
| 2688 | + pr_err("irq handler err! INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", |
---|
| 2689 | + job->intr_status, job->hw_status, job->cmd_status); |
---|
| 2690 | + scheduler->ops->soft_reset(scheduler); |
---|
| 2691 | + } |
---|
| 2692 | + |
---|
| 2693 | + /*clear INTR */ |
---|
| 2694 | + rga_write(rga_read(RGA2_INT, scheduler) | |
---|
| 2695 | + (m_RGA2_INT_ERROR_CLEAR_MASK | |
---|
| 2696 | + m_RGA2_INT_ALL_CMD_DONE_INT_CLEAR | m_RGA2_INT_NOW_CMD_DONE_INT_CLEAR | |
---|
| 2697 | + m_RGA2_INT_LINE_RD_CLEAR | m_RGA2_INT_LINE_WR_CLEAR), |
---|
| 2698 | + RGA2_INT, scheduler); |
---|
| 2699 | + |
---|
| 2700 | + return IRQ_WAKE_THREAD; |
---|
| 2701 | +} |
---|
| 2702 | + |
---|
| 2703 | +static int rga2_isr_thread(struct rga_job *job, struct rga_scheduler_t *scheduler) |
---|
| 2704 | +{ |
---|
| 2705 | + if (DEBUGGER_EN(INT_FLAG)) |
---|
| 2706 | + pr_info("isr thread, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", |
---|
| 2707 | + rga_read(RGA2_INT, scheduler), |
---|
| 2708 | + rga_read(RGA2_STATUS2, scheduler), |
---|
| 2709 | + rga_read(RGA2_STATUS1, scheduler)); |
---|
| 2710 | + |
---|
| 2711 | + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) { |
---|
| 2712 | + if (job->hw_status & m_RGA2_STATUS2_RPP_ERROR) |
---|
| 2713 | + pr_err("RGA current status: rpp error!\n"); |
---|
| 2714 | + if (job->hw_status & m_RGA2_STATUS2_BUS_ERROR) |
---|
| 2715 | + pr_err("RGA current status: bus error!\n"); |
---|
| 2716 | + |
---|
| 2717 | + if (job->intr_status & m_RGA2_INT_ERROR_INT_FLAG) { |
---|
| 2718 | + pr_err("RGA bus error intr, please check your configuration and buffer.\n"); |
---|
| 2719 | + job->ret = -EFAULT; |
---|
| 2720 | + } else if (job->intr_status & m_RGA2_INT_MMU_INT_FLAG) { |
---|
| 2721 | + pr_err("mmu failed, please check size of the buffer or whether the buffer has been freed.\n"); |
---|
| 2722 | + job->ret = -EACCES; |
---|
| 2723 | + } |
---|
| 2724 | + |
---|
| 2725 | + if (job->ret == 0) { |
---|
| 2726 | + pr_err("rga intr error[0x%x]!\n", job->intr_status); |
---|
| 2727 | + job->ret = -EFAULT; |
---|
| 2728 | + } |
---|
| 2729 | + } |
---|
| 2730 | + |
---|
| 2731 | + return IRQ_HANDLED; |
---|
| 2732 | +} |
---|
| 2733 | + |
---|
| 2734 | +const struct rga_backend_ops rga2_ops = { |
---|
| 2735 | + .get_version = rga2_get_version, |
---|
| 2736 | + .set_reg = rga2_set_reg, |
---|
| 2737 | + .init_reg = rga2_init_reg, |
---|
| 2738 | + .soft_reset = rga2_soft_reset, |
---|
| 2739 | + .read_back_reg = rga2_read_back_reg, |
---|
| 2740 | + .irq = rga2_irq, |
---|
| 2741 | + .isr_thread = rga2_isr_thread, |
---|
| 2742 | +}; |
---|