hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/video/rockchip/mpp/mpp_vdpp.c
....@@ -27,6 +27,8 @@
2727 #define VDPP_DRIVER_NAME "mpp_vdpp"
2828
2929 #define VDPP_SESSION_MAX_BUFFERS 15
30
+#define VDPP_REG_WORK_MODE 0x0008
31
+#define VDPP_REG_VDPP_MODE BIT(1)
3032
3133 #define to_vdpp_info(info) \
3234 container_of(info, struct vdpp_hw_info, hw)
....@@ -307,6 +309,7 @@
307309 struct vdpp_dev *vdpp = to_vdpp_dev(mpp);
308310 struct vdpp_task *task = to_vdpp_task(mpp_task);
309311 struct vdpp_hw_info *hw_info = vdpp->hw_info;
312
+ u32 timing_en = mpp->srv->timing_en;
310313
311314 mpp_debug_enter();
312315
....@@ -332,11 +335,18 @@
332335 }
333336 }
334337
338
+ /* flush tlb before starting hardware */
339
+ mpp_iommu_flush_tlb(mpp->iommu_info);
340
+
335341 /* init current task */
336342 mpp->cur_task = mpp_task;
343
+
344
+ mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY);
337345 /* Flush the register before the start the device */
338346 wmb();
339347 mpp_write(mpp, hw_info->start_base, task->reg[reg_en]);
348
+
349
+ mpp_task_run_end(mpp_task, timing_en);
340350
341351 mpp_debug_leave();
342352
....@@ -546,12 +556,18 @@
546556 {
547557 struct vdpp_dev *vdpp = to_vdpp_dev(mpp);
548558 struct vdpp_hw_info *hw_info = vdpp->hw_info;
559
+ u32 work_mode = mpp_read(mpp, VDPP_REG_WORK_MODE);
549560
561
+ if (!(work_mode & VDPP_REG_VDPP_MODE))
562
+ return IRQ_NONE;
550563 mpp->irq_status = mpp_read(mpp, hw_info->int_sta_base);
551564 if (!(mpp->irq_status & hw_info->int_mask))
552565 return IRQ_NONE;
553566 mpp_write(mpp, hw_info->int_en_base, 0);
554567 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);
555571
556572 return IRQ_WAKE_THREAD;
557573 }
....@@ -590,7 +606,7 @@
590606 mpp_debug(DEBUG_RESET, "reset in\n");
591607
592608 /* 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);
594610 mpp_safe_reset(vdpp->rst_a);
595611 mpp_safe_reset(vdpp->rst_h);
596612 mpp_safe_reset(vdpp->rst_s);
....@@ -598,7 +614,7 @@
598614 mpp_safe_unreset(vdpp->rst_a);
599615 mpp_safe_unreset(vdpp->rst_h);
600616 mpp_safe_unreset(vdpp->rst_s);
601
- rockchip_pmu_idle_request(mpp->dev, false);
617
+ mpp_pmu_idle_request(mpp, false);
602618
603619 mpp_debug(DEBUG_RESET, "reset out\n");
604620 }
....@@ -617,14 +633,17 @@
617633 mpp_write(mpp, hw_info->cfg_base, hw_info->bit_rst_en);
618634 ret = readl_relaxed_poll_timeout(mpp->reg_base + hw_info->rst_sta_base,
619635 rst_status,
620
- !(rst_status & hw_info->bit_rst_done),
621
- 0, 2);
636
+ rst_status & hw_info->bit_rst_done,
637
+ 0, 5);
622638 if (ret) {
623639 mpp_err("soft reset timeout, use cru reset\n");
624640 return _vdpp_reset(mpp, vdpp);
625641 }
626642
627643 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);
628647
629648 return 0;
630649 }
....@@ -684,6 +703,7 @@
684703 match = of_match_node(mpp_vdpp_dt_match, pdev->dev.of_node);
685704 if (match)
686705 mpp->var = (struct mpp_dev_var *)match->data;
706
+ mpp->core_id = -1;
687707 }
688708
689709 ret = mpp_dev_probe(mpp, pdev);
....@@ -710,6 +730,7 @@
710730 dev_err(dev, "register interrupter runtime failed\n");
711731 return -EINVAL;
712732 }
733
+
713734 mpp->session_max_buffers = VDPP_SESSION_MAX_BUFFERS;
714735 vdpp->hw_info = to_vdpp_info(mpp->var->hw_info);
715736 vdpp_procfs_init(mpp);