forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/video/rockchip/mpp/mpp_common.c
....@@ -36,14 +36,6 @@
3636 #include "mpp_common.h"
3737 #include "mpp_iommu.h"
3838
39
-#define MPP_WAIT_TIMEOUT_DELAY (2000)
40
-
41
-/* Use 'v' as magic number */
42
-#define MPP_IOC_MAGIC 'v'
43
-
44
-#define MPP_IOC_CFG_V1 _IOW(MPP_IOC_MAGIC, 1, unsigned int)
45
-#define MPP_IOC_CFG_V2 _IOW(MPP_IOC_MAGIC, 2, unsigned int)
46
-
4739 /* input parmater structure for version 1 */
4840 struct mpp_msg_v1 {
4941 __u32 cmd;
....@@ -51,14 +43,6 @@
5143 __u32 size;
5244 __u32 offset;
5345 __u64 data_ptr;
54
-};
55
-
56
-#define MPP_BAT_MSG_DONE (0x00000001)
57
-
58
-struct mpp_bat_msg {
59
- __u64 flag;
60
- __u32 fd;
61
- __s32 ret;
6246 };
6347
6448 #ifdef CONFIG_ROCKCHIP_MPP_PROC_FS
....@@ -355,9 +339,9 @@
355339 mutex_unlock(&queue->session_lock);
356340
357341 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));
342
+ mpp_dbg_session("session %d:%d not finished %d task cnt %d\n",
343
+ session->device_type, session->index,
344
+ atomic_read(&queue->detach_count), task_count);
361345
362346 mpp_session_clear_pending(session);
363347 } else {
....@@ -588,6 +572,7 @@
588572 mpp_dev_reset(mpp);
589573 mpp_power_off(mpp);
590574
575
+ mpp_iommu_dev_deactivate(mpp->iommu_info, mpp);
591576 set_bit(TASK_STATE_TIMEOUT, &task->state);
592577 set_bit(TASK_STATE_DONE, &task->state);
593578 /* Wake up the GET thread */
....@@ -717,10 +702,6 @@
717702 group->resets[type] = rst;
718703 group->queue = mpp->queue;
719704 }
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;
724705 dev_info(mpp->dev, "reset_group->rw_sem_on=%d\n", group->rw_sem_on);
725706 up_write(&group->rw_sem);
726707
....@@ -821,12 +802,19 @@
821802 mpp_set_grf(mpp->grf_info);
822803 }
823804 /*
805
+ * Lock the reader locker of the device resource lock here,
806
+ * release at the finish operation
807
+ */
808
+ mpp_reset_down_read(mpp->reset_group);
809
+
810
+ /*
824811 * for iommu share hardware, should attach to ensure
825812 * working in current device
826813 */
827814 ret = mpp_iommu_attach(mpp->iommu_info);
828815 if (ret) {
829816 dev_err(mpp->dev, "mpp_iommu_attach failed\n");
817
+ mpp_reset_up_read(mpp->reset_group);
830818 return -ENODATA;
831819 }
832820
....@@ -836,11 +824,6 @@
836824
837825 if (mpp->auto_freq_en && mpp->hw_ops->set_freq)
838826 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);
844827
845828 mpp_iommu_dev_activate(mpp->iommu_info, mpp);
846829 if (mpp->dev_ops->run)
....@@ -922,23 +905,15 @@
922905 }
923906 mpp = mpp_get_task_used_device(task, session);
924907
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
- }
908
+ ret = wait_event_interruptible(task->wait, test_bit(TASK_STATE_DONE, &task->state));
909
+ if (ret == -ERESTARTSYS)
910
+ mpp_err("wait task break by signal\n");
939911
940
- mpp_debug_func(DEBUG_TASK_INFO, "task %d kref_%d\n",
941
- task->task_id, kref_read(&task->ref));
912
+ if (mpp->dev_ops->result)
913
+ ret = mpp->dev_ops->result(mpp, task, msgs);
914
+ mpp_debug_func(DEBUG_TASK_INFO, "wait done session %d:%d count %d task %d state %lx\n",
915
+ session->device_type, session->index, atomic_read(&session->task_count),
916
+ task->task_index, task->state);
942917
943918 mpp_session_pop_pending(session, task);
944919
....@@ -1013,6 +988,10 @@
1013988 return -ENODEV;
1014989 } else {
1015990 mpp->reset_group = mpp->srv->reset_groups[reset_group_node];
991
+ if (!mpp->reset_group->queue)
992
+ mpp->reset_group->queue = queue;
993
+ if (mpp->reset_group->queue != mpp->queue)
994
+ mpp->reset_group->rw_sem_on = true;
1016995 }
1017996 }
1018997
....@@ -2266,7 +2245,7 @@
22662245 irq_ret = mpp->dev_ops->irq(mpp);
22672246
22682247 if (task) {
2269
- if (irq_ret != IRQ_NONE) {
2248
+ if (irq_ret == IRQ_WAKE_THREAD) {
22702249 /* if wait or delayed work timeout, abort request will turn on,
22712250 * isr should not to response, and handle it in delayed work
22722251 */