.. | .. |
---|
264 | 264 | u32 i; |
---|
265 | 265 | u32 reg_en; |
---|
266 | 266 | struct vepu_task *task = to_vepu_task(mpp_task); |
---|
| 267 | + u32 timing_en = mpp->srv->timing_en; |
---|
267 | 268 | |
---|
268 | 269 | mpp_debug_enter(); |
---|
269 | 270 | |
---|
.. | .. |
---|
282 | 283 | |
---|
283 | 284 | mpp_write_req(mpp, task->reg, s, e, reg_en); |
---|
284 | 285 | } |
---|
| 286 | + |
---|
| 287 | + /* flush tlb before starting hardware */ |
---|
| 288 | + mpp_iommu_flush_tlb(mpp->iommu_info); |
---|
| 289 | + |
---|
285 | 290 | /* init current task */ |
---|
286 | 291 | mpp->cur_task = mpp_task; |
---|
| 292 | + |
---|
| 293 | + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); |
---|
| 294 | + |
---|
287 | 295 | /* Last, flush start registers */ |
---|
288 | 296 | wmb(); |
---|
289 | 297 | mpp_write(mpp, VEPU1_REG_ENC_EN, |
---|
290 | 298 | task->reg[reg_en] | VEPU1_ENC_START); |
---|
| 299 | + |
---|
| 300 | + mpp_task_run_end(mpp_task, timing_en); |
---|
291 | 301 | |
---|
292 | 302 | mpp_debug_leave(); |
---|
293 | 303 | |
---|
.. | .. |
---|
499 | 509 | } |
---|
500 | 510 | seq_puts(seq, "\n"); |
---|
501 | 511 | /* item data*/ |
---|
502 | | - seq_printf(seq, "|%8p|", session); |
---|
| 512 | + seq_printf(seq, "|%8d|", session->index); |
---|
503 | 513 | seq_printf(seq, "%8s|", mpp_device_name[session->device_type]); |
---|
504 | 514 | for (i = ENC_INFO_BASE; i < ENC_INFO_BUTT; i++) { |
---|
505 | 515 | u32 flag = priv->codec_info[i].flag; |
---|
.. | .. |
---|
532 | 542 | mutex_lock(&mpp->srv->session_lock); |
---|
533 | 543 | list_for_each_entry_safe(session, n, |
---|
534 | 544 | &mpp->srv->session_list, |
---|
535 | | - session_link) { |
---|
| 545 | + service_link) { |
---|
536 | 546 | if (session->device_type != MPP_DEVICE_VEPU1) |
---|
537 | 547 | continue; |
---|
538 | 548 | if (!session->priv) |
---|
.. | .. |
---|
555 | 565 | enc->procfs = NULL; |
---|
556 | 566 | return -EIO; |
---|
557 | 567 | } |
---|
| 568 | + |
---|
| 569 | + /* for common mpp_dev options */ |
---|
| 570 | + mpp_procfs_create_common(enc->procfs, mpp); |
---|
| 571 | + |
---|
558 | 572 | mpp_procfs_create_u32("aclk", 0644, |
---|
559 | 573 | enc->procfs, &enc->aclk_info.debug_rate_hz); |
---|
560 | 574 | mpp_procfs_create_u32("session_buffers", 0644, |
---|
.. | .. |
---|
656 | 670 | |
---|
657 | 671 | if (enc->rst_a && enc->rst_h) { |
---|
658 | 672 | /* Don't skip this or iommu won't work after reset */ |
---|
659 | | - rockchip_pmu_idle_request(mpp->dev, true); |
---|
| 673 | + mpp_pmu_idle_request(mpp, true); |
---|
660 | 674 | mpp_safe_reset(enc->rst_a); |
---|
661 | 675 | mpp_safe_reset(enc->rst_h); |
---|
662 | 676 | udelay(5); |
---|
663 | 677 | mpp_safe_unreset(enc->rst_a); |
---|
664 | 678 | mpp_safe_unreset(enc->rst_h); |
---|
665 | | - rockchip_pmu_idle_request(mpp->dev, false); |
---|
| 679 | + mpp_pmu_idle_request(mpp, false); |
---|
666 | 680 | } |
---|
667 | 681 | mpp_write(mpp, VEPU1_REG_ENC_EN, 0); |
---|
668 | 682 | |
---|
.. | .. |
---|
722 | 736 | return -ENOMEM; |
---|
723 | 737 | |
---|
724 | 738 | mpp = &enc->mpp; |
---|
725 | | - platform_set_drvdata(pdev, enc); |
---|
| 739 | + platform_set_drvdata(pdev, mpp); |
---|
726 | 740 | |
---|
727 | 741 | if (pdev->dev.of_node) { |
---|
728 | 742 | match = of_match_node(mpp_vepu1_dt_match, pdev->dev.of_node); |
---|
729 | 743 | if (match) |
---|
730 | 744 | mpp->var = (struct mpp_dev_var *)match->data; |
---|
| 745 | + |
---|
| 746 | + mpp->core_id = of_alias_get_id(pdev->dev.of_node, "vepu"); |
---|
731 | 747 | } |
---|
732 | 748 | |
---|
733 | 749 | ret = mpp_dev_probe(mpp, pdev); |
---|
.. | .. |
---|
758 | 774 | static int vepu_remove(struct platform_device *pdev) |
---|
759 | 775 | { |
---|
760 | 776 | struct device *dev = &pdev->dev; |
---|
761 | | - struct vepu_dev *enc = platform_get_drvdata(pdev); |
---|
| 777 | + struct mpp_dev *mpp = dev_get_drvdata(dev); |
---|
762 | 778 | |
---|
763 | 779 | dev_info(dev, "remove device\n"); |
---|
764 | | - mpp_dev_remove(&enc->mpp); |
---|
765 | | - vepu_procfs_remove(&enc->mpp); |
---|
| 780 | + mpp_dev_remove(mpp); |
---|
| 781 | + vepu_procfs_remove(mpp); |
---|
766 | 782 | |
---|
767 | 783 | return 0; |
---|
768 | | -} |
---|
769 | | - |
---|
770 | | -static void vepu_shutdown(struct platform_device *pdev) |
---|
771 | | -{ |
---|
772 | | - int ret; |
---|
773 | | - int val; |
---|
774 | | - struct device *dev = &pdev->dev; |
---|
775 | | - struct vepu_dev *enc = platform_get_drvdata(pdev); |
---|
776 | | - struct mpp_dev *mpp = &enc->mpp; |
---|
777 | | - |
---|
778 | | - dev_info(dev, "shutdown device\n"); |
---|
779 | | - |
---|
780 | | - atomic_inc(&mpp->srv->shutdown_request); |
---|
781 | | - ret = readx_poll_timeout(atomic_read, |
---|
782 | | - &mpp->task_count, |
---|
783 | | - val, val == 0, 20000, 200000); |
---|
784 | | - if (ret == -ETIMEDOUT) |
---|
785 | | - dev_err(dev, "wait total running time out\n"); |
---|
786 | 784 | } |
---|
787 | 785 | |
---|
788 | 786 | struct platform_driver rockchip_vepu1_driver = { |
---|
789 | 787 | .probe = vepu_probe, |
---|
790 | 788 | .remove = vepu_remove, |
---|
791 | | - .shutdown = vepu_shutdown, |
---|
| 789 | + .shutdown = mpp_dev_shutdown, |
---|
792 | 790 | .driver = { |
---|
793 | 791 | .name = VEPU1_DRIVER_NAME, |
---|
794 | 792 | .of_match_table = of_match_ptr(mpp_vepu1_dt_match), |
---|