.. | .. |
---|
27 | 27 | #define VDPP_DRIVER_NAME "mpp_vdpp" |
---|
28 | 28 | |
---|
29 | 29 | #define VDPP_SESSION_MAX_BUFFERS 15 |
---|
| 30 | +#define VDPP_REG_WORK_MODE 0x0008 |
---|
| 31 | +#define VDPP_REG_VDPP_MODE BIT(1) |
---|
30 | 32 | |
---|
31 | 33 | #define to_vdpp_info(info) \ |
---|
32 | 34 | container_of(info, struct vdpp_hw_info, hw) |
---|
.. | .. |
---|
307 | 309 | struct vdpp_dev *vdpp = to_vdpp_dev(mpp); |
---|
308 | 310 | struct vdpp_task *task = to_vdpp_task(mpp_task); |
---|
309 | 311 | struct vdpp_hw_info *hw_info = vdpp->hw_info; |
---|
| 312 | + u32 timing_en = mpp->srv->timing_en; |
---|
310 | 313 | |
---|
311 | 314 | mpp_debug_enter(); |
---|
312 | 315 | |
---|
.. | .. |
---|
332 | 335 | } |
---|
333 | 336 | } |
---|
334 | 337 | |
---|
| 338 | + /* flush tlb before starting hardware */ |
---|
| 339 | + mpp_iommu_flush_tlb(mpp->iommu_info); |
---|
| 340 | + |
---|
335 | 341 | /* init current task */ |
---|
336 | 342 | mpp->cur_task = mpp_task; |
---|
| 343 | + |
---|
| 344 | + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); |
---|
337 | 345 | /* Flush the register before the start the device */ |
---|
338 | 346 | wmb(); |
---|
339 | 347 | mpp_write(mpp, hw_info->start_base, task->reg[reg_en]); |
---|
| 348 | + |
---|
| 349 | + mpp_task_run_end(mpp_task, timing_en); |
---|
340 | 350 | |
---|
341 | 351 | mpp_debug_leave(); |
---|
342 | 352 | |
---|
.. | .. |
---|
546 | 556 | { |
---|
547 | 557 | struct vdpp_dev *vdpp = to_vdpp_dev(mpp); |
---|
548 | 558 | struct vdpp_hw_info *hw_info = vdpp->hw_info; |
---|
| 559 | + u32 work_mode = mpp_read(mpp, VDPP_REG_WORK_MODE); |
---|
549 | 560 | |
---|
| 561 | + if (!(work_mode & VDPP_REG_VDPP_MODE)) |
---|
| 562 | + return IRQ_NONE; |
---|
550 | 563 | mpp->irq_status = mpp_read(mpp, hw_info->int_sta_base); |
---|
551 | 564 | if (!(mpp->irq_status & hw_info->int_mask)) |
---|
552 | 565 | return IRQ_NONE; |
---|
553 | 566 | mpp_write(mpp, hw_info->int_en_base, 0); |
---|
554 | 567 | mpp_write(mpp, hw_info->int_clr_base, mpp->irq_status); |
---|
| 568 | + |
---|
| 569 | + /* ensure hardware is being off status */ |
---|
| 570 | + mpp_write(mpp, hw_info->start_base, 0); |
---|
555 | 571 | |
---|
556 | 572 | return IRQ_WAKE_THREAD; |
---|
557 | 573 | } |
---|
.. | .. |
---|
590 | 606 | mpp_debug(DEBUG_RESET, "reset in\n"); |
---|
591 | 607 | |
---|
592 | 608 | /* Don't skip this or iommu won't work after reset */ |
---|
593 | | - rockchip_pmu_idle_request(mpp->dev, true); |
---|
| 609 | + mpp_pmu_idle_request(mpp, true); |
---|
594 | 610 | mpp_safe_reset(vdpp->rst_a); |
---|
595 | 611 | mpp_safe_reset(vdpp->rst_h); |
---|
596 | 612 | mpp_safe_reset(vdpp->rst_s); |
---|
.. | .. |
---|
598 | 614 | mpp_safe_unreset(vdpp->rst_a); |
---|
599 | 615 | mpp_safe_unreset(vdpp->rst_h); |
---|
600 | 616 | mpp_safe_unreset(vdpp->rst_s); |
---|
601 | | - rockchip_pmu_idle_request(mpp->dev, false); |
---|
| 617 | + mpp_pmu_idle_request(mpp, false); |
---|
602 | 618 | |
---|
603 | 619 | mpp_debug(DEBUG_RESET, "reset out\n"); |
---|
604 | 620 | } |
---|
.. | .. |
---|
617 | 633 | mpp_write(mpp, hw_info->cfg_base, hw_info->bit_rst_en); |
---|
618 | 634 | ret = readl_relaxed_poll_timeout(mpp->reg_base + hw_info->rst_sta_base, |
---|
619 | 635 | rst_status, |
---|
620 | | - !(rst_status & hw_info->bit_rst_done), |
---|
621 | | - 0, 2); |
---|
| 636 | + rst_status & hw_info->bit_rst_done, |
---|
| 637 | + 0, 5); |
---|
622 | 638 | if (ret) { |
---|
623 | 639 | mpp_err("soft reset timeout, use cru reset\n"); |
---|
624 | 640 | return _vdpp_reset(mpp, vdpp); |
---|
625 | 641 | } |
---|
626 | 642 | |
---|
627 | 643 | mpp_write(mpp, hw_info->rst_sta_base, 0); |
---|
| 644 | + |
---|
| 645 | + /* ensure hardware is being off status */ |
---|
| 646 | + mpp_write(mpp, hw_info->start_base, 0); |
---|
628 | 647 | |
---|
629 | 648 | return 0; |
---|
630 | 649 | } |
---|
.. | .. |
---|
684 | 703 | match = of_match_node(mpp_vdpp_dt_match, pdev->dev.of_node); |
---|
685 | 704 | if (match) |
---|
686 | 705 | mpp->var = (struct mpp_dev_var *)match->data; |
---|
| 706 | + mpp->core_id = -1; |
---|
687 | 707 | } |
---|
688 | 708 | |
---|
689 | 709 | ret = mpp_dev_probe(mpp, pdev); |
---|
.. | .. |
---|
710 | 730 | dev_err(dev, "register interrupter runtime failed\n"); |
---|
711 | 731 | return -EINVAL; |
---|
712 | 732 | } |
---|
| 733 | + |
---|
713 | 734 | mpp->session_max_buffers = VDPP_SESSION_MAX_BUFFERS; |
---|
714 | 735 | vdpp->hw_info = to_vdpp_info(mpp->var->hw_info); |
---|
715 | 736 | vdpp_procfs_init(mpp); |
---|