forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/video/rockchip/mpp/mpp_common.c
....@@ -36,15 +36,6 @@
3636 #include "mpp_common.h"
3737 #include "mpp_iommu.h"
3838
39
-#define MPP_WORK_TIMEOUT_DELAY (200)
40
-#define MPP_WAIT_TIMEOUT_DELAY (2000)
41
-
42
-/* Use 'v' as magic number */
43
-#define MPP_IOC_MAGIC 'v'
44
-
45
-#define MPP_IOC_CFG_V1 _IOW(MPP_IOC_MAGIC, 1, unsigned int)
46
-#define MPP_IOC_CFG_V2 _IOW(MPP_IOC_MAGIC, 2, unsigned int)
47
-
4839 /* input parmater structure for version 1 */
4940 struct mpp_msg_v1 {
5041 __u32 cmd;
....@@ -60,12 +51,15 @@
6051 [MPP_DEVICE_VDPU2] = "VDPU2",
6152 [MPP_DEVICE_VDPU1_PP] = "VDPU1_PP",
6253 [MPP_DEVICE_VDPU2_PP] = "VDPU2_PP",
54
+ [MPP_DEVICE_AV1DEC] = "AV1DEC",
6355 [MPP_DEVICE_HEVC_DEC] = "HEVC_DEC",
6456 [MPP_DEVICE_RKVDEC] = "RKVDEC",
6557 [MPP_DEVICE_AVSPLUS_DEC] = "AVSPLUS_DEC",
58
+ [MPP_DEVICE_RKJPEGD] = "RKJPEGD",
6659 [MPP_DEVICE_RKVENC] = "RKVENC",
6760 [MPP_DEVICE_VEPU1] = "VEPU1",
6861 [MPP_DEVICE_VEPU2] = "VEPU2",
62
+ [MPP_DEVICE_VEPU2_JPEG] = "VEPU2",
6963 [MPP_DEVICE_VEPU22] = "VEPU22",
7064 [MPP_DEVICE_IEP2] = "IEP2",
7165 [MPP_DEVICE_VDPP] = "VDPP",
....@@ -87,25 +81,8 @@
8781
8882 #endif
8983
90
-static void mpp_free_task(struct kref *ref);
9184 static void mpp_attach_workqueue(struct mpp_dev *mpp,
9285 struct mpp_taskqueue *queue);
93
-
94
-/* task queue schedule */
95
-static int
96
-mpp_taskqueue_push_pending(struct mpp_taskqueue *queue,
97
- struct mpp_task *task)
98
-{
99
- if (!task->session || !task->session->mpp)
100
- return -EINVAL;
101
-
102
- kref_get(&task->ref);
103
- mutex_lock(&queue->pending_lock);
104
- list_add_tail(&task->queue_link, &queue->pending_list);
105
- mutex_unlock(&queue->pending_lock);
106
-
107
- return 0;
108
-}
10986
11087 static int
11188 mpp_taskqueue_pop_pending(struct mpp_taskqueue *queue,
....@@ -149,9 +126,7 @@
149126 return flag;
150127 }
151128
152
-static int
153
-mpp_taskqueue_pending_to_run(struct mpp_taskqueue *queue,
154
- struct mpp_task *task)
129
+int mpp_taskqueue_pending_to_run(struct mpp_taskqueue *queue, struct mpp_task *task)
155130 {
156131 unsigned long flags;
157132
....@@ -231,20 +206,106 @@
231206 return 0;
232207 }
233208
234
-static int mpp_session_clear(struct mpp_dev *mpp,
235
- struct mpp_session *session)
209
+static void task_msgs_reset(struct mpp_task_msgs *msgs)
210
+{
211
+ list_del_init(&msgs->list);
212
+
213
+ msgs->flags = 0;
214
+ msgs->req_cnt = 0;
215
+ msgs->set_cnt = 0;
216
+ msgs->poll_cnt = 0;
217
+}
218
+
219
+static void task_msgs_init(struct mpp_task_msgs *msgs, struct mpp_session *session)
220
+{
221
+ INIT_LIST_HEAD(&msgs->list);
222
+
223
+ msgs->session = session;
224
+ msgs->queue = NULL;
225
+ msgs->task = NULL;
226
+ msgs->mpp = NULL;
227
+
228
+ msgs->ext_fd = -1;
229
+
230
+ task_msgs_reset(msgs);
231
+}
232
+
233
+static struct mpp_task_msgs *get_task_msgs(struct mpp_session *session)
234
+{
235
+ unsigned long flags;
236
+ struct mpp_task_msgs *msgs;
237
+
238
+ spin_lock_irqsave(&session->lock_msgs, flags);
239
+ msgs = list_first_entry_or_null(&session->list_msgs_idle,
240
+ struct mpp_task_msgs, list_session);
241
+ if (msgs) {
242
+ list_move_tail(&msgs->list_session, &session->list_msgs);
243
+ spin_unlock_irqrestore(&session->lock_msgs, flags);
244
+
245
+ return msgs;
246
+ }
247
+ spin_unlock_irqrestore(&session->lock_msgs, flags);
248
+
249
+ msgs = kzalloc(sizeof(*msgs), GFP_KERNEL);
250
+ task_msgs_init(msgs, session);
251
+ INIT_LIST_HEAD(&msgs->list_session);
252
+
253
+ spin_lock_irqsave(&session->lock_msgs, flags);
254
+ list_move_tail(&msgs->list_session, &session->list_msgs);
255
+ session->msgs_cnt++;
256
+ spin_unlock_irqrestore(&session->lock_msgs, flags);
257
+
258
+ mpp_debug_func(DEBUG_TASK_INFO, "session %d:%d msgs cnt %d\n",
259
+ session->pid, session->index, session->msgs_cnt);
260
+
261
+ return msgs;
262
+}
263
+
264
+static void put_task_msgs(struct mpp_task_msgs *msgs)
265
+{
266
+ struct mpp_session *session = msgs->session;
267
+ unsigned long flags;
268
+
269
+ if (!session) {
270
+ pr_err("invalid msgs without session\n");
271
+ return;
272
+ }
273
+
274
+ if (msgs->ext_fd >= 0) {
275
+ fdput(msgs->f);
276
+ msgs->ext_fd = -1;
277
+ }
278
+
279
+ task_msgs_reset(msgs);
280
+
281
+ spin_lock_irqsave(&session->lock_msgs, flags);
282
+ list_move_tail(&msgs->list_session, &session->list_msgs_idle);
283
+ spin_unlock_irqrestore(&session->lock_msgs, flags);
284
+}
285
+
286
+static void clear_task_msgs(struct mpp_session *session)
287
+{
288
+ struct mpp_task_msgs *msgs, *n;
289
+ LIST_HEAD(list_to_free);
290
+ unsigned long flags;
291
+
292
+ spin_lock_irqsave(&session->lock_msgs, flags);
293
+
294
+ list_for_each_entry_safe(msgs, n, &session->list_msgs, list_session)
295
+ list_move_tail(&msgs->list_session, &list_to_free);
296
+
297
+ list_for_each_entry_safe(msgs, n, &session->list_msgs_idle, list_session)
298
+ list_move_tail(&msgs->list_session, &list_to_free);
299
+
300
+ spin_unlock_irqrestore(&session->lock_msgs, flags);
301
+
302
+ list_for_each_entry_safe(msgs, n, &list_to_free, list_session)
303
+ kfree(msgs);
304
+}
305
+
306
+static void mpp_session_clear_pending(struct mpp_session *session)
236307 {
237308 struct mpp_task *task = NULL, *n;
238
-
239
- /* clear session done list */
240
- mutex_lock(&session->done_lock);
241
- list_for_each_entry_safe(task, n,
242
- &session->done_list,
243
- done_link) {
244
- list_del_init(&task->done_link);
245
- kref_put(&task->ref, mpp_free_task);
246
- }
247
- mutex_unlock(&session->done_lock);
248309
249310 /* clear session pending list */
250311 mutex_lock(&session->pending_lock);
....@@ -257,8 +318,49 @@
257318 kref_put(&task->ref, mpp_free_task);
258319 }
259320 mutex_unlock(&session->pending_lock);
321
+}
260322
261
- return 0;
323
+void mpp_session_cleanup_detach(struct mpp_taskqueue *queue, struct kthread_work *work)
324
+{
325
+ struct mpp_session *session, *n;
326
+
327
+ if (!atomic_read(&queue->detach_count))
328
+ return;
329
+
330
+ mutex_lock(&queue->session_lock);
331
+ list_for_each_entry_safe(session, n, &queue->session_detach, session_link) {
332
+ s32 task_count = atomic_read(&session->task_count);
333
+
334
+ if (!task_count) {
335
+ list_del_init(&session->session_link);
336
+ atomic_dec(&queue->detach_count);
337
+ }
338
+
339
+ mutex_unlock(&queue->session_lock);
340
+
341
+ if (task_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);
345
+
346
+ mpp_session_clear_pending(session);
347
+ } else {
348
+ mpp_dbg_session("queue detach %d\n",
349
+ atomic_read(&queue->detach_count));
350
+
351
+ mpp_session_deinit(session);
352
+ }
353
+
354
+ mutex_lock(&queue->session_lock);
355
+ }
356
+ mutex_unlock(&queue->session_lock);
357
+
358
+ if (atomic_read(&queue->detach_count)) {
359
+ mpp_dbg_session("queue detach %d again\n",
360
+ atomic_read(&queue->detach_count));
361
+
362
+ kthread_queue_work(&queue->worker, work);
363
+ }
262364 }
263365
264366 static struct mpp_session *mpp_session_init(void)
....@@ -271,15 +373,16 @@
271373 session->pid = current->pid;
272374
273375 mutex_init(&session->pending_lock);
274
- mutex_init(&session->done_lock);
275376 INIT_LIST_HEAD(&session->pending_list);
276
- INIT_LIST_HEAD(&session->done_list);
277377 INIT_LIST_HEAD(&session->service_link);
278378 INIT_LIST_HEAD(&session->session_link);
279379
280
- init_waitqueue_head(&session->wait);
281380 atomic_set(&session->task_count, 0);
282381 atomic_set(&session->release_request, 0);
382
+
383
+ INIT_LIST_HEAD(&session->list_msgs);
384
+ INIT_LIST_HEAD(&session->list_msgs_idle);
385
+ spin_lock_init(&session->lock_msgs);
283386
284387 mpp_dbg_session("session %p init\n", session);
285388 return session;
....@@ -293,7 +396,7 @@
293396 if (mpp->dev_ops->free_session)
294397 mpp->dev_ops->free_session(session);
295398
296
- mpp_session_clear(mpp, session);
399
+ mpp_session_clear_pending(session);
297400
298401 if (session->dma) {
299402 mpp_iommu_down_read(mpp->iommu_info);
....@@ -314,30 +417,25 @@
314417 list_del_init(&session->session_link);
315418 }
316419
317
-int mpp_session_deinit(struct mpp_session *session)
420
+void mpp_session_deinit(struct mpp_session *session)
318421 {
319
- u32 task_count = atomic_read(&session->task_count);
320
-
321
- mpp_dbg_session("session %p:%d task %d release\n",
322
- session, session->index, task_count);
323
- if (task_count)
324
- return -1;
422
+ mpp_dbg_session("session %d:%d task %d deinit\n", session->pid,
423
+ session->index, atomic_read(&session->task_count));
325424
326425 if (likely(session->deinit))
327426 session->deinit(session);
328427 else
329428 pr_err("invalid NULL session deinit function\n");
330429
331
- mpp_dbg_session("session %p:%d deinit\n", session, session->index);
430
+ clear_task_msgs(session);
332431
333432 kfree(session);
334
- return 0;
335433 }
336434
337435 static void mpp_session_attach_workqueue(struct mpp_session *session,
338436 struct mpp_taskqueue *queue)
339437 {
340
- mpp_dbg_session("session %p:%d attach\n", session, session->index);
438
+ mpp_dbg_session("session %d:%d attach\n", session->pid, session->index);
341439 mutex_lock(&queue->session_lock);
342440 list_add_tail(&session->session_link, &queue->session_attach);
343441 mutex_unlock(&queue->session_lock);
....@@ -351,14 +449,14 @@
351449 if (!session->mpp || !session->mpp->queue)
352450 return;
353451
354
- mpp_dbg_session("session %p:%d detach\n", session, session->index);
452
+ mpp_dbg_session("session %d:%d detach\n", session->pid, session->index);
355453 mpp = session->mpp;
356454 queue = mpp->queue;
357455
358456 mutex_lock(&queue->session_lock);
359457 list_del_init(&session->session_link);
360458 list_add_tail(&session->session_link, &queue->session_detach);
361
- queue->detach_count++;
459
+ atomic_inc(&queue->detach_count);
362460 mutex_unlock(&queue->session_lock);
363461
364462 mpp_taskqueue_trigger_work(mpp);
....@@ -370,6 +468,10 @@
370468 {
371469 kref_get(&task->ref);
372470 mutex_lock(&session->pending_lock);
471
+ if (session->srv->timing_en) {
472
+ task->on_pending = ktime_get();
473
+ set_bit(TASK_TIMING_PENDING, &task->state);
474
+ }
373475 list_add_tail(&task->pending_link, &session->pending_list);
374476 mutex_unlock(&session->pending_lock);
375477
....@@ -402,30 +504,7 @@
402504 return task;
403505 }
404506
405
-static int mpp_session_push_done(struct mpp_session *session,
406
- struct mpp_task *task)
407
-{
408
- kref_get(&task->ref);
409
- mutex_lock(&session->done_lock);
410
- list_add_tail(&task->done_link, &session->done_list);
411
- mutex_unlock(&session->done_lock);
412
-
413
- return 0;
414
-}
415
-
416
-static int mpp_session_pop_done(struct mpp_session *session,
417
- struct mpp_task *task)
418
-{
419
- mutex_lock(&session->done_lock);
420
- list_del_init(&task->done_link);
421
- mutex_unlock(&session->done_lock);
422
- set_bit(TASK_STATE_DONE, &task->state);
423
- kref_put(&task->ref, mpp_free_task);
424
-
425
- return 0;
426
-}
427
-
428
-static void mpp_free_task(struct kref *ref)
507
+void mpp_free_task(struct kref *ref)
429508 {
430509 struct mpp_dev *mpp;
431510 struct mpp_session *session;
....@@ -437,18 +516,14 @@
437516 }
438517 session = task->session;
439518
440
- mpp_debug_func(DEBUG_TASK_INFO,
441
- "session=%p, task=%p, state=0x%lx, abort_request=%d\n",
442
- session, task, task->state,
519
+ mpp_debug_func(DEBUG_TASK_INFO, "task %d:%d free state 0x%lx abort %d\n",
520
+ session->index, task->task_id, task->state,
443521 atomic_read(&task->abort_request));
444
- if (!session->mpp) {
445
- mpp_err("session %p, session->mpp is null.\n", session);
446
- return;
447
- }
448
- mpp = session->mpp;
449522
523
+ mpp = mpp_get_task_used_device(task, session);
450524 if (mpp->dev_ops->free_task)
451525 mpp->dev_ops->free_task(session, task);
526
+
452527 /* Decrease reference count */
453528 atomic_dec(&session->task_count);
454529 atomic_dec(&mpp->task_count);
....@@ -462,58 +537,76 @@
462537 struct mpp_task,
463538 timeout_work);
464539
465
- if (!test_bit(TASK_STATE_START, &task->state)) {
466
- mpp_err("task has not start\n");
467
- schedule_delayed_work(&task->timeout_work,
468
- msecs_to_jiffies(MPP_WORK_TIMEOUT_DELAY));
469
- return;
470
- }
471
-
472
- mpp_err("task %p processing time out!\n", task);
473
- if (!task->session) {
474
- mpp_err("task %p, task->session is null.\n", task);
475
- return;
476
- }
477
- session = task->session;
478
-
479
- if (!session->mpp) {
480
- mpp_err("session %p, session->mpp is null.\n", session);
481
- return;
482
- }
483
- mpp = session->mpp;
484
-
485
- synchronize_hardirq(mpp->irq);
486
-
487540 if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) {
488541 mpp_err("task has been handled\n");
489542 return;
490543 }
544
+
545
+ if (!task->session) {
546
+ mpp_err("task %p, task->session is null.\n", task);
547
+ return;
548
+ }
549
+
550
+ session = task->session;
551
+ mpp_err("task %d:%d:%d processing time out!\n", session->pid,
552
+ session->index, task->task_id);
553
+
554
+ if (!session->mpp) {
555
+ mpp_err("session %d:%d, session mpp is null.\n", session->pid,
556
+ session->index);
557
+ return;
558
+ }
559
+
560
+ mpp_task_dump_timing(task, ktime_us_delta(ktime_get(), task->on_create));
561
+
562
+ mpp = mpp_get_task_used_device(task, session);
563
+
564
+ /* disable core irq */
565
+ disable_irq(mpp->irq);
566
+ /* disable mmu irq */
567
+ if (mpp->iommu_info && mpp->iommu_info->got_irq)
568
+ disable_irq(mpp->iommu_info->irq);
491569
492570 /* hardware maybe dead, reset it */
493571 mpp_reset_up_read(mpp->reset_group);
494572 mpp_dev_reset(mpp);
495573 mpp_power_off(mpp);
496574
497
- mpp_session_push_done(session, task);
575
+ mpp_iommu_dev_deactivate(mpp->iommu_info, mpp);
576
+ set_bit(TASK_STATE_TIMEOUT, &task->state);
577
+ set_bit(TASK_STATE_DONE, &task->state);
498578 /* Wake up the GET thread */
499
- wake_up(&session->wait);
579
+ wake_up(&task->wait);
500580
501581 /* remove task from taskqueue running list */
502
- set_bit(TASK_STATE_TIMEOUT, &task->state);
503582 mpp_taskqueue_pop_running(mpp->queue, task);
583
+
584
+ /* enable core irq */
585
+ enable_irq(mpp->irq);
586
+ /* enable mmu irq */
587
+ if (mpp->iommu_info && mpp->iommu_info->got_irq)
588
+ enable_irq(mpp->iommu_info->irq);
589
+
590
+ mpp_taskqueue_trigger_work(mpp);
504591 }
505592
506593 static int mpp_process_task_default(struct mpp_session *session,
507
- struct mpp_task_msgs *msgs)
594
+ struct mpp_task_msgs *msgs)
508595 {
509596 struct mpp_task *task = NULL;
510597 struct mpp_dev *mpp = session->mpp;
598
+ u32 timing_en;
599
+ ktime_t on_create;
511600
512601 if (unlikely(!mpp)) {
513
- mpp_err("pid %d clinet %d found invalid process function\n",
602
+ mpp_err("pid %d client %d found invalid process function\n",
514603 session->pid, session->device_type);
515604 return -EINVAL;
516605 }
606
+
607
+ timing_en = session->srv->timing_en;
608
+ if (timing_en)
609
+ on_create = ktime_get();
517610
518611 if (mpp->dev_ops->alloc_task)
519612 task = mpp->dev_ops->alloc_task(session, msgs);
....@@ -521,13 +614,30 @@
521614 mpp_err("alloc_task failed.\n");
522615 return -ENOMEM;
523616 }
617
+
618
+ if (timing_en) {
619
+ task->on_create_end = ktime_get();
620
+ task->on_create = on_create;
621
+ set_bit(TASK_TIMING_CREATE_END, &task->state);
622
+ set_bit(TASK_TIMING_CREATE, &task->state);
623
+ }
624
+
625
+ /* ensure current device */
626
+ mpp = mpp_get_task_used_device(task, session);
627
+
524628 kref_init(&task->ref);
629
+ init_waitqueue_head(&task->wait);
525630 atomic_set(&task->abort_request, 0);
526631 task->task_index = atomic_fetch_inc(&mpp->task_index);
632
+ task->task_id = atomic_fetch_inc(&mpp->queue->task_id);
527633 INIT_DELAYED_WORK(&task->timeout_work, mpp_task_timeout_work);
528634
529635 if (mpp->auto_freq_en && mpp->hw_ops->get_freq)
530636 mpp->hw_ops->get_freq(mpp, task);
637
+
638
+ msgs->queue = mpp->queue;
639
+ msgs->task = task;
640
+ msgs->mpp = mpp;
531641
532642 /*
533643 * Push task to session should be in front of push task to queue.
....@@ -537,13 +647,6 @@
537647 */
538648 atomic_inc(&session->task_count);
539649 mpp_session_push_pending(session, task);
540
- /* push current task to queue */
541
- atomic_inc(&mpp->task_count);
542
- mpp_taskqueue_push_pending(mpp->queue, task);
543
- set_bit(TASK_STATE_PENDING, &task->state);
544
- /* trigger current queue to run task */
545
- mpp_taskqueue_trigger_work(mpp);
546
- kref_put(&task->ref, mpp_free_task);
547650
548651 return 0;
549652 }
....@@ -599,10 +702,6 @@
599702 group->resets[type] = rst;
600703 group->queue = mpp->queue;
601704 }
602
- /* if reset not in the same queue, it means different device
603
- * may reset in the same time, then rw_sem_on should set true.
604
- */
605
- group->rw_sem_on |= (group->queue != mpp->queue) ? true : false;
606705 dev_info(mpp->dev, "reset_group->rw_sem_on=%d\n", group->rw_sem_on);
607706 up_write(&group->rw_sem);
608707
....@@ -628,10 +727,9 @@
628727 mpp_iommu_down_write(mpp->iommu_info);
629728 mpp_reset_down_write(mpp->reset_group);
630729 atomic_set(&mpp->reset_request, 0);
631
- rockchip_save_qos(mpp->dev);
730
+
632731 if (mpp->hw_ops->reset)
633732 mpp->hw_ops->reset(mpp);
634
- rockchip_restore_qos(mpp->dev);
635733
636734 /* Note: if the domain does not change, iommu attach will be return
637735 * as an empty operation. Therefore, force to close and then open,
....@@ -647,12 +745,48 @@
647745 return 0;
648746 }
649747
748
+void mpp_task_run_begin(struct mpp_task *task, u32 timing_en, u32 timeout)
749
+{
750
+ preempt_disable();
751
+
752
+ set_bit(TASK_STATE_START, &task->state);
753
+
754
+ mpp_time_record(task);
755
+ schedule_delayed_work(&task->timeout_work, msecs_to_jiffies(timeout));
756
+
757
+ if (timing_en) {
758
+ task->on_sched_timeout = ktime_get();
759
+ set_bit(TASK_TIMING_TO_SCHED, &task->state);
760
+ }
761
+}
762
+
763
+void mpp_task_run_end(struct mpp_task *task, u32 timing_en)
764
+{
765
+ if (timing_en) {
766
+ task->on_run_end = ktime_get();
767
+ set_bit(TASK_TIMING_RUN_END, &task->state);
768
+ }
769
+
770
+#ifdef MODULE
771
+ preempt_enable();
772
+#else
773
+ preempt_enable_no_resched();
774
+#endif
775
+}
776
+
650777 static int mpp_task_run(struct mpp_dev *mpp,
651778 struct mpp_task *task)
652779 {
653780 int ret;
781
+ u32 timing_en;
654782
655783 mpp_debug_enter();
784
+
785
+ timing_en = mpp->srv->timing_en;
786
+ if (timing_en) {
787
+ task->on_run = ktime_get();
788
+ set_bit(TASK_TIMING_RUN, &task->state);
789
+ }
656790
657791 /*
658792 * before running, we have to switch grf ctrl bit to ensure
....@@ -668,33 +802,32 @@
668802 mpp_set_grf(mpp->grf_info);
669803 }
670804 /*
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
+ /*
671811 * for iommu share hardware, should attach to ensure
672812 * working in current device
673813 */
674814 ret = mpp_iommu_attach(mpp->iommu_info);
675815 if (ret) {
676816 dev_err(mpp->dev, "mpp_iommu_attach failed\n");
817
+ mpp_reset_up_read(mpp->reset_group);
677818 return -ENODATA;
678819 }
679820
680821 mpp_power_on(mpp);
681
- mpp_time_record(task);
682
- mpp_debug(DEBUG_TASK_INFO, "pid %d, start hw %s\n",
683
- task->session->pid, dev_name(mpp->dev));
822
+ mpp_debug_func(DEBUG_TASK_INFO, "pid %d run %s\n",
823
+ task->session->pid, dev_name(mpp->dev));
684824
685825 if (mpp->auto_freq_en && mpp->hw_ops->set_freq)
686826 mpp->hw_ops->set_freq(mpp, task);
687
- /*
688
- * TODO: Lock the reader locker of the device resource lock here,
689
- * release at the finish operation
690
- */
691
- mpp_reset_down_read(mpp->reset_group);
692827
693
- schedule_delayed_work(&task->timeout_work,
694
- msecs_to_jiffies(MPP_WORK_TIMEOUT_DELAY));
828
+ mpp_iommu_dev_activate(mpp->iommu_info, mpp);
695829 if (mpp->dev_ops->run)
696830 mpp->dev_ops->run(mpp, task);
697
- set_bit(TASK_STATE_START, &task->state);
698831
699832 mpp_debug_leave();
700833
....@@ -709,6 +842,7 @@
709842
710843 mpp_debug_enter();
711844
845
+again:
712846 task = mpp_taskqueue_get_pending_task(queue);
713847 if (!task)
714848 goto done;
....@@ -716,7 +850,7 @@
716850 /* if task timeout and aborted, remove it */
717851 if (atomic_read(&task->abort_request) > 0) {
718852 mpp_taskqueue_pop_pending(queue, task);
719
- goto done;
853
+ goto again;
720854 }
721855
722856 /* get device for current task */
....@@ -741,106 +875,46 @@
741875 */
742876 /* Push a pending task to running queue */
743877 if (task) {
878
+ struct mpp_dev *task_mpp = mpp_get_task_used_device(task, task->session);
879
+
880
+ atomic_inc(&task_mpp->task_count);
744881 mpp_taskqueue_pending_to_run(queue, task);
745882 set_bit(TASK_STATE_RUNNING, &task->state);
746
- if (mpp_task_run(mpp, task))
747
- mpp_taskqueue_pop_running(mpp->queue, task);
883
+ if (mpp_task_run(task_mpp, task))
884
+ mpp_taskqueue_pop_running(queue, task);
885
+ else
886
+ goto again;
748887 }
749888
750889 done:
751
- mutex_lock(&queue->session_lock);
752
- while (queue->detach_count) {
753
- struct mpp_session *session = NULL;
754
-
755
- session = list_first_entry_or_null(&queue->session_detach, struct mpp_session,
756
- session_link);
757
- if (session) {
758
- list_del_init(&session->session_link);
759
- queue->detach_count--;
760
- }
761
-
762
- mutex_unlock(&queue->session_lock);
763
-
764
- if (session) {
765
- mpp_dbg_session("%s detach count %d\n", dev_name(mpp->dev),
766
- queue->detach_count);
767
- mpp_session_deinit(session);
768
- }
769
-
770
- mutex_lock(&queue->session_lock);
771
- }
772
- mutex_unlock(&queue->session_lock);
890
+ mpp_session_cleanup_detach(queue, work_s);
773891 }
774892
775893 static int mpp_wait_result_default(struct mpp_session *session,
776
- struct mpp_task_msgs *msgs)
894
+ struct mpp_task_msgs *msgs)
777895 {
778896 int ret;
779897 struct mpp_task *task;
780
- struct mpp_dev *mpp = session->mpp;
781
-
782
- if (unlikely(!mpp)) {
783
- mpp_err("pid %d clinet %d found invalid wait result function\n",
784
- session->pid, session->device_type);
785
- return -EINVAL;
786
- }
787
-
788
- ret = wait_event_timeout(session->wait,
789
- !list_empty(&session->done_list),
790
- msecs_to_jiffies(MPP_WAIT_TIMEOUT_DELAY));
898
+ struct mpp_dev *mpp;
791899
792900 task = mpp_session_get_pending_task(session);
793901 if (!task) {
794
- mpp_err("session %p pending list is empty!\n", session);
902
+ mpp_err("session %d:%d pending list is empty!\n",
903
+ session->pid, session->index);
795904 return -EIO;
796905 }
906
+ mpp = mpp_get_task_used_device(task, session);
797907
798
- if (ret > 0) {
799
- u32 task_found = 0;
800
- struct mpp_task *loop = NULL, *n;
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");
801911
802
- /* find task in session done list */
803
- mutex_lock(&session->done_lock);
804
- list_for_each_entry_safe(loop, n,
805
- &session->done_list,
806
- done_link) {
807
- if (loop == task) {
808
- task_found = 1;
809
- break;
810
- }
811
- }
812
- mutex_unlock(&session->done_lock);
813
- if (task_found) {
814
- if (mpp->dev_ops->result)
815
- ret = mpp->dev_ops->result(mpp, task, msgs);
816
- mpp_session_pop_done(session, task);
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);
817917
818
- if (test_bit(TASK_STATE_TIMEOUT, &task->state))
819
- ret = -ETIMEDOUT;
820
- } else {
821
- mpp_err("session %p task %p, not found in done list!\n",
822
- session, task);
823
- ret = -EIO;
824
- }
825
- } else {
826
- atomic_inc(&task->abort_request);
827
- mpp_err("timeout, pid %d session %p:%d count %d cur_task %p index %d.\n",
828
- session->pid, session, session->index,
829
- atomic_read(&session->task_count), task,
830
- task->task_index);
831
- /* if twice and return timeout, otherwise, re-wait */
832
- if (atomic_read(&task->abort_request) > 1) {
833
- mpp_err("session %p:%d, task %p index %d abort wait twice!\n",
834
- session, session->index,
835
- task, task->task_index);
836
- ret = -ETIMEDOUT;
837
- } else {
838
- return mpp_wait_result_default(session, msgs);
839
- }
840
- }
841
-
842
- mpp_debug_func(DEBUG_TASK_INFO,
843
- "kref_read=%d, ret=%d\n", kref_read(&task->ref), ret);
844918 mpp_session_pop_pending(session, task);
845919
846920 return ret;
....@@ -875,36 +949,32 @@
875949 of_node_put(np);
876950 if (!pdev) {
877951 dev_err(dev, "failed to get mpp service from node\n");
878
- ret = -ENODEV;
879
- goto err_put_pdev;
952
+ return -ENODEV;
880953 }
881954
882
- mpp->pdev_srv = pdev;
883955 mpp->srv = platform_get_drvdata(pdev);
956
+ platform_device_put(pdev);
884957 if (!mpp->srv) {
885
- dev_err(&pdev->dev, "failed attach service\n");
886
- ret = -EINVAL;
887
- goto err_put_pdev;
958
+ dev_err(dev, "failed attach service\n");
959
+ return -EINVAL;
888960 }
889961
890962 ret = of_property_read_u32(dev->of_node,
891963 "rockchip,taskqueue-node", &taskqueue_node);
892964 if (ret) {
893965 dev_err(dev, "failed to get taskqueue-node\n");
894
- goto err_put_pdev;
966
+ return ret;
895967 } else if (taskqueue_node >= mpp->srv->taskqueue_cnt) {
896968 dev_err(dev, "taskqueue-node %d must less than %d\n",
897969 taskqueue_node, mpp->srv->taskqueue_cnt);
898
- ret = -ENODEV;
899
- goto err_put_pdev;
970
+ return -ENODEV;
900971 }
901972 /* set taskqueue according dtsi */
902973 queue = mpp->srv->task_queues[taskqueue_node];
903974 if (!queue) {
904975 dev_err(dev, "taskqueue attach to invalid node %d\n",
905976 taskqueue_node);
906
- ret = -ENODEV;
907
- goto err_put_pdev;
977
+ return -ENODEV;
908978 }
909979 mpp_attach_workqueue(mpp, queue);
910980
....@@ -915,19 +985,17 @@
915985 if (reset_group_node >= mpp->srv->reset_group_cnt) {
916986 dev_err(dev, "resetgroup-node %d must less than %d\n",
917987 reset_group_node, mpp->srv->reset_group_cnt);
918
- ret = -ENODEV;
919
- goto err_put_pdev;
988
+ return -ENODEV;
920989 } else {
921990 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;
922995 }
923996 }
924997
925998 return 0;
926
-
927
-err_put_pdev:
928
- platform_device_put(pdev);
929
-
930
- return ret;
931999 }
9321000
9331001 struct mpp_taskqueue *mpp_taskqueue_init(struct device *dev)
....@@ -951,6 +1019,10 @@
9511019
9521020 /* default taskqueue has max 16 task capacity */
9531021 queue->task_capacity = MPP_MAX_TASK_CAPACITY;
1022
+ atomic_set(&queue->reset_request, 0);
1023
+ atomic_set(&queue->detach_count, 0);
1024
+ atomic_set(&queue->task_id, 0);
1025
+ queue->dev_active_flags = 0;
9541026
9551027 return queue;
9561028 }
....@@ -958,12 +1030,51 @@
9581030 static void mpp_attach_workqueue(struct mpp_dev *mpp,
9591031 struct mpp_taskqueue *queue)
9601032 {
961
- mpp->queue = queue;
1033
+ s32 core_id;
1034
+
9621035 INIT_LIST_HEAD(&mpp->queue_link);
1036
+
9631037 mutex_lock(&queue->dev_lock);
1038
+
1039
+ if (mpp->core_id >= 0)
1040
+ core_id = mpp->core_id;
1041
+ else
1042
+ core_id = queue->core_count;
1043
+
1044
+ if (core_id < 0 || core_id >= MPP_MAX_CORE_NUM) {
1045
+ dev_err(mpp->dev, "invalid core id %d\n", core_id);
1046
+ goto done;
1047
+ }
1048
+
1049
+ /*
1050
+ * multi devices with no multicores share one queue,
1051
+ * the core_id is default value 0.
1052
+ */
1053
+ if (queue->cores[core_id]) {
1054
+ if (queue->cores[core_id] == mpp)
1055
+ goto done;
1056
+
1057
+ core_id = queue->core_count;
1058
+ }
1059
+
1060
+ queue->cores[core_id] = mpp;
1061
+ queue->core_count++;
1062
+
1063
+ set_bit(core_id, &queue->core_idle);
9641064 list_add_tail(&mpp->queue_link, &queue->dev_list);
1065
+ if (queue->core_id_max < (u32)core_id)
1066
+ queue->core_id_max = (u32)core_id;
1067
+
1068
+ mpp->core_id = core_id;
1069
+ mpp->queue = queue;
1070
+
1071
+ mpp_dbg_core("%s attach queue as core %d\n",
1072
+ dev_name(mpp->dev), mpp->core_id);
1073
+
9651074 if (queue->task_capacity > mpp->task_capacity)
9661075 queue->task_capacity = mpp->task_capacity;
1076
+
1077
+done:
9671078 mutex_unlock(&queue->dev_lock);
9681079 }
9691080
....@@ -973,7 +1084,15 @@
9731084
9741085 if (queue) {
9751086 mutex_lock(&queue->dev_lock);
1087
+
1088
+ queue->cores[mpp->core_id] = NULL;
1089
+ queue->core_count--;
1090
+
1091
+ clear_bit(mpp->core_id, &queue->core_idle);
9761092 list_del_init(&mpp->queue_link);
1093
+
1094
+ mpp->queue = NULL;
1095
+
9771096 mutex_unlock(&queue->dev_lock);
9781097 }
9791098 }
....@@ -989,27 +1108,6 @@
9891108 found = (cmd >= MPP_CMD_CONTROL_BASE && cmd < MPP_CMD_CONTROL_BUTT) ? true : found;
9901109
9911110 return found ? 0 : -EINVAL;
992
-}
993
-
994
-static int mpp_parse_msg_v1(struct mpp_msg_v1 *msg,
995
- struct mpp_request *req)
996
-{
997
- int ret = 0;
998
-
999
- req->cmd = msg->cmd;
1000
- req->flags = msg->flags;
1001
- req->size = msg->size;
1002
- req->offset = msg->offset;
1003
- req->data = (void __user *)(unsigned long)msg->data_ptr;
1004
-
1005
- mpp_debug(DEBUG_IOCTL, "cmd %x, flags %08x, size %d, offset %x\n",
1006
- req->cmd, req->flags, req->size, req->offset);
1007
-
1008
- ret = mpp_check_cmd_v1(req->cmd);
1009
- if (ret)
1010
- mpp_err("mpp cmd %x is not supproted.\n", req->cmd);
1011
-
1012
- return ret;
10131111 }
10141112
10151113 static inline int mpp_msg_is_last(struct mpp_request *req)
....@@ -1061,7 +1159,8 @@
10611159 int ret;
10621160 struct mpp_dev *mpp;
10631161
1064
- mpp_debug(DEBUG_IOCTL, "req->cmd %x\n", req->cmd);
1162
+ mpp_debug(DEBUG_IOCTL, "cmd %x process\n", req->cmd);
1163
+
10651164 switch (req->cmd) {
10661165 case MPP_CMD_QUERY_HW_SUPPORT: {
10671166 u32 hw_support = srv->hw_support;
....@@ -1087,8 +1186,10 @@
10871186 if (test_bit(client_type, &srv->hw_support))
10881187 mpp = srv->sub_devices[client_type];
10891188 }
1189
+
10901190 if (!mpp)
10911191 return -EINVAL;
1192
+
10921193 hw_info = mpp->var->hw_info;
10931194 mpp_debug(DEBUG_IOCTL, "hw_id %08x\n", hw_info->hw_id);
10941195 if (put_user(hw_info->hw_id, (u32 __user *)req->data))
....@@ -1119,6 +1220,7 @@
11191220 mpp = srv->sub_devices[client_type];
11201221 if (!mpp)
11211222 return -EINVAL;
1223
+
11221224 session->device_type = (enum MPP_DEVICE_TYPE)client_type;
11231225 session->dma = mpp_dma_session_create(mpp->dev, mpp->session_max_buffers);
11241226 session->mpp = mpp;
....@@ -1140,6 +1242,7 @@
11401242 if (ret)
11411243 return ret;
11421244 }
1245
+
11431246 mpp_session_attach_workqueue(session, mpp->queue);
11441247 } break;
11451248 case MPP_CMD_INIT_DRIVER_DATA: {
....@@ -1182,6 +1285,21 @@
11821285 case MPP_CMD_POLL_HW_FINISH: {
11831286 msgs->flags |= req->flags;
11841287 msgs->poll_cnt++;
1288
+ msgs->poll_req = NULL;
1289
+ } break;
1290
+ case MPP_CMD_POLL_HW_IRQ: {
1291
+ if (msgs->poll_cnt || msgs->poll_req)
1292
+ mpp_err("Do NOT poll hw irq when previous call not return\n");
1293
+
1294
+ msgs->flags |= req->flags;
1295
+ msgs->poll_cnt++;
1296
+
1297
+ if (req->size && req->data) {
1298
+ if (!msgs->poll_req)
1299
+ msgs->poll_req = req;
1300
+ } else {
1301
+ msgs->poll_req = NULL;
1302
+ }
11851303 } break;
11861304 case MPP_CMD_RESET_SESSION: {
11871305 int ret;
....@@ -1197,7 +1315,7 @@
11971315 if (!mpp)
11981316 return -EINVAL;
11991317
1200
- mpp_session_clear(mpp, session);
1318
+ mpp_session_clear_pending(session);
12011319 mpp_iommu_down_write(mpp->iommu_info);
12021320 ret = mpp_dma_session_destroy(session->dma);
12031321 mpp_iommu_up_write(mpp->iommu_info);
....@@ -1271,7 +1389,7 @@
12711389 default: {
12721390 mpp = session->mpp;
12731391 if (!mpp) {
1274
- mpp_err("pid %d not find clinet %d\n",
1392
+ mpp_err("pid %d not find client %d\n",
12751393 session->pid, session->device_type);
12761394 return -EINVAL;
12771395 }
....@@ -1285,17 +1403,228 @@
12851403 return 0;
12861404 }
12871405
1288
-static long mpp_dev_ioctl(struct file *filp,
1289
- unsigned int cmd,
1290
- unsigned long arg)
1406
+static void task_msgs_add(struct mpp_task_msgs *msgs, struct list_head *head)
12911407 {
1408
+ struct mpp_session *session = msgs->session;
12921409 int ret = 0;
1293
- struct mpp_service *srv;
1294
- void __user *msg;
1410
+
1411
+ /* process each task */
1412
+ if (msgs->set_cnt) {
1413
+ /* NOTE: update msg_flags for fd over 1024 */
1414
+ session->msg_flags = msgs->flags;
1415
+ ret = mpp_process_task(session, msgs);
1416
+ }
1417
+
1418
+ if (!ret) {
1419
+ INIT_LIST_HEAD(&msgs->list);
1420
+ list_add_tail(&msgs->list, head);
1421
+ } else {
1422
+ put_task_msgs(msgs);
1423
+ }
1424
+}
1425
+
1426
+static int mpp_collect_msgs(struct list_head *head, struct mpp_session *session,
1427
+ unsigned int cmd, void __user *msg)
1428
+{
1429
+ struct mpp_msg_v1 msg_v1;
12951430 struct mpp_request *req;
1296
- struct mpp_task_msgs task_msgs;
1297
- struct mpp_session *session =
1298
- (struct mpp_session *)filp->private_data;
1431
+ struct mpp_task_msgs *msgs = NULL;
1432
+ int last = 1;
1433
+ int ret;
1434
+
1435
+ if (cmd != MPP_IOC_CFG_V1) {
1436
+ mpp_err("unknown ioctl cmd %x\n", cmd);
1437
+ return -EINVAL;
1438
+ }
1439
+
1440
+next:
1441
+ /* first, parse to fixed struct */
1442
+ if (copy_from_user(&msg_v1, msg, sizeof(msg_v1)))
1443
+ return -EFAULT;
1444
+
1445
+ msg += sizeof(msg_v1);
1446
+
1447
+ mpp_debug(DEBUG_IOCTL, "cmd %x collect flags %08x, size %d, offset %x\n",
1448
+ msg_v1.cmd, msg_v1.flags, msg_v1.size, msg_v1.offset);
1449
+
1450
+ if (mpp_check_cmd_v1(msg_v1.cmd)) {
1451
+ mpp_err("mpp cmd %x is not supported.\n", msg_v1.cmd);
1452
+ return -EFAULT;
1453
+ }
1454
+
1455
+ if (msg_v1.flags & MPP_FLAGS_MULTI_MSG)
1456
+ last = (msg_v1.flags & MPP_FLAGS_LAST_MSG) ? 1 : 0;
1457
+ else
1458
+ last = 1;
1459
+
1460
+ /* check cmd for change msgs session */
1461
+ if (msg_v1.cmd == MPP_CMD_SET_SESSION_FD) {
1462
+ struct mpp_bat_msg bat_msg;
1463
+ struct mpp_bat_msg __user *usr_cmd;
1464
+ struct fd f;
1465
+
1466
+ /* try session switch here */
1467
+ usr_cmd = (struct mpp_bat_msg __user *)(unsigned long)msg_v1.data_ptr;
1468
+
1469
+ if (copy_from_user(&bat_msg, usr_cmd, sizeof(bat_msg)))
1470
+ return -EFAULT;
1471
+
1472
+ /* skip finished message */
1473
+ if (bat_msg.flag & MPP_BAT_MSG_DONE)
1474
+ goto session_switch_done;
1475
+
1476
+ f = fdget(bat_msg.fd);
1477
+ if (!f.file) {
1478
+ int ret = -EBADF;
1479
+
1480
+ mpp_err("fd %d get session failed\n", bat_msg.fd);
1481
+
1482
+ if (copy_to_user(&usr_cmd->ret, &ret, sizeof(usr_cmd->ret)))
1483
+ mpp_err("copy_to_user failed.\n");
1484
+ goto session_switch_done;
1485
+ }
1486
+
1487
+ /* NOTE: add previous ready task to queue and drop empty task */
1488
+ if (msgs) {
1489
+ if (msgs->req_cnt)
1490
+ task_msgs_add(msgs, head);
1491
+ else
1492
+ put_task_msgs(msgs);
1493
+
1494
+ msgs = NULL;
1495
+ }
1496
+
1497
+ /* switch session */
1498
+ session = f.file->private_data;
1499
+ msgs = get_task_msgs(session);
1500
+
1501
+ if (f.file->private_data == session)
1502
+ msgs->ext_fd = bat_msg.fd;
1503
+
1504
+ msgs->f = f;
1505
+
1506
+ mpp_debug(DEBUG_IOCTL, "fd %d, session %d msg_cnt %d\n",
1507
+ bat_msg.fd, session->index, session->msgs_cnt);
1508
+
1509
+session_switch_done:
1510
+ /* session id should NOT be the last message */
1511
+ if (last)
1512
+ return 0;
1513
+
1514
+ goto next;
1515
+ }
1516
+
1517
+ if (!msgs)
1518
+ msgs = get_task_msgs(session);
1519
+
1520
+ if (!msgs) {
1521
+ pr_err("session %d:%d failed to get task msgs",
1522
+ session->pid, session->index);
1523
+ return -EINVAL;
1524
+ }
1525
+
1526
+ if (msgs->req_cnt >= MPP_MAX_MSG_NUM) {
1527
+ mpp_err("session %d message count %d more than %d.\n",
1528
+ session->index, msgs->req_cnt, MPP_MAX_MSG_NUM);
1529
+ return -EINVAL;
1530
+ }
1531
+
1532
+ req = &msgs->reqs[msgs->req_cnt++];
1533
+ req->cmd = msg_v1.cmd;
1534
+ req->flags = msg_v1.flags;
1535
+ req->size = msg_v1.size;
1536
+ req->offset = msg_v1.offset;
1537
+ req->data = (void __user *)(unsigned long)msg_v1.data_ptr;
1538
+
1539
+ ret = mpp_process_request(session, session->srv, req, msgs);
1540
+ if (ret) {
1541
+ mpp_err("session %d process cmd %x ret %d\n",
1542
+ session->index, req->cmd, ret);
1543
+ return ret;
1544
+ }
1545
+
1546
+ if (!last)
1547
+ goto next;
1548
+
1549
+ task_msgs_add(msgs, head);
1550
+ msgs = NULL;
1551
+
1552
+ return 0;
1553
+}
1554
+
1555
+static void mpp_msgs_trigger(struct list_head *msgs_list)
1556
+{
1557
+ struct mpp_task_msgs *msgs, *n;
1558
+ struct mpp_dev *mpp_prev = NULL;
1559
+ struct mpp_taskqueue *queue_prev = NULL;
1560
+
1561
+ /* push task to queue */
1562
+ list_for_each_entry_safe(msgs, n, msgs_list, list) {
1563
+ struct mpp_dev *mpp;
1564
+ struct mpp_task *task;
1565
+ struct mpp_taskqueue *queue;
1566
+
1567
+ if (!msgs->set_cnt || !msgs->queue)
1568
+ continue;
1569
+
1570
+ mpp = msgs->mpp;
1571
+ task = msgs->task;
1572
+ queue = msgs->queue;
1573
+
1574
+ if (queue_prev != queue) {
1575
+ if (queue_prev && mpp_prev) {
1576
+ mutex_unlock(&queue_prev->pending_lock);
1577
+ mpp_taskqueue_trigger_work(mpp_prev);
1578
+ }
1579
+
1580
+ if (queue)
1581
+ mutex_lock(&queue->pending_lock);
1582
+
1583
+ mpp_prev = mpp;
1584
+ queue_prev = queue;
1585
+ }
1586
+
1587
+ if (test_bit(TASK_STATE_ABORT, &task->state))
1588
+ pr_info("try to trigger abort task %d\n", task->task_id);
1589
+
1590
+ set_bit(TASK_STATE_PENDING, &task->state);
1591
+ list_add_tail(&task->queue_link, &queue->pending_list);
1592
+ }
1593
+
1594
+ if (mpp_prev && queue_prev) {
1595
+ mutex_unlock(&queue_prev->pending_lock);
1596
+ mpp_taskqueue_trigger_work(mpp_prev);
1597
+ }
1598
+}
1599
+
1600
+static void mpp_msgs_wait(struct list_head *msgs_list)
1601
+{
1602
+ struct mpp_task_msgs *msgs, *n;
1603
+
1604
+ /* poll and release each task */
1605
+ list_for_each_entry_safe(msgs, n, msgs_list, list) {
1606
+ struct mpp_session *session = msgs->session;
1607
+
1608
+ if (msgs->poll_cnt) {
1609
+ int ret = mpp_wait_result(session, msgs);
1610
+
1611
+ if (ret) {
1612
+ mpp_err("session %d wait result ret %d\n",
1613
+ session->index, ret);
1614
+ }
1615
+ }
1616
+
1617
+ put_task_msgs(msgs);
1618
+
1619
+ }
1620
+}
1621
+
1622
+static long mpp_dev_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
1623
+{
1624
+ struct mpp_service *srv;
1625
+ struct mpp_session *session = (struct mpp_session *)filp->private_data;
1626
+ struct list_head msgs_list;
1627
+ int ret = 0;
12991628
13001629 mpp_debug_enter();
13011630
....@@ -1303,7 +1632,9 @@
13031632 mpp_err("session %p\n", session);
13041633 return -EINVAL;
13051634 }
1635
+
13061636 srv = session->srv;
1637
+
13071638 if (atomic_read(&session->release_request) > 0) {
13081639 mpp_debug(DEBUG_IOCTL, "release session had request\n");
13091640 return -EBUSY;
....@@ -1313,54 +1644,15 @@
13131644 return -EBUSY;
13141645 }
13151646
1316
- msg = (void __user *)arg;
1317
- memset(&task_msgs, 0, sizeof(task_msgs));
1318
- do {
1319
- req = &task_msgs.reqs[task_msgs.req_cnt];
1320
- /* first, parse to fixed struct */
1321
- switch (cmd) {
1322
- case MPP_IOC_CFG_V1: {
1323
- struct mpp_msg_v1 msg_v1;
1647
+ INIT_LIST_HEAD(&msgs_list);
13241648
1325
- memset(&msg_v1, 0, sizeof(msg_v1));
1326
- if (copy_from_user(&msg_v1, msg, sizeof(msg_v1)))
1327
- return -EFAULT;
1328
- ret = mpp_parse_msg_v1(&msg_v1, req);
1329
- if (ret)
1330
- return -EFAULT;
1649
+ ret = mpp_collect_msgs(&msgs_list, session, cmd, (void __user *)arg);
1650
+ if (ret)
1651
+ mpp_err("collect msgs failed %d\n", ret);
13311652
1332
- msg += sizeof(msg_v1);
1333
- } break;
1334
- default:
1335
- mpp_err("unknown ioctl cmd %x\n", cmd);
1336
- return -EINVAL;
1337
- }
1338
- task_msgs.req_cnt++;
1339
- /* check loop times */
1340
- if (task_msgs.req_cnt > MPP_MAX_MSG_NUM) {
1341
- mpp_err("fail, message count %d more than %d.\n",
1342
- task_msgs.req_cnt, MPP_MAX_MSG_NUM);
1343
- return -EINVAL;
1344
- }
1345
- /* second, process request */
1346
- ret = mpp_process_request(session, srv, req, &task_msgs);
1347
- if (ret)
1348
- return -EFAULT;
1349
- /* last, process task message */
1350
- if (mpp_msg_is_last(req)) {
1351
- session->msg_flags = task_msgs.flags;
1352
- if (task_msgs.set_cnt > 0) {
1353
- ret = mpp_process_task(session, &task_msgs);
1354
- if (ret)
1355
- return ret;
1356
- }
1357
- if (task_msgs.poll_cnt > 0) {
1358
- ret = mpp_wait_result(session, &task_msgs);
1359
- if (ret)
1360
- return ret;
1361
- }
1362
- }
1363
- } while (!mpp_msg_is_last(req));
1653
+ mpp_msgs_trigger(&msgs_list);
1654
+
1655
+ mpp_msgs_wait(&msgs_list);
13641656
13651657 mpp_debug_leave();
13661658
....@@ -1410,7 +1702,7 @@
14101702 /* wait for task all done */
14111703 atomic_inc(&session->release_request);
14121704
1413
- if (session->mpp)
1705
+ if (session->mpp || atomic_read(&session->task_count))
14141706 mpp_session_detach_workqueue(session);
14151707 else
14161708 mpp_session_deinit(session);
....@@ -1421,24 +1713,9 @@
14211713 return 0;
14221714 }
14231715
1424
-static unsigned int
1425
-mpp_dev_poll(struct file *filp, poll_table *wait)
1426
-{
1427
- unsigned int mask = 0;
1428
- struct mpp_session *session =
1429
- (struct mpp_session *)filp->private_data;
1430
-
1431
- poll_wait(filp, &session->wait, wait);
1432
- if (!list_empty(&session->done_list))
1433
- mask |= POLLIN | POLLRDNORM;
1434
-
1435
- return mask;
1436
-}
1437
-
14381716 const struct file_operations rockchip_mpp_fops = {
14391717 .open = mpp_dev_open,
14401718 .release = mpp_dev_release,
1441
- .poll = mpp_dev_poll,
14421719 .unlocked_ioctl = mpp_dev_ioctl,
14431720 #ifdef CONFIG_COMPAT
14441721 .compat_ioctl = mpp_dev_ioctl,
....@@ -1479,9 +1756,9 @@
14791756 mpp_iommu_down_read(mpp->iommu_info);
14801757 buffer = mpp_dma_import_fd(mpp->iommu_info, dma, fd);
14811758 mpp_iommu_up_read(mpp->iommu_info);
1482
- if (IS_ERR_OR_NULL(buffer)) {
1759
+ if (IS_ERR(buffer)) {
14831760 mpp_err("can't import dma-buf %d\n", fd);
1484
- return ERR_PTR(-ENOMEM);
1761
+ return ERR_CAST(buffer);
14851762 }
14861763
14871764 mem_region->hdl = buffer;
....@@ -1511,7 +1788,7 @@
15111788 cnt = session->trans_count;
15121789 tbl = session->trans_table;
15131790 } else {
1514
- struct mpp_dev *mpp = session->mpp;
1791
+ struct mpp_dev *mpp = mpp_get_task_used_device(task, session);
15151792 struct mpp_trans_info *trans_info = mpp->var->trans_info;
15161793
15171794 cnt = trans_info[fmt].count;
....@@ -1647,8 +1924,7 @@
16471924 return 0;
16481925 }
16491926
1650
-int mpp_task_init(struct mpp_session *session,
1651
- struct mpp_task *task)
1927
+int mpp_task_init(struct mpp_session *session, struct mpp_task *task)
16521928 {
16531929 INIT_LIST_HEAD(&task->pending_link);
16541930 INIT_LIST_HEAD(&task->queue_link);
....@@ -1663,7 +1939,7 @@
16631939 int mpp_task_finish(struct mpp_session *session,
16641940 struct mpp_task *task)
16651941 {
1666
- struct mpp_dev *mpp = session->mpp;
1942
+ struct mpp_dev *mpp = mpp_get_task_used_device(task, session);
16671943
16681944 if (mpp->dev_ops->finish)
16691945 mpp->dev_ops->finish(mpp, task);
....@@ -1673,12 +1949,23 @@
16731949 mpp_dev_reset(mpp);
16741950 mpp_power_off(mpp);
16751951
1676
- if (!atomic_read(&task->abort_request)) {
1677
- mpp_session_push_done(session, task);
1678
- /* Wake up the GET thread */
1679
- wake_up(&session->wait);
1680
- }
16811952 set_bit(TASK_STATE_FINISH, &task->state);
1953
+ set_bit(TASK_STATE_DONE, &task->state);
1954
+
1955
+ if (session->srv->timing_en) {
1956
+ s64 time_diff;
1957
+
1958
+ task->on_finish = ktime_get();
1959
+ set_bit(TASK_TIMING_FINISH, &task->state);
1960
+
1961
+ time_diff = ktime_us_delta(task->on_finish, task->on_create);
1962
+
1963
+ if (mpp->timing_check && time_diff > (s64)mpp->timing_check)
1964
+ mpp_task_dump_timing(task, time_diff);
1965
+ }
1966
+
1967
+ /* Wake up the GET thread */
1968
+ wake_up(&task->wait);
16821969 mpp_taskqueue_pop_running(mpp->queue, task);
16831970
16841971 return 0;
....@@ -1688,7 +1975,7 @@
16881975 struct mpp_task *task)
16891976 {
16901977 struct mpp_mem_region *mem_region = NULL, *n;
1691
- struct mpp_dev *mpp = session->mpp;
1978
+ struct mpp_dev *mpp = mpp_get_task_used_device(task, session);
16921979
16931980 /* release memory region attach to this registers table. */
16941981 list_for_each_entry_safe(mem_region, n,
....@@ -1713,7 +2000,7 @@
17132000 if (!task)
17142001 return -EIO;
17152002
1716
- mpp_err("--- dump mem region ---\n");
2003
+ mpp_err("--- dump task %d mem region ---\n", task->task_index);
17172004 if (!list_empty(&task->mem_region_list)) {
17182005 list_for_each_entry_safe(mem, n,
17192006 &task->mem_region_list,
....@@ -1753,54 +2040,41 @@
17532040 return 0;
17542041 }
17552042
1756
-int mpp_task_dump_hw_reg(struct mpp_dev *mpp, struct mpp_task *task)
2043
+int mpp_task_dump_hw_reg(struct mpp_dev *mpp)
17572044 {
1758
- if (!task)
1759
- return -EIO;
2045
+ u32 i;
2046
+ u32 s = mpp->var->hw_info->reg_start;
2047
+ u32 e = mpp->var->hw_info->reg_end;
17602048
1761
- if (mpp_debug_unlikely(DEBUG_DUMP_ERR_REG)) {
1762
- u32 i;
1763
- u32 s = task->hw_info->reg_start;
1764
- u32 e = task->hw_info->reg_end;
2049
+ mpp_err("--- dump hardware register ---\n");
2050
+ for (i = s; i <= e; i++) {
2051
+ u32 reg = i * sizeof(u32);
17652052
1766
- mpp_err("--- dump hardware register ---\n");
1767
- for (i = s; i <= e; i++) {
1768
- u32 reg = i * sizeof(u32);
1769
-
1770
- mpp_err("reg[%03d]: %04x: 0x%08x\n",
2053
+ mpp_err("reg[%03d]: %04x: 0x%08x\n",
17712054 i, reg, readl_relaxed(mpp->reg_base + reg));
1772
- }
17732055 }
17742056
17752057 return 0;
17762058 }
17772059
1778
-static int mpp_iommu_handle(struct iommu_domain *iommu,
1779
- struct device *iommu_dev,
1780
- unsigned long iova,
1781
- int status, void *arg)
2060
+void mpp_reg_show(struct mpp_dev *mpp, u32 offset)
17822061 {
1783
- struct mpp_taskqueue *queue = (struct mpp_taskqueue *)arg;
1784
- struct mpp_task *task = mpp_taskqueue_get_running_task(queue);
1785
- struct mpp_dev *mpp;
2062
+ if (!mpp)
2063
+ return;
17862064
1787
- /*
1788
- * NOTE: In link mode, this task may not be the task of the current
1789
- * hardware processing error
1790
- */
1791
- if (!task || !task->session)
1792
- return -EIO;
1793
- /* get mpp from cur task */
1794
- mpp = task->session->mpp;
1795
- dev_err(mpp->dev, "fault addr 0x%08lx status %x\n", iova, status);
2065
+ dev_err(mpp->dev, "reg[%03d]: %04x: 0x%08x\n",
2066
+ offset >> 2, offset, mpp_read_relaxed(mpp, offset));
2067
+}
17962068
1797
- mpp_task_dump_mem_region(mpp, task);
1798
- mpp_task_dump_hw_reg(mpp, task);
2069
+void mpp_reg_show_range(struct mpp_dev *mpp, u32 start, u32 end)
2070
+{
2071
+ u32 offset;
17992072
1800
- if (mpp->iommu_info->hdl)
1801
- mpp->iommu_info->hdl(iommu, iommu_dev, iova, status, arg);
2073
+ if (!mpp)
2074
+ return;
18022075
1803
- return 0;
2076
+ for (offset = start; offset < end; offset += sizeof(u32))
2077
+ mpp_reg_show(mpp, offset);
18042078 }
18052079
18062080 /* The device will do more probing work after this */
....@@ -1815,6 +2089,18 @@
18152089
18162090 /* Get disable auto frequent flag from dtsi */
18172091 mpp->auto_freq_en = !device_property_read_bool(dev, "rockchip,disable-auto-freq");
2092
+ /* read flag for pum idle request */
2093
+ mpp->skip_idle = device_property_read_bool(dev, "rockchip,skip-pmu-idle-request");
2094
+
2095
+ /* read link table capacity */
2096
+ ret = of_property_read_u32(np, "rockchip,task-capacity",
2097
+ &mpp->task_capacity);
2098
+ if (ret)
2099
+ mpp->task_capacity = 1;
2100
+
2101
+ mpp->dev = dev;
2102
+ mpp->hw_ops = mpp->var->hw_ops;
2103
+ mpp->dev_ops = mpp->var->dev_ops;
18182104
18192105 /* Get and attach to service */
18202106 ret = mpp_attach_service(mpp, dev);
....@@ -1823,24 +2109,9 @@
18232109 return -ENODEV;
18242110 }
18252111
1826
- mpp->dev = dev;
1827
- mpp->hw_ops = mpp->var->hw_ops;
1828
- mpp->dev_ops = mpp->var->dev_ops;
1829
-
1830
- /* read link table capacity */
1831
- ret = of_property_read_u32(np, "rockchip,task-capacity",
1832
- &mpp->task_capacity);
1833
- if (ret) {
1834
- mpp->task_capacity = 1;
1835
-
1836
- /* power domain autosuspend delay 2s */
1837
- pm_runtime_set_autosuspend_delay(dev, 2000);
1838
- pm_runtime_use_autosuspend(dev);
1839
- } else {
1840
- dev_info(dev, "%d task capacity link mode detected\n",
1841
- mpp->task_capacity);
1842
- /* do not setup autosuspend on multi task device */
1843
- }
2112
+ /* power domain autosuspend delay 2s */
2113
+ pm_runtime_set_autosuspend_delay(dev, 2000);
2114
+ pm_runtime_use_autosuspend(dev);
18442115
18452116 kthread_init_work(&mpp->work, mpp_task_worker_default);
18462117
....@@ -1851,7 +2122,6 @@
18512122
18522123 device_init_wakeup(dev, true);
18532124 pm_runtime_enable(dev);
1854
-
18552125 mpp->irq = platform_get_irq(pdev, 0);
18562126 if (mpp->irq < 0) {
18572127 dev_err(dev, "No interrupt resource found\n");
....@@ -1878,42 +2148,36 @@
18782148 ret = -ENOMEM;
18792149 goto failed;
18802150 }
2151
+ mpp->io_base = res->start;
18812152
1882
- pm_runtime_get_sync(dev);
18832153 /*
18842154 * TODO: here or at the device itself, some device does not
18852155 * have the iommu, maybe in the device is better.
18862156 */
18872157 mpp->iommu_info = mpp_iommu_probe(dev);
18882158 if (IS_ERR(mpp->iommu_info)) {
1889
- dev_err(dev, "failed to attach iommu: %ld\n",
1890
- PTR_ERR(mpp->iommu_info));
2159
+ dev_err(dev, "failed to attach iommu\n");
2160
+ mpp->iommu_info = NULL;
18912161 }
18922162 if (mpp->hw_ops->init) {
18932163 ret = mpp->hw_ops->init(mpp);
18942164 if (ret)
1895
- goto failed_init;
2165
+ goto failed;
18962166 }
1897
- /* set iommu fault handler */
1898
- if (!IS_ERR(mpp->iommu_info))
1899
- iommu_set_fault_handler(mpp->iommu_info->domain,
1900
- mpp_iommu_handle, mpp->queue);
19012167
19022168 /* read hardware id */
19032169 if (hw_info->reg_id >= 0) {
2170
+ pm_runtime_get_sync(dev);
19042171 if (mpp->hw_ops->clk_on)
19052172 mpp->hw_ops->clk_on(mpp);
19062173
19072174 hw_info->hw_id = mpp_read(mpp, hw_info->reg_id * sizeof(u32));
19082175 if (mpp->hw_ops->clk_off)
19092176 mpp->hw_ops->clk_off(mpp);
2177
+ pm_runtime_put_sync(dev);
19102178 }
19112179
1912
- pm_runtime_put_sync(dev);
1913
-
19142180 return ret;
1915
-failed_init:
1916
- pm_runtime_put_sync(dev);
19172181 failed:
19182182 mpp_detach_workqueue(mpp);
19192183 device_init_wakeup(dev, false);
....@@ -1928,12 +2192,31 @@
19282192 mpp->hw_ops->exit(mpp);
19292193
19302194 mpp_iommu_remove(mpp->iommu_info);
1931
- platform_device_put(mpp->pdev_srv);
19322195 mpp_detach_workqueue(mpp);
19332196 device_init_wakeup(mpp->dev, false);
19342197 pm_runtime_disable(mpp->dev);
19352198
19362199 return 0;
2200
+}
2201
+
2202
+void mpp_dev_shutdown(struct platform_device *pdev)
2203
+{
2204
+ int ret;
2205
+ int val;
2206
+ struct device *dev = &pdev->dev;
2207
+ struct mpp_dev *mpp = dev_get_drvdata(dev);
2208
+
2209
+ dev_info(dev, "shutdown device\n");
2210
+
2211
+ atomic_inc(&mpp->srv->shutdown_request);
2212
+ ret = readx_poll_timeout(atomic_read,
2213
+ &mpp->task_count,
2214
+ val, val == 0, 20000, 200000);
2215
+ if (ret == -ETIMEDOUT)
2216
+ dev_err(dev, "wait total %d running time out\n",
2217
+ atomic_read(&mpp->task_count));
2218
+ else
2219
+ dev_info(dev, "shutdown success\n");
19372220 }
19382221
19392222 int mpp_dev_register_srv(struct mpp_dev *mpp, struct mpp_service *srv)
....@@ -1951,12 +2234,18 @@
19512234 struct mpp_dev *mpp = param;
19522235 struct mpp_task *task = mpp->cur_task;
19532236 irqreturn_t irq_ret = IRQ_NONE;
2237
+ u32 timing_en = mpp->srv->timing_en;
2238
+
2239
+ if (task && timing_en) {
2240
+ task->on_irq = ktime_get();
2241
+ set_bit(TASK_TIMING_IRQ, &task->state);
2242
+ }
19542243
19552244 if (mpp->dev_ops->irq)
19562245 irq_ret = mpp->dev_ops->irq(mpp);
19572246
19582247 if (task) {
1959
- if (irq_ret != IRQ_NONE) {
2248
+ if (irq_ret == IRQ_WAKE_THREAD) {
19602249 /* if wait or delayed work timeout, abort request will turn on,
19612250 * isr should not to response, and handle it in delayed work
19622251 */
....@@ -1966,10 +2255,17 @@
19662255 irq_ret = IRQ_HANDLED;
19672256 goto done;
19682257 }
2258
+ if (timing_en) {
2259
+ task->on_cancel_timeout = ktime_get();
2260
+ set_bit(TASK_TIMING_TO_CANCEL, &task->state);
2261
+ }
19692262 cancel_delayed_work(&task->timeout_work);
19702263 /* normal condition, set state and wake up isr thread */
19712264 set_bit(TASK_STATE_IRQ, &task->state);
19722265 }
2266
+
2267
+ if (irq_ret == IRQ_WAKE_THREAD)
2268
+ mpp_iommu_dev_deactivate(mpp->iommu_info, mpp);
19732269 } else {
19742270 mpp_debug(DEBUG_IRQ_CHECK, "error, task is null\n");
19752271 }
....@@ -1981,6 +2277,12 @@
19812277 {
19822278 irqreturn_t ret = IRQ_NONE;
19832279 struct mpp_dev *mpp = param;
2280
+ struct mpp_task *task = mpp->cur_task;
2281
+
2282
+ if (task && mpp->srv->timing_en) {
2283
+ task->on_isr = ktime_get();
2284
+ set_bit(TASK_TIMING_ISR, &task->state);
2285
+ }
19842286
19852287 if (mpp->auto_freq_en &&
19862288 mpp->hw_ops->reduce_freq &&
....@@ -2030,24 +2332,92 @@
20302332
20312333 int mpp_time_record(struct mpp_task *task)
20322334 {
2033
- if (mpp_debug_unlikely(DEBUG_TIMING) && task)
2034
- do_gettimeofday(&task->start);
2335
+ if (mpp_debug_unlikely(DEBUG_TIMING) && task) {
2336
+ task->start = ktime_get();
2337
+ task->part = task->start;
2338
+ }
2339
+
2340
+ return 0;
2341
+}
2342
+
2343
+int mpp_time_part_diff(struct mpp_task *task)
2344
+{
2345
+ if (mpp_debug_unlikely(DEBUG_TIMING)) {
2346
+ ktime_t end;
2347
+ struct mpp_dev *mpp = mpp_get_task_used_device(task, task->session);
2348
+
2349
+ end = ktime_get();
2350
+ mpp_debug(DEBUG_PART_TIMING, "%s:%d session %d:%d part time: %lld us\n",
2351
+ dev_name(mpp->dev), task->core_id, task->session->pid,
2352
+ task->session->index, ktime_us_delta(end, task->part));
2353
+ task->part = end;
2354
+ }
20352355
20362356 return 0;
20372357 }
20382358
20392359 int mpp_time_diff(struct mpp_task *task)
20402360 {
2041
- struct timeval end;
2042
- struct mpp_dev *mpp = task->session->mpp;
2361
+ if (mpp_debug_unlikely(DEBUG_TIMING)) {
2362
+ ktime_t end;
2363
+ struct mpp_dev *mpp = mpp_get_task_used_device(task, task->session);
20432364
2044
- do_gettimeofday(&end);
2045
- mpp_debug(DEBUG_TIMING, "%s: pid: %d, session: %p, time: %ld us\n",
2046
- dev_name(mpp->dev), task->session->pid, task->session,
2047
- (end.tv_sec - task->start.tv_sec) * 1000000 +
2048
- (end.tv_usec - task->start.tv_usec));
2365
+ end = ktime_get();
2366
+ mpp_debug(DEBUG_TIMING, "%s:%d session %d:%d time: %lld us\n",
2367
+ dev_name(mpp->dev), task->core_id, task->session->pid,
2368
+ task->session->index, ktime_us_delta(end, task->start));
2369
+ }
20492370
20502371 return 0;
2372
+}
2373
+
2374
+int mpp_time_diff_with_hw_time(struct mpp_task *task, u32 clk_hz)
2375
+{
2376
+ if (mpp_debug_unlikely(DEBUG_TIMING)) {
2377
+ ktime_t end;
2378
+ struct mpp_dev *mpp = mpp_get_task_used_device(task, task->session);
2379
+
2380
+ end = ktime_get();
2381
+
2382
+ if (clk_hz)
2383
+ mpp_debug(DEBUG_TIMING, "%s:%d session %d:%d time: %lld us hw %d us\n",
2384
+ dev_name(mpp->dev), task->core_id, task->session->pid,
2385
+ task->session->index, ktime_us_delta(end, task->start),
2386
+ task->hw_cycles / (clk_hz / 1000000));
2387
+ else
2388
+ mpp_debug(DEBUG_TIMING, "%s:%d session %d:%d time: %lld us\n",
2389
+ dev_name(mpp->dev), task->core_id, task->session->pid,
2390
+ task->session->index, ktime_us_delta(end, task->start));
2391
+ }
2392
+
2393
+ return 0;
2394
+}
2395
+
2396
+#define LOG_TIMING(state, id, stage, time, base) \
2397
+ do { \
2398
+ if (test_bit(id, &state)) \
2399
+ pr_info("timing: %-14s : %lld us\n", stage, ktime_us_delta(time, base)); \
2400
+ else \
2401
+ pr_info("timing: %-14s : invalid\n", stage); \
2402
+ } while (0)
2403
+
2404
+void mpp_task_dump_timing(struct mpp_task *task, s64 time_diff)
2405
+{
2406
+ ktime_t s = task->on_create;
2407
+ unsigned long state = task->state;
2408
+
2409
+ pr_info("task %d dump timing at %lld us:", task->task_id, time_diff);
2410
+
2411
+ pr_info("timing: %-14s : %lld us\n", "create", ktime_to_us(s));
2412
+ LOG_TIMING(state, TASK_TIMING_CREATE_END, "create end", task->on_create_end, s);
2413
+ LOG_TIMING(state, TASK_TIMING_PENDING, "pending", task->on_pending, s);
2414
+ LOG_TIMING(state, TASK_TIMING_RUN, "run", task->on_run, s);
2415
+ LOG_TIMING(state, TASK_TIMING_TO_SCHED, "timeout start", task->on_sched_timeout, s);
2416
+ LOG_TIMING(state, TASK_TIMING_RUN_END, "run end", task->on_run_end, s);
2417
+ LOG_TIMING(state, TASK_TIMING_IRQ, "irq", task->on_irq, s);
2418
+ LOG_TIMING(state, TASK_TIMING_TO_CANCEL, "timeout cancel", task->on_cancel_timeout, s);
2419
+ LOG_TIMING(state, TASK_TIMING_ISR, "isr", task->on_isr, s);
2420
+ LOG_TIMING(state, TASK_TIMING_FINISH, "finish", task->on_finish, s);
20512421 }
20522422
20532423 int mpp_write_req(struct mpp_dev *mpp, u32 *regs,
....@@ -2184,6 +2554,7 @@
21842554 if (clk_rate_hz) {
21852555 clk_info->used_rate_hz = clk_rate_hz;
21862556 clk_set_rate(clk_info->clk, clk_rate_hz);
2557
+ clk_info->real_rate_hz = clk_get_rate(clk_info->clk);
21872558 }
21882559
21892560 return 0;
....@@ -2217,11 +2588,11 @@
22172588 return count;
22182589 }
22192590
2220
-static const struct file_operations procfs_fops_u32 = {
2221
- .open = fops_open_u32,
2222
- .read = seq_read,
2223
- .release = single_release,
2224
- .write = fops_write_u32,
2591
+static const struct proc_ops procfs_fops_u32 = {
2592
+ .proc_open = fops_open_u32,
2593
+ .proc_read = seq_read,
2594
+ .proc_release = single_release,
2595
+ .proc_write = fops_write_u32,
22252596 };
22262597
22272598 struct proc_dir_entry *
....@@ -2230,4 +2601,10 @@
22302601 {
22312602 return proc_create_data(name, mode, parent, &procfs_fops_u32, data);
22322603 }
2604
+
2605
+void mpp_procfs_create_common(struct proc_dir_entry *parent, struct mpp_dev *mpp)
2606
+{
2607
+ mpp_procfs_create_u32("disable_work", 0644, parent, &mpp->disable);
2608
+ mpp_procfs_create_u32("timing_check", 0644, parent, &mpp->timing_check);
2609
+}
22332610 #endif