| .. | .. |
|---|
| 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), |
|---|