| .. | .. |
|---|
| 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 | +}; |
|---|