hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/video/rockchip/mpp/mpp_common.c
....@@ -36,8 +36,6 @@
3636 #include "mpp_common.h"
3737 #include "mpp_iommu.h"
3838
39
-#define MPP_WAIT_TIMEOUT_DELAY (2000)
40
-
4139 /* Use 'v' as magic number */
4240 #define MPP_IOC_MAGIC 'v'
4341
....@@ -355,9 +353,9 @@
355353 mutex_unlock(&queue->session_lock);
356354
357355 if (task_count) {
358
- mpp_dbg_session("session %d:%d task not finished %d\n",
359
- session->pid, session->index,
360
- atomic_read(&queue->detach_count));
356
+ mpp_dbg_session("session %d:%d not finished %d task cnt %d\n",
357
+ session->device_type, session->index,
358
+ atomic_read(&queue->detach_count), task_count);
361359
362360 mpp_session_clear_pending(session);
363361 } else {
....@@ -588,6 +586,7 @@
588586 mpp_dev_reset(mpp);
589587 mpp_power_off(mpp);
590588
589
+ mpp_iommu_dev_deactivate(mpp->iommu_info, mpp);
591590 set_bit(TASK_STATE_TIMEOUT, &task->state);
592591 set_bit(TASK_STATE_DONE, &task->state);
593592 /* Wake up the GET thread */
....@@ -717,10 +716,6 @@
717716 group->resets[type] = rst;
718717 group->queue = mpp->queue;
719718 }
720
- /* if reset not in the same queue, it means different device
721
- * may reset in the same time, then rw_sem_on should set true.
722
- */
723
- group->rw_sem_on |= (group->queue != mpp->queue) ? true : false;
724719 dev_info(mpp->dev, "reset_group->rw_sem_on=%d\n", group->rw_sem_on);
725720 up_write(&group->rw_sem);
726721
....@@ -821,12 +816,19 @@
821816 mpp_set_grf(mpp->grf_info);
822817 }
823818 /*
819
+ * Lock the reader locker of the device resource lock here,
820
+ * release at the finish operation
821
+ */
822
+ mpp_reset_down_read(mpp->reset_group);
823
+
824
+ /*
824825 * for iommu share hardware, should attach to ensure
825826 * working in current device
826827 */
827828 ret = mpp_iommu_attach(mpp->iommu_info);
828829 if (ret) {
829830 dev_err(mpp->dev, "mpp_iommu_attach failed\n");
831
+ mpp_reset_up_read(mpp->reset_group);
830832 return -ENODATA;
831833 }
832834
....@@ -836,11 +838,6 @@
836838
837839 if (mpp->auto_freq_en && mpp->hw_ops->set_freq)
838840 mpp->hw_ops->set_freq(mpp, task);
839
- /*
840
- * TODO: Lock the reader locker of the device resource lock here,
841
- * release at the finish operation
842
- */
843
- mpp_reset_down_read(mpp->reset_group);
844841
845842 mpp_iommu_dev_activate(mpp->iommu_info, mpp);
846843 if (mpp->dev_ops->run)
....@@ -922,23 +919,15 @@
922919 }
923920 mpp = mpp_get_task_used_device(task, session);
924921
925
- ret = wait_event_timeout(task->wait,
926
- test_bit(TASK_STATE_DONE, &task->state),
927
- msecs_to_jiffies(MPP_WAIT_TIMEOUT_DELAY));
928
- if (ret > 0) {
929
- if (mpp->dev_ops->result)
930
- ret = mpp->dev_ops->result(mpp, task, msgs);
931
- } else {
932
- atomic_inc(&task->abort_request);
933
- set_bit(TASK_STATE_ABORT, &task->state);
934
- mpp_err("timeout, pid %d session %d:%d count %d cur_task %p id %d\n",
935
- session->pid, session->pid, session->index,
936
- atomic_read(&session->task_count), task,
937
- task->task_id);
938
- }
922
+ ret = wait_event_interruptible(task->wait, test_bit(TASK_STATE_DONE, &task->state));
923
+ if (ret == -ERESTARTSYS)
924
+ mpp_err("wait task break by signal\n");
939925
940
- mpp_debug_func(DEBUG_TASK_INFO, "task %d kref_%d\n",
941
- task->task_id, kref_read(&task->ref));
926
+ if (mpp->dev_ops->result)
927
+ ret = mpp->dev_ops->result(mpp, task, msgs);
928
+ mpp_debug_func(DEBUG_TASK_INFO, "wait done session %d:%d count %d task %d state %lx\n",
929
+ session->device_type, session->index, atomic_read(&session->task_count),
930
+ task->task_index, task->state);
942931
943932 mpp_session_pop_pending(session, task);
944933
....@@ -1013,6 +1002,10 @@
10131002 return -ENODEV;
10141003 } else {
10151004 mpp->reset_group = mpp->srv->reset_groups[reset_group_node];
1005
+ if (!mpp->reset_group->queue)
1006
+ mpp->reset_group->queue = queue;
1007
+ if (mpp->reset_group->queue != mpp->queue)
1008
+ mpp->reset_group->rw_sem_on = true;
10161009 }
10171010 }
10181011
....@@ -2266,7 +2259,7 @@
22662259 irq_ret = mpp->dev_ops->irq(mpp);
22672260
22682261 if (task) {
2269
- if (irq_ret != IRQ_NONE) {
2262
+ if (irq_ret == IRQ_WAKE_THREAD) {
22702263 /* if wait or delayed work timeout, abort request will turn on,
22712264 * isr should not to response, and handle it in delayed work
22722265 */