Lines Matching refs:mpp

53 		container_of(dev, struct rkvenc_dev, mpp)
268 struct mpp_dev mpp; member
780 static int rkvenc_task_get_format(struct mpp_dev *mpp, in rkvenc_task_get_format() argument
803 static int rkvenc2_set_rcbbuf(struct mpp_dev *mpp, struct mpp_session *session, in rkvenc2_set_rcbbuf() argument
806 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc2_set_rcbbuf()
904 struct mpp_dev *mpp = session->mpp; in rkvenc_alloc_task() local
914 mpp_task->hw_info = mpp->var->hw_info; in rkvenc_alloc_task()
922 ret = rkvenc_task_get_format(mpp, task); in rkvenc_alloc_task()
946 bs_index = mpp->var->trans_info[fmt].table[2]; in rkvenc_alloc_task()
956 cnt = mpp->var->trans_info[fmt].count; in rkvenc_alloc_task()
957 tbl = mpp->var->trans_info[fmt].table; in rkvenc_alloc_task()
983 mpp_task_dump_mem_region(mpp, mpp_task); in rkvenc_alloc_task()
984 mpp_task_dump_reg(mpp, mpp_task); in rkvenc_alloc_task()
994 static void *rkvenc2_prepare(struct mpp_dev *mpp, struct mpp_task *mpp_task) in rkvenc2_prepare() argument
996 struct mpp_taskqueue *queue = mpp->queue; in rkvenc2_prepare()
1009 struct mpp_dev *mpp = queue->cores[i]; in rkvenc2_prepare() local
1011 if (mpp && mpp->disable) in rkvenc2_prepare()
1024 mpp_task->mpp = queue->cores[core_id]; in rkvenc2_prepare()
1026 rkvenc2_set_rcbbuf(mpp_task->mpp, mpp_task->session, task); in rkvenc2_prepare()
1042 int core_id = enc->mpp.core_id; in rkvenc2_patch_dchs()
1050 dev_err(enc->mpp.dev, "invalid core id %d max %d\n", in rkvenc2_patch_dchs()
1157 int core_id = enc->mpp.core_id; in rkvenc2_update_dchs()
1164 dev_err(enc->mpp.dev, "invalid core id %d max %d\n", in rkvenc2_update_dchs()
1189 static int rkvenc_run(struct mpp_dev *mpp, struct mpp_task *mpp_task) in rkvenc_run() argument
1193 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_run()
1196 u32 timing_en = mpp->srv->timing_en; in rkvenc_run()
1201 mpp_write(mpp, hw->enc_clr_base, 0x2); in rkvenc_run()
1203 mpp_write(mpp, hw->enc_clr_base, 0x0); in rkvenc_run()
1206 mpp_write_relaxed(mpp, 0x5300, 0x2); in rkvenc_run()
1231 mpp_write_relaxed(mpp, off, regs[j]); in rkvenc_run()
1236 dev_info(mpp->dev, "core %d dchs %08x\n", mpp->core_id, in rkvenc_run()
1237 mpp_read_relaxed(&enc->mpp, DCHS_REG_OFFSET)); in rkvenc_run()
1240 mpp_iommu_flush_tlb(mpp->iommu_info); in rkvenc_run()
1243 mpp->cur_task = mpp_task; in rkvenc_run()
1250 mpp_write(mpp, enc->hw_info->enc_start_base, start_val); in rkvenc_run()
1259 static void rkvenc2_read_slice_len(struct mpp_dev *mpp, struct rkvenc_task *task) in rkvenc2_read_slice_len() argument
1261 u32 last = mpp_read_relaxed(mpp, 0x002c) & INT_STA_ENC_DONE_STA; in rkvenc2_read_slice_len()
1262 u32 sli_num = mpp_read_relaxed(mpp, RKVENC2_REG_SLICE_NUM_BASE); in rkvenc2_read_slice_len()
1271 slice_info.val = mpp_read_relaxed(mpp, RKVENC2_REG_SLICE_LEN_BASE); in rkvenc2_read_slice_len()
1295 static int rkvenc_irq(struct mpp_dev *mpp) in rkvenc_irq() argument
1297 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_irq()
1307 mpp->irq_status = mpp_read(mpp, hw->int_sta_base); in rkvenc_irq()
1308 if (!mpp->irq_status) in rkvenc_irq()
1311 if (mpp->cur_task) { in rkvenc_irq()
1312 mpp_task = mpp->cur_task; in rkvenc_irq()
1316 if (mpp->irq_status & INT_STA_ENC_DONE_STA) { in rkvenc_irq()
1319 rkvenc2_read_slice_len(mpp, task); in rkvenc_irq()
1327 mpp->irq_status |= INT_STA_BSF_OFLW_STA; in rkvenc_irq()
1330 } else if (mpp->irq_status & INT_STA_SLC_DONE_STA) { in rkvenc_irq()
1334 rkvenc2_read_slice_len(mpp, task); in rkvenc_irq()
1340 } else if (mpp->irq_status & INT_STA_BSF_OFLW_STA) { in rkvenc_irq()
1341 u32 bs_rd = mpp_read(mpp, RKVENC2_REG_ADR_BSBR); in rkvenc_irq()
1342 u32 bs_wr = mpp_read(mpp, RKVENC2_REG_ST_BSB); in rkvenc_irq()
1343 u32 bs_top = mpp_read(mpp, RKVENC2_REG_ADR_BSBT); in rkvenc_irq()
1344 u32 bs_bot = mpp_read(mpp, RKVENC2_REG_ADR_BSBB); in rkvenc_irq()
1347 dev_err(mpp->dev, "task %d found bitstream overflow [%#08x %#08x %#08x %#08x]\n", in rkvenc_irq()
1353 mpp_write(mpp, hw->int_clr_base, mpp->irq_status); in rkvenc_irq()
1355 mpp_write(mpp, RKVENC2_REG_ADR_BSBS, bs_wr); in rkvenc_irq()
1361 dev_err(mpp->dev, "found error status %08x\n", mpp->irq_status); in rkvenc_irq()
1363 irq_mask = mpp->irq_status; in rkvenc_irq()
1368 mpp_write(mpp, hw->int_mask_base, irq_mask); in rkvenc_irq()
1371 mpp_write(mpp, hw->int_clr_base, mpp->irq_status); in rkvenc_irq()
1373 mpp_write(mpp, hw->int_sta_base, 0); in rkvenc_irq()
1381 static int rkvenc_isr(struct mpp_dev *mpp) in rkvenc_isr() argument
1385 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_isr()
1386 struct mpp_taskqueue *queue = mpp->queue; in rkvenc_isr()
1392 if (!mpp->cur_task) { in rkvenc_isr()
1393 dev_err(mpp->dev, "no current task\n"); in rkvenc_isr()
1397 mpp_task = mpp->cur_task; in rkvenc_isr()
1399 mpp->cur_task = NULL; in rkvenc_isr()
1401 if (mpp_task->mpp && mpp_task->mpp != mpp) in rkvenc_isr()
1402 dev_err(mpp->dev, "mismatch core dev %p:%p\n", mpp_task->mpp, mpp); in rkvenc_isr()
1405 task->irq_status = mpp->irq_status; in rkvenc_isr()
1410 dev_name(mpp->dev), task->irq_status); in rkvenc_isr()
1413 atomic_inc(&mpp->reset_request); in rkvenc_isr()
1417 mpp_task_dump_hw_reg(mpp); in rkvenc_isr()
1423 set_bit(mpp->core_id, &queue->core_idle); in rkvenc_isr()
1425 mpp_dbg_core("core %d isr idle %lx -> %lx\n", mpp->core_id, core_idle, in rkvenc_isr()
1433 static int rkvenc_finish(struct mpp_dev *mpp, struct mpp_task *mpp_task) in rkvenc_finish() argument
1454 reg[j] = mpp_read_relaxed(mpp, msg.offset + j * sizeof(u32)); in rkvenc_finish()
1459 u32 bs_size = mpp_read(mpp, 0x4064); in rkvenc_finish()
1475 static int rkvenc_result(struct mpp_dev *mpp, in rkvenc_result() argument
1585 static int rkvenc_procfs_remove(struct mpp_dev *mpp) in rkvenc_procfs_remove() argument
1587 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_procfs_remove()
1644 struct mpp_dev *mpp = seq->private; in rkvenc_show_session_info() local
1646 mutex_lock(&mpp->srv->session_lock); in rkvenc_show_session_info()
1648 &mpp->srv->session_list, in rkvenc_show_session_info()
1654 if (mpp->dev_ops->dump_session) in rkvenc_show_session_info()
1655 mpp->dev_ops->dump_session(session, seq); in rkvenc_show_session_info()
1657 mutex_unlock(&mpp->srv->session_lock); in rkvenc_show_session_info()
1662 static int rkvenc_procfs_init(struct mpp_dev *mpp) in rkvenc_procfs_init() argument
1664 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_procfs_init()
1667 if (!mpp->dev || !mpp->dev->of_node || !mpp->dev->of_node->name || in rkvenc_procfs_init()
1668 !mpp->srv || !mpp->srv->procfs) in rkvenc_procfs_init()
1672 mpp->dev->of_node->name, mpp->core_id); in rkvenc_procfs_init()
1674 enc->procfs = proc_mkdir(name, mpp->srv->procfs); in rkvenc_procfs_init()
1682 mpp_procfs_create_common(enc->procfs, mpp); in rkvenc_procfs_init()
1690 enc->procfs, &mpp->session_max_buffers); in rkvenc_procfs_init()
1693 enc->procfs, rkvenc_show_session_info, mpp); in rkvenc_procfs_init()
1698 static int rkvenc_procfs_ccu_init(struct mpp_dev *mpp) in rkvenc_procfs_ccu_init() argument
1700 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_procfs_ccu_init()
1709 static inline int rkvenc_procfs_remove(struct mpp_dev *mpp) in rkvenc_procfs_remove() argument
1714 static inline int rkvenc_procfs_init(struct mpp_dev *mpp) in rkvenc_procfs_init() argument
1719 static inline int rkvenc_procfs_ccu_init(struct mpp_dev *mpp) in rkvenc_procfs_ccu_init() argument
1765 static int rkvenc_devfreq_init(struct mpp_dev *mpp) in rkvenc_devfreq_init() argument
1767 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_devfreq_init()
1769 struct device *dev = mpp->dev; in rkvenc_devfreq_init()
1809 static int rkvenc_devfreq_remove(struct mpp_dev *mpp) in rkvenc_devfreq_remove() argument
1811 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_devfreq_remove()
1820 static int rkvenc_init(struct mpp_dev *mpp) in rkvenc_init() argument
1822 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_init()
1825 mpp->grf_info = &mpp->srv->grf_infos[MPP_DRIVER_RKVENC]; in rkvenc_init()
1828 ret = mpp_get_clk_info(mpp, &enc->aclk_info, "aclk_vcodec"); in rkvenc_init()
1831 ret = mpp_get_clk_info(mpp, &enc->hclk_info, "hclk_vcodec"); in rkvenc_init()
1834 ret = mpp_get_clk_info(mpp, &enc->core_clk_info, "clk_core"); in rkvenc_init()
1838 of_property_read_u32(mpp->dev->of_node, in rkvenc_init()
1846 enc->rst_a = mpp_reset_control_get(mpp, RST_TYPE_A, "video_a"); in rkvenc_init()
1849 enc->rst_h = mpp_reset_control_get(mpp, RST_TYPE_H, "video_h"); in rkvenc_init()
1852 enc->rst_core = mpp_reset_control_get(mpp, RST_TYPE_CORE, "video_core"); in rkvenc_init()
1857 ret = rkvenc_devfreq_init(mpp); in rkvenc_init()
1865 static int rkvenc_exit(struct mpp_dev *mpp) in rkvenc_exit() argument
1868 rkvenc_devfreq_remove(mpp); in rkvenc_exit()
1874 static int rkvenc_soft_reset(struct mpp_dev *mpp) in rkvenc_soft_reset() argument
1876 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_soft_reset()
1882 mpp_write(mpp, hw->int_mask_base, 0x3FF); in rkvenc_soft_reset()
1883 mpp_write(mpp, hw->enc_clr_base, 0x1); in rkvenc_soft_reset()
1884 ret = readl_relaxed_poll_timeout(mpp->reg_base + hw->int_sta_base, in rkvenc_soft_reset()
1888 mpp_write(mpp, hw->int_clr_base, 0xffffffff); in rkvenc_soft_reset()
1889 mpp_write(mpp, hw->int_sta_base, 0); in rkvenc_soft_reset()
1895 static int rkvenc_reset(struct mpp_dev *mpp) in rkvenc_reset() argument
1897 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_reset()
1899 struct mpp_taskqueue *queue = mpp->queue; in rkvenc_reset()
1904 ret = rkvenc_soft_reset(mpp); in rkvenc_reset()
1909 mpp_pmu_idle_request(mpp, true); in rkvenc_reset()
1917 mpp_pmu_idle_request(mpp, false); in rkvenc_reset()
1920 set_bit(mpp->core_id, &queue->core_idle); in rkvenc_reset()
1922 enc->ccu->dchs[mpp->core_id].val = 0; in rkvenc_reset()
1924 mpp_dbg_core("core %d reset idle %lx\n", mpp->core_id, queue->core_idle); in rkvenc_reset()
1931 static int rkvenc_clk_on(struct mpp_dev *mpp) in rkvenc_clk_on() argument
1933 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_clk_on()
1942 static int rkvenc_clk_off(struct mpp_dev *mpp) in rkvenc_clk_off() argument
1944 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_clk_off()
1953 static int rkvenc_set_freq(struct mpp_dev *mpp, struct mpp_task *mpp_task) in rkvenc_set_freq() argument
1955 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_set_freq()
1978 static int rkvenc2_task_default_process(struct mpp_dev *mpp, in rkvenc2_task_default_process() argument
1983 if (mpp->dev_ops && mpp->dev_ops->result) in rkvenc2_task_default_process()
1984 ret = mpp->dev_ops->result(mpp, task, NULL); in rkvenc2_task_default_process()
2007 if (task->mpp) { in rkvenc2_task_timeout_process()
2008 struct mpp_dev *mpp = task->mpp; in rkvenc2_task_timeout_process() local
2013 dev_err(mpp->dev, "core %d dump timeout status:\n", mpp->core_id); in rkvenc2_task_timeout_process()
2016 mpp_reg_show(mpp, offset); in rkvenc2_task_timeout_process()
2029 struct mpp_dev *mpp; in rkvenc2_wait_result() local
2044 mpp = mpp_get_task_used_device(task, session); in rkvenc2_wait_result()
2057 return rkvenc2_task_default_process(mpp, task); in rkvenc2_wait_result()
2103 mpp->core_id, enc_task->slice_rd_cnt, slice_info.slice_len, in rkvenc2_wait_result()
2283 ccu->main_core = &enc->mpp; in rkvenc_attach_ccu()
2289 cur_info = enc->mpp.iommu_info; in rkvenc_attach_ccu()
2299 enc->mpp.msgs_cap = 0; in rkvenc_attach_ccu()
2303 dev_info(dev, "attach ccu as core %d\n", enc->mpp.core_id); in rkvenc_attach_ccu()
2362 domain = enc->mpp.iommu_info->domain; in rkvenc2_alloc_rcbbuf()
2411 struct mpp_dev *mpp = (struct mpp_dev *)arg; in rkvenc2_iommu_fault_handle() local
2412 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc2_iommu_fault_handle()
2413 struct mpp_task *mpp_task = mpp->cur_task; in rkvenc2_iommu_fault_handle()
2415 dev_info(mpp->dev, "core %d page fault found dchs %08x\n", in rkvenc2_iommu_fault_handle()
2416 mpp->core_id, mpp_read_relaxed(&enc->mpp, DCHS_REG_OFFSET)); in rkvenc2_iommu_fault_handle()
2419 mpp_task_dump_mem_region(mpp, mpp_task); in rkvenc2_iommu_fault_handle()
2429 struct mpp_dev *mpp = NULL; in rkvenc_core_probe() local
2435 mpp = &enc->mpp; in rkvenc_core_probe()
2436 platform_set_drvdata(pdev, mpp); in rkvenc_core_probe()
2444 mpp->var = (struct mpp_dev_var *)match->data; in rkvenc_core_probe()
2446 mpp->core_id = of_alias_get_id(np, "rkvenc"); in rkvenc_core_probe()
2449 ret = mpp_dev_probe(mpp, pdev); in rkvenc_core_probe()
2461 ret = devm_request_threaded_irq(dev, mpp->irq, in rkvenc_core_probe()
2465 dev_name(dev), mpp); in rkvenc_core_probe()
2470 mpp->session_max_buffers = RKVENC_SESSION_MAX_BUFFERS; in rkvenc_core_probe()
2471 enc->hw_info = to_rkvenc_info(mpp->var->hw_info); in rkvenc_core_probe()
2472 if (mpp->iommu_info) in rkvenc_core_probe()
2473 mpp->iommu_info->hdl = rkvenc2_iommu_fault_handle; in rkvenc_core_probe()
2474 rkvenc_procfs_init(mpp); in rkvenc_core_probe()
2475 rkvenc_procfs_ccu_init(mpp); in rkvenc_core_probe()
2478 if (mpp == enc->ccu->main_core) in rkvenc_core_probe()
2479 mpp_dev_register_srv(mpp, mpp->srv); in rkvenc_core_probe()
2489 struct mpp_dev *mpp = NULL; in rkvenc_probe_default() local
2496 mpp = &enc->mpp; in rkvenc_probe_default()
2497 platform_set_drvdata(pdev, mpp); in rkvenc_probe_default()
2502 mpp->var = (struct mpp_dev_var *)match->data; in rkvenc_probe_default()
2505 ret = mpp_dev_probe(mpp, pdev); in rkvenc_probe_default()
2511 ret = devm_request_threaded_irq(dev, mpp->irq, in rkvenc_probe_default()
2515 dev_name(dev), mpp); in rkvenc_probe_default()
2520 mpp->session_max_buffers = RKVENC_SESSION_MAX_BUFFERS; in rkvenc_probe_default()
2521 enc->hw_info = to_rkvenc_info(mpp->var->hw_info); in rkvenc_probe_default()
2522 rkvenc_procfs_init(mpp); in rkvenc_probe_default()
2523 mpp_dev_register_srv(mpp, mpp->srv); in rkvenc_probe_default()
2528 mpp_dev_remove(mpp); in rkvenc_probe_default()
2564 domain = enc->mpp.iommu_info->domain; in rkvenc2_free_rcbbuf()
2579 struct mpp_dev *mpp = dev_get_drvdata(dev); in rkvenc_remove() local
2580 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_remove()
2590 mpp_dev_remove(&enc->mpp); in rkvenc_remove()
2591 rkvenc_procfs_remove(&enc->mpp); in rkvenc_remove()
2593 struct mpp_dev *mpp = dev_get_drvdata(dev); in rkvenc_remove() local
2594 struct rkvenc_dev *enc = to_rkvenc_dev(mpp); in rkvenc_remove()
2598 mpp_dev_remove(mpp); in rkvenc_remove()
2599 rkvenc_procfs_remove(mpp); in rkvenc_remove()