hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.c
....@@ -18,8 +18,6 @@
1818
1919 #include "hack/mpp_rkvdec2_link_hack_rk3568.c"
2020
21
-#define WORK_TIMEOUT_MS (500)
22
-#define WAIT_TIMEOUT_MS (2000)
2321 #define RKVDEC2_LINK_HACK_TASK_FLAG (0xff)
2422
2523 /* vdpu381 link hw info for rk3588 */
....@@ -519,11 +517,6 @@
519517 struct rkvdec_link_dev *link_dec = dec->link_dec;
520518 u32 irq_status = 0;
521519
522
- if (!atomic_read(&link_dec->power_enabled)) {
523
- dev_info(link_dec->dev, "irq on power off\n");
524
- return -1;
525
- }
526
-
527520 irq_status = readl(link_dec->reg_base + RKVDEC_LINK_IRQ_BASE);
528521
529522 if (irq_status & RKVDEC_LINK_BIT_IRQ_RAW) {
....@@ -980,6 +973,7 @@
980973
981974 list_move_tail(&task->table->link, &link_dec->unused_list);
982975 list_del_init(&mpp_task->queue_link);
976
+ link_dec->task_running--;
983977
984978 set_bit(TASK_STATE_HANDLE, &mpp_task->state);
985979 set_bit(TASK_STATE_PROC_DONE, &mpp_task->state);
....@@ -988,13 +982,10 @@
988982 if (test_bit(TASK_STATE_ABORT, &mpp_task->state))
989983 set_bit(TASK_STATE_ABORT_READY, &mpp_task->state);
990984
991
- wake_up(&mpp_task->wait);
992
- kref_put(&mpp_task->ref, rkvdec2_link_free_task);
993
- link_dec->task_running--;
994
-
995985 mpp_dbg_link("session %d task %d irq_status %#08x timeout %d abort %d\n",
996986 mpp_task->session->index, mpp_task->task_index,
997987 irq_status, timeout_flag, abort_flag);
988
+
998989 if (irq_status & RKVDEC_INT_ERROR_MASK) {
999990 dev_err(mpp->dev,
1000991 "session %d task %d irq_status %#08x timeout %u abort %u\n",
....@@ -1003,6 +994,9 @@
1003994 if (!reset_flag)
1004995 atomic_inc(&mpp->reset_request);
1005996 }
997
+
998
+ wake_up(&mpp_task->wait);
999
+ kref_put(&mpp_task->ref, rkvdec2_link_free_task);
10061000 }
10071001
10081002 /* resend running task after reset */
....@@ -1192,19 +1186,16 @@
11921186 return -EIO;
11931187 }
11941188
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");
11991192
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);
12041194
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);
12081199
12091200 mpp_session_pop_pending(session, mpp_task);
12101201 return ret;
....@@ -1356,7 +1347,8 @@
13561347 /* set the ccu-domain for current device */
13571348 ccu_info = queue->cores[0]->iommu_info;
13581349 cur_info = dec->mpp.iommu_info;
1359
- cur_info->domain = ccu_info->domain;
1350
+ if (cur_info)
1351
+ cur_info->domain = ccu_info->domain;
13601352 mpp_iommu_attach(cur_info);
13611353 }
13621354
....@@ -1839,36 +1831,6 @@
18391831 return flag;
18401832 }
18411833
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
-
18721834 void rkvdec2_soft_ccu_worker(struct kthread_work *work_s)
18731835 {
18741836 struct mpp_task *mpp_task;
....@@ -1943,7 +1905,7 @@
19431905 rkvdec2_ccu_power_off(queue, dec->ccu);
19441906
19451907 /* 5. check session detach out of queue */
1946
- rkvdec2_ccu_link_session_detach(mpp, queue);
1908
+ mpp_session_cleanup_detach(queue, work_s);
19471909
19481910 mpp_debug_leave();
19491911 }
....@@ -2366,9 +2328,7 @@
23662328 writel(RKVDEC_CCU_BIT_CFG_DONE, ccu->reg_base + RKVDEC_CCU_CFG_DONE_BASE);
23672329 mpp_task_run_end(mpp_task, timing_en);
23682330
2369
- /* pending to running */
23702331 set_bit(TASK_STATE_RUNNING, &mpp_task->state);
2371
- mpp_taskqueue_pending_to_run(queue, mpp_task);
23722332 mpp_dbg_ccu("session %d task %d iova=%08x task->state=%lx link_mode=%08x\n",
23732333 mpp_task->session->index, mpp_task->task_index,
23742334 (u32)task->table->iova, mpp_task->state,
....@@ -2541,6 +2501,7 @@
25412501
25422502 rkvdec2_ccu_power_on(queue, dec->ccu);
25432503 rkvdec2_hard_ccu_enqueue(dec->ccu, mpp_task, queue, mpp);
2504
+ mpp_taskqueue_pending_to_run(queue, mpp_task);
25442505 }
25452506
25462507 /* 4. poweroff when running and pending list are empty */