.. | .. |
---|
18 | 18 | |
---|
19 | 19 | #include "hack/mpp_rkvdec2_link_hack_rk3568.c" |
---|
20 | 20 | |
---|
21 | | -#define WORK_TIMEOUT_MS (500) |
---|
22 | | -#define WAIT_TIMEOUT_MS (2000) |
---|
23 | 21 | #define RKVDEC2_LINK_HACK_TASK_FLAG (0xff) |
---|
24 | 22 | |
---|
25 | 23 | /* vdpu381 link hw info for rk3588 */ |
---|
.. | .. |
---|
519 | 517 | struct rkvdec_link_dev *link_dec = dec->link_dec; |
---|
520 | 518 | u32 irq_status = 0; |
---|
521 | 519 | |
---|
522 | | - if (!atomic_read(&link_dec->power_enabled)) { |
---|
523 | | - dev_info(link_dec->dev, "irq on power off\n"); |
---|
524 | | - return -1; |
---|
525 | | - } |
---|
526 | | - |
---|
527 | 520 | irq_status = readl(link_dec->reg_base + RKVDEC_LINK_IRQ_BASE); |
---|
528 | 521 | |
---|
529 | 522 | if (irq_status & RKVDEC_LINK_BIT_IRQ_RAW) { |
---|
.. | .. |
---|
980 | 973 | |
---|
981 | 974 | list_move_tail(&task->table->link, &link_dec->unused_list); |
---|
982 | 975 | list_del_init(&mpp_task->queue_link); |
---|
| 976 | + link_dec->task_running--; |
---|
983 | 977 | |
---|
984 | 978 | set_bit(TASK_STATE_HANDLE, &mpp_task->state); |
---|
985 | 979 | set_bit(TASK_STATE_PROC_DONE, &mpp_task->state); |
---|
.. | .. |
---|
988 | 982 | if (test_bit(TASK_STATE_ABORT, &mpp_task->state)) |
---|
989 | 983 | set_bit(TASK_STATE_ABORT_READY, &mpp_task->state); |
---|
990 | 984 | |
---|
991 | | - wake_up(&mpp_task->wait); |
---|
992 | | - kref_put(&mpp_task->ref, rkvdec2_link_free_task); |
---|
993 | | - link_dec->task_running--; |
---|
994 | | - |
---|
995 | 985 | mpp_dbg_link("session %d task %d irq_status %#08x timeout %d abort %d\n", |
---|
996 | 986 | mpp_task->session->index, mpp_task->task_index, |
---|
997 | 987 | irq_status, timeout_flag, abort_flag); |
---|
| 988 | + |
---|
998 | 989 | if (irq_status & RKVDEC_INT_ERROR_MASK) { |
---|
999 | 990 | dev_err(mpp->dev, |
---|
1000 | 991 | "session %d task %d irq_status %#08x timeout %u abort %u\n", |
---|
.. | .. |
---|
1003 | 994 | if (!reset_flag) |
---|
1004 | 995 | atomic_inc(&mpp->reset_request); |
---|
1005 | 996 | } |
---|
| 997 | + |
---|
| 998 | + wake_up(&mpp_task->wait); |
---|
| 999 | + kref_put(&mpp_task->ref, rkvdec2_link_free_task); |
---|
1006 | 1000 | } |
---|
1007 | 1001 | |
---|
1008 | 1002 | /* resend running task after reset */ |
---|
.. | .. |
---|
1192 | 1186 | return -EIO; |
---|
1193 | 1187 | } |
---|
1194 | 1188 | |
---|
1195 | | - ret = wait_event_timeout(mpp_task->wait, task_is_done(mpp_task), |
---|
1196 | | - msecs_to_jiffies(WAIT_TIMEOUT_MS)); |
---|
1197 | | - if (ret) { |
---|
1198 | | - ret = rkvdec2_result(mpp, mpp_task, msgs); |
---|
| 1189 | + ret = wait_event_interruptible(mpp_task->wait, task_is_done(mpp_task)); |
---|
| 1190 | + if (ret == -ERESTARTSYS) |
---|
| 1191 | + mpp_err("wait task break by signal\n"); |
---|
1199 | 1192 | |
---|
1200 | | - mpp_session_pop_done(session, mpp_task); |
---|
1201 | | - } else { |
---|
1202 | | - mpp_err("task %d:%d state %lx timeout -> abort\n", |
---|
1203 | | - session->index, mpp_task->task_id, mpp_task->state); |
---|
| 1193 | + ret = rkvdec2_result(mpp, mpp_task, msgs); |
---|
1204 | 1194 | |
---|
1205 | | - atomic_inc(&mpp_task->abort_request); |
---|
1206 | | - set_bit(TASK_STATE_ABORT, &mpp_task->state); |
---|
1207 | | - } |
---|
| 1195 | + mpp_session_pop_done(session, mpp_task); |
---|
| 1196 | + mpp_debug_func(DEBUG_TASK_INFO, "wait done session %d:%d count %d task %d state %lx\n", |
---|
| 1197 | + session->device_type, session->index, atomic_read(&session->task_count), |
---|
| 1198 | + mpp_task->task_index, mpp_task->state); |
---|
1208 | 1199 | |
---|
1209 | 1200 | mpp_session_pop_pending(session, mpp_task); |
---|
1210 | 1201 | return ret; |
---|
.. | .. |
---|
1356 | 1347 | /* set the ccu-domain for current device */ |
---|
1357 | 1348 | ccu_info = queue->cores[0]->iommu_info; |
---|
1358 | 1349 | cur_info = dec->mpp.iommu_info; |
---|
1359 | | - cur_info->domain = ccu_info->domain; |
---|
| 1350 | + if (cur_info) |
---|
| 1351 | + cur_info->domain = ccu_info->domain; |
---|
1360 | 1352 | mpp_iommu_attach(cur_info); |
---|
1361 | 1353 | } |
---|
1362 | 1354 | |
---|
.. | .. |
---|
1839 | 1831 | return flag; |
---|
1840 | 1832 | } |
---|
1841 | 1833 | |
---|
1842 | | -static int rkvdec2_ccu_link_session_detach(struct mpp_dev *mpp, |
---|
1843 | | - struct mpp_taskqueue *queue) |
---|
1844 | | -{ |
---|
1845 | | - mutex_lock(&queue->session_lock); |
---|
1846 | | - while (atomic_read(&queue->detach_count)) { |
---|
1847 | | - struct mpp_session *session = NULL; |
---|
1848 | | - |
---|
1849 | | - session = list_first_entry_or_null(&queue->session_detach, |
---|
1850 | | - struct mpp_session, |
---|
1851 | | - session_link); |
---|
1852 | | - if (session) { |
---|
1853 | | - list_del_init(&session->session_link); |
---|
1854 | | - atomic_dec(&queue->detach_count); |
---|
1855 | | - } |
---|
1856 | | - |
---|
1857 | | - mutex_unlock(&queue->session_lock); |
---|
1858 | | - |
---|
1859 | | - if (session) { |
---|
1860 | | - mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev), |
---|
1861 | | - atomic_read(&queue->detach_count)); |
---|
1862 | | - mpp_session_deinit(session); |
---|
1863 | | - } |
---|
1864 | | - |
---|
1865 | | - mutex_lock(&queue->session_lock); |
---|
1866 | | - } |
---|
1867 | | - mutex_unlock(&queue->session_lock); |
---|
1868 | | - |
---|
1869 | | - return 0; |
---|
1870 | | -} |
---|
1871 | | - |
---|
1872 | 1834 | void rkvdec2_soft_ccu_worker(struct kthread_work *work_s) |
---|
1873 | 1835 | { |
---|
1874 | 1836 | struct mpp_task *mpp_task; |
---|
.. | .. |
---|
1943 | 1905 | rkvdec2_ccu_power_off(queue, dec->ccu); |
---|
1944 | 1906 | |
---|
1945 | 1907 | /* 5. check session detach out of queue */ |
---|
1946 | | - rkvdec2_ccu_link_session_detach(mpp, queue); |
---|
| 1908 | + mpp_session_cleanup_detach(queue, work_s); |
---|
1947 | 1909 | |
---|
1948 | 1910 | mpp_debug_leave(); |
---|
1949 | 1911 | } |
---|
.. | .. |
---|
2366 | 2328 | writel(RKVDEC_CCU_BIT_CFG_DONE, ccu->reg_base + RKVDEC_CCU_CFG_DONE_BASE); |
---|
2367 | 2329 | mpp_task_run_end(mpp_task, timing_en); |
---|
2368 | 2330 | |
---|
2369 | | - /* pending to running */ |
---|
2370 | 2331 | set_bit(TASK_STATE_RUNNING, &mpp_task->state); |
---|
2371 | | - mpp_taskqueue_pending_to_run(queue, mpp_task); |
---|
2372 | 2332 | mpp_dbg_ccu("session %d task %d iova=%08x task->state=%lx link_mode=%08x\n", |
---|
2373 | 2333 | mpp_task->session->index, mpp_task->task_index, |
---|
2374 | 2334 | (u32)task->table->iova, mpp_task->state, |
---|
.. | .. |
---|
2541 | 2501 | |
---|
2542 | 2502 | rkvdec2_ccu_power_on(queue, dec->ccu); |
---|
2543 | 2503 | rkvdec2_hard_ccu_enqueue(dec->ccu, mpp_task, queue, mpp); |
---|
| 2504 | + mpp_taskqueue_pending_to_run(queue, mpp_task); |
---|
2544 | 2505 | } |
---|
2545 | 2506 | |
---|
2546 | 2507 | /* 4. poweroff when running and pending list are empty */ |
---|