.. | .. |
---|
28 | 28 | #include <linux/nospec.h> |
---|
29 | 29 | #include <linux/workqueue.h> |
---|
30 | 30 | #include <soc/rockchip/pm_domains.h> |
---|
| 31 | +#include <soc/rockchip/rockchip_iommu.h> |
---|
31 | 32 | #include <soc/rockchip/rockchip_ipa.h> |
---|
32 | 33 | #include <soc/rockchip/rockchip_opp_select.h> |
---|
33 | 34 | #include <soc/rockchip/rockchip_system_monitor.h> |
---|
.. | .. |
---|
439 | 440 | int i; |
---|
440 | 441 | struct mpp_request *req; |
---|
441 | 442 | u32 reg_en = mpp_task->hw_info->reg_en; |
---|
| 443 | + u32 timing_en = mpp->srv->timing_en; |
---|
442 | 444 | |
---|
443 | 445 | /* |
---|
444 | 446 | * Tips: ensure osd plt clock is 0 before setting register, |
---|
.. | .. |
---|
466 | 468 | rkvenc_write_req_backward(mpp, task->reg, s, e, reg_en); |
---|
467 | 469 | } |
---|
468 | 470 | } |
---|
| 471 | + |
---|
| 472 | + /* flush tlb before starting hardware */ |
---|
| 473 | + mpp_iommu_flush_tlb(mpp->iommu_info); |
---|
| 474 | + |
---|
469 | 475 | /* init current task */ |
---|
470 | 476 | mpp->cur_task = mpp_task; |
---|
| 477 | + |
---|
| 478 | + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); |
---|
| 479 | + |
---|
471 | 480 | /* Flush the register before the start the device */ |
---|
472 | 481 | wmb(); |
---|
473 | 482 | mpp_write(mpp, RKVENC_ENC_START_BASE, task->reg[reg_en]); |
---|
| 483 | + |
---|
| 484 | + mpp_task_run_end(mpp_task, timing_en); |
---|
474 | 485 | } break; |
---|
475 | 486 | case RKVENC_MODE_LINKTABLE_FIX: |
---|
476 | 487 | case RKVENC_MODE_LINKTABLE_UPDATE: |
---|
.. | .. |
---|
494 | 505 | |
---|
495 | 506 | mpp_write(mpp, RKVENC_INT_MSK_BASE, 0x100); |
---|
496 | 507 | mpp_write(mpp, RKVENC_INT_CLR_BASE, 0xffffffff); |
---|
497 | | - udelay(5); |
---|
498 | 508 | mpp_write(mpp, RKVENC_INT_STATUS_BASE, 0); |
---|
499 | 509 | |
---|
500 | 510 | mpp_debug_leave(); |
---|
.. | .. |
---|
524 | 534 | |
---|
525 | 535 | if (task->irq_status & RKVENC_INT_ERROR_BITS) { |
---|
526 | 536 | atomic_inc(&mpp->reset_request); |
---|
527 | | - /* dump register */ |
---|
528 | 537 | if (mpp_debug_unlikely(DEBUG_DUMP_ERR_REG)) { |
---|
529 | | - mpp_debug(DEBUG_DUMP_ERR_REG, "irq_status: %08x\n", |
---|
530 | | - task->irq_status); |
---|
531 | | - mpp_task_dump_hw_reg(mpp, mpp_task); |
---|
| 538 | + /* dump error register */ |
---|
| 539 | + mpp_debug(DEBUG_DUMP_ERR_REG, "irq_status: %08x\n", task->irq_status); |
---|
| 540 | + mpp_task_dump_hw_reg(mpp); |
---|
532 | 541 | } |
---|
533 | 542 | } |
---|
534 | 543 | |
---|
.. | .. |
---|
746 | 755 | } |
---|
747 | 756 | seq_puts(seq, "\n"); |
---|
748 | 757 | /* item data*/ |
---|
749 | | - seq_printf(seq, "|%8p|", session); |
---|
| 758 | + seq_printf(seq, "|%8d|", session->index); |
---|
750 | 759 | seq_printf(seq, "%8s|", mpp_device_name[session->device_type]); |
---|
751 | 760 | for (i = ENC_INFO_BASE; i < ENC_INFO_BUTT; i++) { |
---|
752 | 761 | u32 flag = priv->codec_info[i].flag; |
---|
.. | .. |
---|
779 | 788 | mutex_lock(&mpp->srv->session_lock); |
---|
780 | 789 | list_for_each_entry_safe(session, n, |
---|
781 | 790 | &mpp->srv->session_list, |
---|
782 | | - session_link) { |
---|
| 791 | + service_link) { |
---|
783 | 792 | if (session->device_type != MPP_DEVICE_RKVENC) |
---|
784 | 793 | continue; |
---|
785 | 794 | if (!session->priv) |
---|
.. | .. |
---|
802 | 811 | enc->procfs = NULL; |
---|
803 | 812 | return -EIO; |
---|
804 | 813 | } |
---|
| 814 | + |
---|
| 815 | + /* for common mpp_dev options */ |
---|
| 816 | + mpp_procfs_create_common(enc->procfs, mpp); |
---|
| 817 | + |
---|
805 | 818 | /* for debug */ |
---|
806 | 819 | mpp_procfs_create_u32("aclk", 0644, |
---|
807 | 820 | enc->procfs, &enc->aclk_info.debug_rate_hz); |
---|
.. | .. |
---|
956 | 969 | }; |
---|
957 | 970 | |
---|
958 | 971 | static struct monitor_dev_profile enc_mdevp = { |
---|
959 | | - .type = MONITOR_TPYE_DEV, |
---|
| 972 | + .type = MONITOR_TYPE_DEV, |
---|
960 | 973 | .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, |
---|
961 | 974 | .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, |
---|
962 | 975 | }; |
---|
.. | .. |
---|
985 | 998 | return ret; |
---|
986 | 999 | } |
---|
987 | 1000 | |
---|
| 1001 | +static const struct rockchip_opp_data __maybe_unused rv1126_rkvenc_opp_data = { |
---|
| 1002 | + .get_soc_info = rv1126_get_soc_info, |
---|
| 1003 | +}; |
---|
| 1004 | + |
---|
988 | 1005 | static const struct of_device_id rockchip_rkvenc_of_match[] = { |
---|
989 | 1006 | #ifdef CONFIG_CPU_RV1126 |
---|
990 | 1007 | { |
---|
991 | 1008 | .compatible = "rockchip,rv1109", |
---|
992 | | - .data = (void *)&rv1126_get_soc_info, |
---|
| 1009 | + .data = (void *)&rv1126_rkvenc_opp_data, |
---|
993 | 1010 | }, |
---|
994 | 1011 | { |
---|
995 | 1012 | .compatible = "rockchip,rv1126", |
---|
996 | | - .data = (void *)&rv1126_get_soc_info, |
---|
| 1013 | + .data = (void *)&rv1126_rkvenc_opp_data, |
---|
997 | 1014 | }, |
---|
998 | 1015 | #endif |
---|
999 | 1016 | {}, |
---|
.. | .. |
---|
1004 | 1021 | struct rkvenc_dev *enc = to_rkvenc_dev(mpp); |
---|
1005 | 1022 | struct clk *clk_core = enc->core_clk_info.clk; |
---|
1006 | 1023 | struct devfreq_cooling_power *venc_dcp = &venc_cooling_power_data; |
---|
| 1024 | + struct rockchip_opp_info opp_info = {0}; |
---|
1007 | 1025 | int ret = 0; |
---|
1008 | 1026 | |
---|
1009 | 1027 | if (!clk_core) |
---|
.. | .. |
---|
1021 | 1039 | return 0; |
---|
1022 | 1040 | } |
---|
1023 | 1041 | |
---|
1024 | | - ret = rockchip_init_opp_table(mpp->dev, rockchip_rkvenc_of_match, |
---|
1025 | | - "leakage", "venc"); |
---|
| 1042 | + rockchip_get_opp_data(rockchip_rkvenc_of_match, &opp_info); |
---|
| 1043 | + ret = rockchip_init_opp_table(mpp->dev, &opp_info, "leakage", "venc"); |
---|
1026 | 1044 | if (ret) { |
---|
1027 | 1045 | dev_err(mpp->dev, "failed to init_opp_table\n"); |
---|
1028 | 1046 | return ret; |
---|
.. | .. |
---|
1132 | 1150 | else |
---|
1133 | 1151 | enc->aux_iova = page_iova; |
---|
1134 | 1152 | |
---|
1135 | | - rk_iommu_unmask_irq(mpp->dev); |
---|
| 1153 | + rockchip_iommu_unmask_irq(mpp->dev); |
---|
1136 | 1154 | mpp_iommu_up_write(mpp->iommu_info); |
---|
1137 | 1155 | |
---|
1138 | 1156 | mpp_debug_leave(); |
---|
.. | .. |
---|
1149 | 1167 | mpp_debug(DEBUG_IOMMU, "IOMMU_GET_BUS_ID(status)=%d\n", IOMMU_GET_BUS_ID(status)); |
---|
1150 | 1168 | if (IOMMU_GET_BUS_ID(status)) { |
---|
1151 | 1169 | enc->fault_iova = iova; |
---|
1152 | | - rk_iommu_mask_irq(mpp->dev); |
---|
| 1170 | + rockchip_iommu_mask_irq(mpp->dev); |
---|
1153 | 1171 | queue_work(enc->iommu_wq, &enc->iommu_work); |
---|
1154 | 1172 | } |
---|
1155 | 1173 | mpp_debug_leave(); |
---|
.. | .. |
---|
1214 | 1232 | } |
---|
1215 | 1233 | INIT_WORK(&enc->iommu_work, rkvenc_iommu_handle_work); |
---|
1216 | 1234 | |
---|
1217 | | - mpp->iommu_info->hdl = rkvenc_iommu_fault_handle; |
---|
| 1235 | + mpp->fault_handler = rkvenc_iommu_fault_handle; |
---|
1218 | 1236 | |
---|
1219 | 1237 | return ret; |
---|
1220 | 1238 | } |
---|
.. | .. |
---|
1264 | 1282 | mpp_write(mpp, RKVENC_INT_STATUS_BASE, 0); |
---|
1265 | 1283 | /* cru reset */ |
---|
1266 | 1284 | if (enc->rst_a && enc->rst_h && enc->rst_core) { |
---|
1267 | | - rockchip_pmu_idle_request(mpp->dev, true); |
---|
| 1285 | + mpp_pmu_idle_request(mpp, true); |
---|
1268 | 1286 | mpp_safe_reset(enc->rst_a); |
---|
1269 | 1287 | mpp_safe_reset(enc->rst_h); |
---|
1270 | 1288 | mpp_safe_reset(enc->rst_core); |
---|
.. | .. |
---|
1272 | 1290 | mpp_safe_unreset(enc->rst_a); |
---|
1273 | 1291 | mpp_safe_unreset(enc->rst_h); |
---|
1274 | 1292 | mpp_safe_unreset(enc->rst_core); |
---|
1275 | | - rockchip_pmu_idle_request(mpp->dev, false); |
---|
| 1293 | + mpp_pmu_idle_request(mpp, false); |
---|
1276 | 1294 | } |
---|
1277 | 1295 | #ifdef CONFIG_PM_DEVFREQ |
---|
1278 | 1296 | if (enc->devfreq) |
---|
.. | .. |
---|
1429 | 1447 | if (!enc) |
---|
1430 | 1448 | return -ENOMEM; |
---|
1431 | 1449 | mpp = &enc->mpp; |
---|
1432 | | - platform_set_drvdata(pdev, enc); |
---|
| 1450 | + platform_set_drvdata(pdev, mpp); |
---|
1433 | 1451 | |
---|
1434 | 1452 | if (pdev->dev.of_node) { |
---|
1435 | 1453 | match = of_match_node(mpp_rkvenc_dt_match, pdev->dev.of_node); |
---|
.. | .. |
---|
1468 | 1486 | static int rkvenc_remove(struct platform_device *pdev) |
---|
1469 | 1487 | { |
---|
1470 | 1488 | struct device *dev = &pdev->dev; |
---|
1471 | | - struct rkvenc_dev *enc = platform_get_drvdata(pdev); |
---|
| 1489 | + struct mpp_dev *mpp = dev_get_drvdata(dev); |
---|
1472 | 1490 | |
---|
1473 | 1491 | dev_info(dev, "remove device\n"); |
---|
1474 | | - mpp_dev_remove(&enc->mpp); |
---|
1475 | | - rkvenc_procfs_remove(&enc->mpp); |
---|
| 1492 | + mpp_dev_remove(mpp); |
---|
| 1493 | + rkvenc_procfs_remove(mpp); |
---|
1476 | 1494 | |
---|
1477 | 1495 | return 0; |
---|
1478 | | -} |
---|
1479 | | - |
---|
1480 | | -static void rkvenc_shutdown(struct platform_device *pdev) |
---|
1481 | | -{ |
---|
1482 | | - int ret; |
---|
1483 | | - int val; |
---|
1484 | | - struct device *dev = &pdev->dev; |
---|
1485 | | - struct rkvenc_dev *enc = platform_get_drvdata(pdev); |
---|
1486 | | - struct mpp_dev *mpp = &enc->mpp; |
---|
1487 | | - |
---|
1488 | | - dev_info(dev, "shutdown device\n"); |
---|
1489 | | - |
---|
1490 | | - atomic_inc(&mpp->srv->shutdown_request); |
---|
1491 | | - ret = readx_poll_timeout(atomic_read, |
---|
1492 | | - &mpp->task_count, |
---|
1493 | | - val, val == 0, 1000, 200000); |
---|
1494 | | - if (ret == -ETIMEDOUT) |
---|
1495 | | - dev_err(dev, "wait total running time out\n"); |
---|
1496 | | - |
---|
1497 | | - dev_info(dev, "shutdown success\n"); |
---|
1498 | 1496 | } |
---|
1499 | 1497 | |
---|
1500 | 1498 | struct platform_driver rockchip_rkvenc_driver = { |
---|
1501 | 1499 | .probe = rkvenc_probe, |
---|
1502 | 1500 | .remove = rkvenc_remove, |
---|
1503 | | - .shutdown = rkvenc_shutdown, |
---|
| 1501 | + .shutdown = mpp_dev_shutdown, |
---|
1504 | 1502 | .driver = { |
---|
1505 | 1503 | .name = RKVENC_DRIVER_NAME, |
---|
1506 | 1504 | .of_match_table = of_match_ptr(mpp_rkvenc_dt_match), |
---|