Lines Matching refs:mpp

196 int mpp_set_rcbbuf(struct mpp_dev *mpp, struct mpp_session *session,  in mpp_set_rcbbuf()  argument
199 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in mpp_set_rcbbuf()
234 int rkvdec2_task_init(struct mpp_dev *mpp, struct mpp_session *session, in rkvdec2_task_init() argument
243 mpp_task->hw_info = mpp->var->hw_info; in rkvdec2_task_init()
284 mpp_task_dump_mem_region(mpp, mpp_task); in rkvdec2_task_init()
285 mpp_task_dump_reg(mpp, mpp_task); in rkvdec2_task_init()
300 ret = rkvdec2_task_init(session->mpp, session, task, msgs); in rkvdec2_alloc_task()
305 mpp_set_rcbbuf(session->mpp, session, &task->mpp_task); in rkvdec2_alloc_task()
329 static int rkvdec2_run(struct mpp_dev *mpp, struct mpp_task *mpp_task) in rkvdec2_run() argument
332 u32 timing_en = mpp->srv->timing_en; in rkvdec2_run()
344 mpp_write_relaxed(mpp, RKVDEC_REG_CACHE0_SIZE_BASE, reg); in rkvdec2_run()
345 mpp_write_relaxed(mpp, RKVDEC_REG_CACHE1_SIZE_BASE, reg); in rkvdec2_run()
346 mpp_write_relaxed(mpp, RKVDEC_REG_CACHE2_SIZE_BASE, reg); in rkvdec2_run()
348 mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE0_BASE, 1); in rkvdec2_run()
349 mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE1_BASE, 1); in rkvdec2_run()
350 mpp_write_relaxed(mpp, RKVDEC_REG_CLR_CACHE2_BASE, 1); in rkvdec2_run()
359 mpp_write_req(mpp, task->reg, s, e, reg_en); in rkvdec2_run()
363 mpp_iommu_flush_tlb(mpp->iommu_info); in rkvdec2_run()
366 mpp->cur_task = mpp_task; in rkvdec2_run()
372 mpp_write(mpp, RKVDEC_REG_START_EN_BASE, task->reg[reg_en] | RKVDEC_START_EN); in rkvdec2_run()
381 static int rkvdec2_rk3568_run(struct mpp_dev *mpp, struct mpp_task *mpp_task) in rkvdec2_rk3568_run() argument
393 rkvdec2_3568_hack_fix(mpp); in rkvdec2_rk3568_run()
395 ret = rkvdec2_run(mpp, mpp_task); in rkvdec2_rk3568_run()
402 static int rkvdec2_irq(struct mpp_dev *mpp) in rkvdec2_irq() argument
404 mpp->irq_status = mpp_read(mpp, RKVDEC_REG_INT_EN); in rkvdec2_irq()
405 if (!(mpp->irq_status & RKVDEC_IRQ_RAW)) in rkvdec2_irq()
408 mpp_write(mpp, RKVDEC_REG_INT_EN, 0); in rkvdec2_irq()
413 static int rkvdec2_isr(struct mpp_dev *mpp) in rkvdec2_isr() argument
417 struct mpp_task *mpp_task = mpp->cur_task; in rkvdec2_isr()
418 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_isr()
422 dev_err(mpp->dev, "no current task\n"); in rkvdec2_isr()
425 mpp_task->hw_cycles = mpp_read(mpp, RKVDEC_PERF_WORKING_CNT); in rkvdec2_isr()
427 mpp->cur_task = NULL; in rkvdec2_isr()
429 task->irq_status = mpp->irq_status; in rkvdec2_isr()
435 atomic_inc(&mpp->reset_request); in rkvdec2_isr()
438 mpp_task_dump_hw_reg(mpp); in rkvdec2_isr()
448 static int rkvdec2_read_perf_sel(struct mpp_dev *mpp, u32 *regs, u32 s, u32 e) in rkvdec2_read_perf_sel() argument
459 writel_relaxed(val, mpp->reg_base + RKVDEC_PERF_SEL_BASE); in rkvdec2_read_perf_sel()
461 regs[sel0] = readl_relaxed(mpp->reg_base + RKVDEC_SEL_VAL0_BASE); in rkvdec2_read_perf_sel()
464 regs[sel1] = readl_relaxed(mpp->reg_base + RKVDEC_SEL_VAL1_BASE); in rkvdec2_read_perf_sel()
468 regs[sel2] = readl_relaxed(mpp->reg_base + RKVDEC_SEL_VAL2_BASE); in rkvdec2_read_perf_sel()
476 static int rkvdec2_finish(struct mpp_dev *mpp, struct mpp_task *mpp_task) in rkvdec2_finish() argument
496 rkvdec2_read_perf_sel(mpp, task->reg_sel, s, e); in rkvdec2_finish()
500 mpp_read_req(mpp, task->reg, s, e); in rkvdec2_finish()
506 dec_get = mpp_read_relaxed(mpp, RKVDEC_REG_RLC_BASE); in rkvdec2_finish()
511 if (mpp->srv->timing_en) { in rkvdec2_finish()
519 if (mpp->timing_check && time_diff > (s64)mpp->timing_check) in rkvdec2_finish()
528 int rkvdec2_result(struct mpp_dev *mpp, struct mpp_task *mpp_task, in rkvdec2_result() argument
640 static int rkvdec2_procfs_remove(struct mpp_dev *mpp) in rkvdec2_procfs_remove() argument
642 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_procfs_remove()
659 static int rkvdec2_procfs_init(struct mpp_dev *mpp) in rkvdec2_procfs_init() argument
661 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_procfs_init()
664 if (!mpp->dev || !mpp->dev->of_node || !mpp->dev->of_node->name || in rkvdec2_procfs_init()
665 !mpp->srv || !mpp->srv->procfs) in rkvdec2_procfs_init()
669 mpp->dev->of_node->name, mpp->core_id); in rkvdec2_procfs_init()
670 dec->procfs = proc_mkdir(name, mpp->srv->procfs); in rkvdec2_procfs_init()
678 mpp_procfs_create_common(dec->procfs, mpp); in rkvdec2_procfs_init()
689 dec->procfs, &mpp->session_max_buffers); in rkvdec2_procfs_init()
693 dec->procfs, &mpp->task_index); in rkvdec2_procfs_init()
698 static inline int rkvdec2_procfs_remove(struct mpp_dev *mpp) in rkvdec2_procfs_remove() argument
703 static inline int rkvdec2_procfs_init(struct mpp_dev *mpp) in rkvdec2_procfs_init() argument
838 static int rkvdec2_devfreq_init(struct mpp_dev *mpp) in rkvdec2_devfreq_init() argument
840 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_devfreq_init()
848 dec->vdd = devm_regulator_get_optional(mpp->dev, "vdec"); in rkvdec2_devfreq_init()
851 dev_warn(mpp->dev, "vdec regulator not ready, retry\n"); in rkvdec2_devfreq_init()
855 dev_info(mpp->dev, "no regulator, devfreq is disabled\n"); in rkvdec2_devfreq_init()
860 ret = rockchip_init_opp_table(mpp->dev, NULL, "leakage", "vdec"); in rkvdec2_devfreq_init()
862 dev_err(mpp->dev, "failed to init_opp_table\n"); in rkvdec2_devfreq_init()
868 dev_err(mpp->dev, "failed to add vdec2_ondemand governor\n"); in rkvdec2_devfreq_init()
874 dec->devfreq = devm_devfreq_add_device(mpp->dev, in rkvdec2_devfreq_init()
885 devfreq_register_opp_notifier(mpp->dev, dec->devfreq); in rkvdec2_devfreq_init()
887 of_property_read_u32(mpp->dev->of_node, "dynamic-power-coefficient", in rkvdec2_devfreq_init()
889 dec->model_data = rockchip_ipa_power_model_init(mpp->dev, in rkvdec2_devfreq_init()
893 dev_err(mpp->dev, "failed to initialize power model\n"); in rkvdec2_devfreq_init()
899 dev_err(mpp->dev, "failed to get dynamic-coefficient\n"); in rkvdec2_devfreq_init()
904 of_devfreq_cooling_register_power(mpp->dev->of_node, in rkvdec2_devfreq_init()
907 dev_err(mpp->dev, "failed to register cooling device\n"); in rkvdec2_devfreq_init()
910 dec->mdev_info = rockchip_system_monitor_register(mpp->dev, &vdec2_mdevp); in rkvdec2_devfreq_init()
912 dev_dbg(mpp->dev, "without system monitor\n"); in rkvdec2_devfreq_init()
922 dev_pm_opp_of_remove_table(mpp->dev); in rkvdec2_devfreq_init()
927 static int rkvdec2_devfreq_remove(struct mpp_dev *mpp) in rkvdec2_devfreq_remove() argument
929 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_devfreq_remove()
934 devfreq_unregister_opp_notifier(mpp->dev, dec->devfreq); in rkvdec2_devfreq_remove()
935 dev_pm_opp_of_remove_table(mpp->dev); in rkvdec2_devfreq_remove()
942 void mpp_devfreq_set_core_rate(struct mpp_dev *mpp, enum MPP_CLOCK_MODE mode) in mpp_devfreq_set_core_rate() argument
944 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in mpp_devfreq_set_core_rate()
961 static inline int rkvdec2_devfreq_init(struct mpp_dev *mpp) in rkvdec2_devfreq_init() argument
966 static inline int rkvdec2_devfreq_remove(struct mpp_dev *mpp) in rkvdec2_devfreq_remove() argument
971 void mpp_devfreq_set_core_rate(struct mpp_dev *mpp, enum MPP_CLOCK_MODE mode) in mpp_devfreq_set_core_rate() argument
973 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in mpp_devfreq_set_core_rate()
979 static int rkvdec2_init(struct mpp_dev *mpp) in rkvdec2_init() argument
982 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_init()
985 mpp->grf_info = &mpp->srv->grf_infos[MPP_DRIVER_RKVDEC]; in rkvdec2_init()
988 ret = mpp_get_clk_info(mpp, &dec->aclk_info, "aclk_vcodec"); in rkvdec2_init()
991 ret = mpp_get_clk_info(mpp, &dec->hclk_info, "hclk_vcodec"); in rkvdec2_init()
994 ret = mpp_get_clk_info(mpp, &dec->core_clk_info, "clk_core"); in rkvdec2_init()
997 ret = mpp_get_clk_info(mpp, &dec->cabac_clk_info, "clk_cabac"); in rkvdec2_init()
1000 ret = mpp_get_clk_info(mpp, &dec->hevc_cabac_clk_info, "clk_hevc_cabac"); in rkvdec2_init()
1011 of_property_read_u32(mpp->dev->of_node, in rkvdec2_init()
1014 dec->rst_a = mpp_reset_control_get(mpp, RST_TYPE_A, "video_a"); in rkvdec2_init()
1017 dec->rst_h = mpp_reset_control_get(mpp, RST_TYPE_H, "video_h"); in rkvdec2_init()
1020 dec->rst_niu_a = mpp_reset_control_get(mpp, RST_TYPE_NIU_A, "niu_a"); in rkvdec2_init()
1023 dec->rst_niu_h = mpp_reset_control_get(mpp, RST_TYPE_NIU_H, "niu_h"); in rkvdec2_init()
1026 dec->rst_core = mpp_reset_control_get(mpp, RST_TYPE_CORE, "video_core"); in rkvdec2_init()
1029 dec->rst_cabac = mpp_reset_control_get(mpp, RST_TYPE_CABAC, "video_cabac"); in rkvdec2_init()
1032 dec->rst_hevc_cabac = mpp_reset_control_get(mpp, RST_TYPE_HEVC_CABAC, "video_hevc_cabac"); in rkvdec2_init()
1036 ret = rkvdec2_devfreq_init(mpp); in rkvdec2_init()
1043 static int rkvdec2_rk3568_init(struct mpp_dev *mpp) in rkvdec2_rk3568_init() argument
1046 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_rk3568_init()
1048 dec->fix = mpp_dma_alloc(mpp->dev, FIX_RK3568_BUF_SIZE); in rkvdec2_rk3568_init()
1053 dev_err(mpp->dev, "failed to create buffer for hack\n"); in rkvdec2_rk3568_init()
1055 ret = rkvdec2_init(mpp); in rkvdec2_rk3568_init()
1060 static int rkvdec2_rk3568_exit(struct mpp_dev *mpp) in rkvdec2_rk3568_exit() argument
1062 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_rk3568_exit()
1064 rkvdec2_devfreq_remove(mpp); in rkvdec2_rk3568_exit()
1072 static int rkvdec2_clk_on(struct mpp_dev *mpp) in rkvdec2_clk_on() argument
1074 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_clk_on()
1085 static int rkvdec2_clk_off(struct mpp_dev *mpp) in rkvdec2_clk_off() argument
1087 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_clk_off()
1098 static int rkvdec2_get_freq(struct mpp_dev *mpp, in rkvdec2_get_freq() argument
1104 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_get_freq()
1114 mutex_lock(&mpp->queue->pending_lock); in rkvdec2_get_freq()
1116 &mpp->queue->pending_list, in rkvdec2_get_freq()
1123 mutex_unlock(&mpp->queue->pending_lock); in rkvdec2_get_freq()
1134 static int rkvdec2_set_freq(struct mpp_dev *mpp, in rkvdec2_set_freq() argument
1137 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_set_freq()
1143 mpp_devfreq_set_core_rate(mpp, task->clk_mode); in rkvdec2_set_freq()
1148 static int rkvdec2_soft_reset(struct mpp_dev *mpp) in rkvdec2_soft_reset() argument
1157 ret = rockchip_iommu_force_reset(mpp->dev); in rkvdec2_soft_reset()
1160 mpp_write(mpp, RKVDEC_REG_INT_EN, 0); in rkvdec2_soft_reset()
1166 static int rkvdec2_sip_reset(struct mpp_dev *mpp) in rkvdec2_sip_reset() argument
1176 rkvdec2_reset(mpp); in rkvdec2_sip_reset()
1184 int rkvdec2_reset(struct mpp_dev *mpp) in rkvdec2_reset() argument
1186 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_reset()
1192 ret = rkvdec2_soft_reset(mpp); in rkvdec2_reset()
1197 mpp_pmu_idle_request(mpp, true); in rkvdec2_reset()
1213 mpp_pmu_idle_request(mpp, false); in rkvdec2_reset()
1458 domain = dec->mpp.iommu_info->domain; in rkvdec2_alloc_rcbbuf()
1525 struct mpp_dev *mpp; in rkvdec2_core_probe() local
1533 mpp = &dec->mpp; in rkvdec2_core_probe()
1534 platform_set_drvdata(pdev, mpp); in rkvdec2_core_probe()
1535 mpp->is_irq_startup = false; in rkvdec2_core_probe()
1542 mpp->var = (struct mpp_dev_var *)match->data; in rkvdec2_core_probe()
1543 mpp->core_id = of_alias_get_id(np, "rkvdec"); in rkvdec2_core_probe()
1546 ret = mpp_dev_probe(mpp, pdev); in rkvdec2_core_probe()
1551 dec->mmu_base = ioremap(dec->mpp.io_base + 0x600, 0x80); in rkvdec2_core_probe()
1570 mpp->dev_ops->alloc_task = rkvdec2_ccu_alloc_task; in rkvdec2_core_probe()
1572 mpp->dev_ops->task_worker = rkvdec2_soft_ccu_worker; in rkvdec2_core_probe()
1575 if (mpp->core_id == 0 && mpp->task_capacity > 1) { in rkvdec2_core_probe()
1576 dec->link_dec->task_capacity = mpp->task_capacity; in rkvdec2_core_probe()
1581 mpp->dev_ops->task_worker = rkvdec2_hard_ccu_worker; in rkvdec2_core_probe()
1584 mpp->iommu_info->hdl = rkvdec2_ccu_iommu_fault_handle; in rkvdec2_core_probe()
1585 kthread_init_work(&mpp->work, mpp->dev_ops->task_worker); in rkvdec2_core_probe()
1588 ret = devm_request_threaded_irq(dev, mpp->irq, irq_proc, NULL, in rkvdec2_core_probe()
1589 IRQF_SHARED, dev_name(dev), mpp); in rkvdec2_core_probe()
1595 mpp->is_irq_startup = true; in rkvdec2_core_probe()
1597 mpp->session_max_buffers = RKVDEC_SESSION_MAX_BUFFERS; in rkvdec2_core_probe()
1598 rkvdec2_procfs_init(mpp); in rkvdec2_core_probe()
1601 if (mpp->core_id == 0) in rkvdec2_core_probe()
1602 mpp_dev_register_srv(mpp, mpp->srv); in rkvdec2_core_probe()
1611 struct mpp_dev *mpp = NULL; in rkvdec2_probe_default() local
1619 mpp = &dec->mpp; in rkvdec2_probe_default()
1620 platform_set_drvdata(pdev, mpp); in rkvdec2_probe_default()
1625 mpp->var = (struct mpp_dev_var *)match->data; in rkvdec2_probe_default()
1628 ret = mpp_dev_probe(mpp, pdev); in rkvdec2_probe_default()
1638 ret = devm_request_threaded_irq(dev, mpp->irq, in rkvdec2_probe_default()
1640 IRQF_SHARED, dev_name(dev), mpp); in rkvdec2_probe_default()
1641 mpp->dev_ops->process_task = rkvdec2_link_process_task; in rkvdec2_probe_default()
1642 mpp->dev_ops->wait_result = rkvdec2_link_wait_result; in rkvdec2_probe_default()
1643 mpp->dev_ops->task_worker = rkvdec2_link_worker; in rkvdec2_probe_default()
1644 mpp->dev_ops->deinit = rkvdec2_link_session_deinit; in rkvdec2_probe_default()
1645 kthread_init_work(&mpp->work, rkvdec2_link_worker); in rkvdec2_probe_default()
1647 ret = devm_request_threaded_irq(dev, mpp->irq, in rkvdec2_probe_default()
1649 IRQF_SHARED, dev_name(dev), mpp); in rkvdec2_probe_default()
1656 mpp->session_max_buffers = RKVDEC_SESSION_MAX_BUFFERS; in rkvdec2_probe_default()
1657 rkvdec2_procfs_init(mpp); in rkvdec2_probe_default()
1658 rkvdec2_link_procfs_init(mpp); in rkvdec2_probe_default()
1660 mpp_dev_register_srv(mpp, mpp->srv); in rkvdec2_probe_default()
1696 domain = dec->mpp.iommu_info->domain; in rkvdec2_free_rcbbuf()
1711 struct mpp_dev *mpp = dev_get_drvdata(dev); in rkvdec2_remove() local
1712 struct rkvdec2_dev *dec = to_rkvdec2_dev(mpp); in rkvdec2_remove()
1720 mpp_dev_remove(mpp); in rkvdec2_remove()
1721 rkvdec2_procfs_remove(mpp); in rkvdec2_remove()
1722 rkvdec2_link_remove(mpp, dec->link_dec); in rkvdec2_remove()
1743 struct mpp_dev *mpp = dev_get_drvdata(dev); in rkvdec2_runtime_suspend() local
1745 if (mpp->is_irq_startup) { in rkvdec2_runtime_suspend()
1747 disable_irq(mpp->irq); in rkvdec2_runtime_suspend()
1748 if (mpp->iommu_info && mpp->iommu_info->got_irq) in rkvdec2_runtime_suspend()
1750 disable_irq(mpp->iommu_info->irq); in rkvdec2_runtime_suspend()
1753 if (mpp->hw_ops->clk_off) in rkvdec2_runtime_suspend()
1754 mpp->hw_ops->clk_off(mpp); in rkvdec2_runtime_suspend()
1767 struct mpp_dev *mpp = dev_get_drvdata(dev); in rkvdec2_runtime_resume() local
1769 if (mpp->hw_ops->clk_on) in rkvdec2_runtime_resume()
1770 mpp->hw_ops->clk_on(mpp); in rkvdec2_runtime_resume()
1771 if (mpp->is_irq_startup) { in rkvdec2_runtime_resume()
1773 enable_irq(mpp->irq); in rkvdec2_runtime_resume()
1775 if (mpp->iommu_info && mpp->iommu_info->got_irq) in rkvdec2_runtime_resume()
1776 enable_irq(mpp->iommu_info->irq); in rkvdec2_runtime_resume()