Lines Matching full:task
105 struct mpp_task *task) in mpp_taskqueue_pop_pending() argument
107 if (!task->session || !task->session->mpp) in mpp_taskqueue_pop_pending()
111 list_del_init(&task->queue_link); in mpp_taskqueue_pop_pending()
113 kref_put(&task->ref, mpp_free_task); in mpp_taskqueue_pop_pending()
121 struct mpp_task *task = NULL; in mpp_taskqueue_get_pending_task() local
124 task = list_first_entry_or_null(&queue->pending_list, in mpp_taskqueue_get_pending_task()
129 return task; in mpp_taskqueue_get_pending_task()
145 int mpp_taskqueue_pending_to_run(struct mpp_taskqueue *queue, struct mpp_task *task) in mpp_taskqueue_pending_to_run() argument
151 list_move_tail(&task->queue_link, &queue->running_list); in mpp_taskqueue_pending_to_run()
163 struct mpp_task *task = NULL; in mpp_taskqueue_get_running_task() local
166 task = list_first_entry_or_null(&queue->running_list, in mpp_taskqueue_get_running_task()
171 return task; in mpp_taskqueue_get_running_task()
176 struct mpp_task *task) in mpp_taskqueue_pop_running() argument
180 if (!task->session || !task->session->mpp) in mpp_taskqueue_pop_running()
184 list_del_init(&task->queue_link); in mpp_taskqueue_pop_running()
186 kref_put(&task->ref, mpp_free_task); in mpp_taskqueue_pop_running()
241 msgs->task = NULL; in task_msgs_init()
324 struct mpp_task *task = NULL, *n; in mpp_session_clear_pending() local
328 list_for_each_entry_safe(task, n, in mpp_session_clear_pending()
331 /* abort task in taskqueue */ in mpp_session_clear_pending()
332 atomic_inc(&task->abort_request); in mpp_session_clear_pending()
333 list_del_init(&task->pending_link); in mpp_session_clear_pending()
334 kref_put(&task->ref, mpp_free_task); in mpp_session_clear_pending()
358 mpp_dbg_session("session %d:%d task not finished %d\n", in mpp_session_cleanup_detach()
438 mpp_dbg_session("session %d:%d task %d deinit\n", session->pid, in mpp_session_deinit()
483 struct mpp_task *task) in mpp_session_push_pending() argument
485 kref_get(&task->ref); in mpp_session_push_pending()
488 task->on_pending = ktime_get(); in mpp_session_push_pending()
489 set_bit(TASK_TIMING_PENDING, &task->state); in mpp_session_push_pending()
491 list_add_tail(&task->pending_link, &session->pending_list); in mpp_session_push_pending()
499 struct mpp_task *task) in mpp_session_pop_pending() argument
502 list_del_init(&task->pending_link); in mpp_session_pop_pending()
504 kref_put(&task->ref, mpp_free_task); in mpp_session_pop_pending()
512 struct mpp_task *task = NULL; in mpp_session_get_pending_task() local
515 task = list_first_entry_or_null(&session->pending_list, in mpp_session_get_pending_task()
520 return task; in mpp_session_get_pending_task()
527 struct mpp_task *task = container_of(ref, struct mpp_task, ref); in mpp_free_task() local
529 if (!task->session) { in mpp_free_task()
530 mpp_err("task %p, task->session is null.\n", task); in mpp_free_task()
533 session = task->session; in mpp_free_task()
535 mpp_debug_func(DEBUG_TASK_INFO, "task %d:%d free state 0x%lx abort %d\n", in mpp_free_task()
536 session->index, task->task_id, task->state, in mpp_free_task()
537 atomic_read(&task->abort_request)); in mpp_free_task()
539 mpp = mpp_get_task_used_device(task, session); in mpp_free_task()
541 mpp->dev_ops->free_task(session, task); in mpp_free_task()
552 struct mpp_task *task = container_of(to_delayed_work(work_s), in mpp_task_timeout_work() local
556 if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) { in mpp_task_timeout_work()
557 mpp_err("task has been handled\n"); in mpp_task_timeout_work()
561 if (!task->session) { in mpp_task_timeout_work()
562 mpp_err("task %p, task->session is null.\n", task); in mpp_task_timeout_work()
566 session = task->session; in mpp_task_timeout_work()
567 mpp_err("task %d:%d:%d processing time out!\n", session->pid, in mpp_task_timeout_work()
568 session->index, task->task_id); in mpp_task_timeout_work()
576 mpp_task_dump_timing(task, ktime_us_delta(ktime_get(), task->on_create)); in mpp_task_timeout_work()
578 mpp = mpp_get_task_used_device(task, session); in mpp_task_timeout_work()
591 set_bit(TASK_STATE_TIMEOUT, &task->state); in mpp_task_timeout_work()
592 set_bit(TASK_STATE_DONE, &task->state); in mpp_task_timeout_work()
594 wake_up(&task->wait); in mpp_task_timeout_work()
596 /* remove task from taskqueue running list */ in mpp_task_timeout_work()
597 mpp_taskqueue_pop_running(mpp->queue, task); in mpp_task_timeout_work()
611 struct mpp_task *task = NULL; in mpp_process_task_default() local
627 task = mpp->dev_ops->alloc_task(session, msgs); in mpp_process_task_default()
628 if (!task) { in mpp_process_task_default()
634 task->on_create_end = ktime_get(); in mpp_process_task_default()
635 task->on_create = on_create; in mpp_process_task_default()
636 set_bit(TASK_TIMING_CREATE_END, &task->state); in mpp_process_task_default()
637 set_bit(TASK_TIMING_CREATE, &task->state); in mpp_process_task_default()
641 mpp = mpp_get_task_used_device(task, session); in mpp_process_task_default()
643 kref_init(&task->ref); in mpp_process_task_default()
644 init_waitqueue_head(&task->wait); in mpp_process_task_default()
645 atomic_set(&task->abort_request, 0); in mpp_process_task_default()
646 task->task_index = atomic_fetch_inc(&mpp->task_index); in mpp_process_task_default()
647 task->task_id = atomic_fetch_inc(&mpp->queue->task_id); in mpp_process_task_default()
648 INIT_DELAYED_WORK(&task->timeout_work, mpp_task_timeout_work); in mpp_process_task_default()
651 mpp->hw_ops->get_freq(mpp, task); in mpp_process_task_default()
654 msgs->task = task; in mpp_process_task_default()
658 * Push task to session should be in front of push task to queue. in mpp_process_task_default()
660 * task worker, it may be get a task who has push in queue but in mpp_process_task_default()
664 mpp_session_push_pending(session, task); in mpp_process_task_default()
675 pr_err("invalid NULL process task function\n"); in mpp_process_task()
767 void mpp_task_run_begin(struct mpp_task *task, u32 timing_en, u32 timeout) in mpp_task_run_begin() argument
771 set_bit(TASK_STATE_START, &task->state); in mpp_task_run_begin()
773 mpp_time_record(task); in mpp_task_run_begin()
774 schedule_delayed_work(&task->timeout_work, msecs_to_jiffies(timeout)); in mpp_task_run_begin()
777 task->on_sched_timeout = ktime_get(); in mpp_task_run_begin()
778 set_bit(TASK_TIMING_TO_SCHED, &task->state); in mpp_task_run_begin()
782 void mpp_task_run_end(struct mpp_task *task, u32 timing_en) in mpp_task_run_end() argument
785 task->on_run_end = ktime_get(); in mpp_task_run_end()
786 set_bit(TASK_TIMING_RUN_END, &task->state); in mpp_task_run_end()
797 struct mpp_task *task) in mpp_task_run() argument
806 task->on_run = ktime_get(); in mpp_task_run()
807 set_bit(TASK_TIMING_RUN, &task->state); in mpp_task_run()
835 task->session->pid, dev_name(mpp->dev)); in mpp_task_run()
838 mpp->hw_ops->set_freq(mpp, task); in mpp_task_run()
847 mpp->dev_ops->run(mpp, task); in mpp_task_run()
856 struct mpp_task *task; in mpp_task_worker_default() local
863 task = mpp_taskqueue_get_pending_task(queue); in mpp_task_worker_default()
864 if (!task) in mpp_task_worker_default()
867 /* if task timeout and aborted, remove it */ in mpp_task_worker_default()
868 if (atomic_read(&task->abort_request) > 0) { in mpp_task_worker_default()
869 mpp_taskqueue_pop_pending(queue, task); in mpp_task_worker_default()
873 /* get device for current task */ in mpp_task_worker_default()
874 mpp = task->session->mpp; in mpp_task_worker_default()
878 * will check whether I can insert a new task into device. in mpp_task_worker_default()
879 * If the device supports the task status query(like the HEVC in mpp_task_worker_default()
881 * If the device does not support multiple task or task status in mpp_task_worker_default()
885 task = mpp->dev_ops->prepare(mpp, task); in mpp_task_worker_default()
887 task = NULL; in mpp_task_worker_default()
890 * FIXME if the hardware supports task query, but we still need to lock in mpp_task_worker_default()
893 /* Push a pending task to running queue */ in mpp_task_worker_default()
894 if (task) { in mpp_task_worker_default()
895 struct mpp_dev *task_mpp = mpp_get_task_used_device(task, task->session); in mpp_task_worker_default()
898 mpp_taskqueue_pending_to_run(queue, task); in mpp_task_worker_default()
899 set_bit(TASK_STATE_RUNNING, &task->state); in mpp_task_worker_default()
900 if (mpp_task_run(task_mpp, task)) in mpp_task_worker_default()
901 mpp_taskqueue_pop_running(queue, task); in mpp_task_worker_default()
914 struct mpp_task *task; in mpp_wait_result_default() local
917 task = mpp_session_get_pending_task(session); in mpp_wait_result_default()
918 if (!task) { in mpp_wait_result_default()
923 mpp = mpp_get_task_used_device(task, session); in mpp_wait_result_default()
925 ret = wait_event_timeout(task->wait, in mpp_wait_result_default()
926 test_bit(TASK_STATE_DONE, &task->state), in mpp_wait_result_default()
930 ret = mpp->dev_ops->result(mpp, task, msgs); in mpp_wait_result_default()
932 atomic_inc(&task->abort_request); in mpp_wait_result_default()
933 set_bit(TASK_STATE_ABORT, &task->state); in mpp_wait_result_default()
936 atomic_read(&session->task_count), task, in mpp_wait_result_default()
937 task->task_id); in mpp_wait_result_default()
940 mpp_debug_func(DEBUG_TASK_INFO, "task %d kref_%d\n", in mpp_wait_result_default()
941 task->task_id, kref_read(&task->ref)); in mpp_wait_result_default()
943 mpp_session_pop_pending(session, task); in mpp_wait_result_default()
1041 /* default taskqueue has max 16 task capacity */ in mpp_taskqueue_init()
1333 mpp_err("wait task running time out\n"); in mpp_process_request()
1432 /* process each task */ in task_msgs_add()
1508 /* NOTE: add previous ready task to queue and drop empty task */ in mpp_collect_msgs()
1542 pr_err("session %d:%d failed to get task msgs", in mpp_collect_msgs()
1582 /* push task to queue */ in mpp_msgs_trigger()
1585 struct mpp_task *task; in mpp_msgs_trigger() local
1592 task = msgs->task; in mpp_msgs_trigger()
1608 if (test_bit(TASK_STATE_ABORT, &task->state)) in mpp_msgs_trigger()
1609 pr_info("try to trigger abort task %d\n", task->task_id); in mpp_msgs_trigger()
1611 set_bit(TASK_STATE_PENDING, &task->state); in mpp_msgs_trigger()
1612 list_add_tail(&task->queue_link, &queue->pending_list); in mpp_msgs_trigger()
1625 /* poll and release each task */ in mpp_msgs_wait()
1723 /* wait for task all done */ in mpp_dev_release()
1747 mpp_task_attach_fd(struct mpp_task *task, int fd) in mpp_task_attach_fd() argument
1751 struct mpp_dev *mpp = task->session->mpp; in mpp_task_attach_fd()
1752 struct mpp_dma_session *dma = task->session->dma; in mpp_task_attach_fd()
1753 u32 mem_num = ARRAY_SIZE(task->mem_regions); in mpp_task_attach_fd()
1759 if (task->mem_count > mem_num) { in mpp_task_attach_fd()
1760 mpp_err("mem_count %d must less than %d\n", task->mem_count, mem_num); in mpp_task_attach_fd()
1765 list_for_each_entry_safe_reverse(loop, n, &task->mem_region_list, reg_link) { in mpp_task_attach_fd()
1772 mem_region = &task->mem_regions[task->mem_count]; in mpp_task_attach_fd()
1791 task->mem_count++; in mpp_task_attach_fd()
1793 list_add_tail(&mem_region->reg_link, &task->mem_region_list); in mpp_task_attach_fd()
1799 struct mpp_task *task, int fmt, in mpp_translate_reg_address() argument
1812 struct mpp_dev *mpp = mpp_get_task_used_device(task, session); in mpp_translate_reg_address()
1835 mem_region = mpp_task_attach_fd(task, usr_fd); in mpp_translate_reg_address()
1927 int mpp_translate_reg_offset_info(struct mpp_task *task, in mpp_translate_reg_offset_info() argument
1948 int mpp_task_init(struct mpp_session *session, struct mpp_task *task) in mpp_task_init() argument
1950 INIT_LIST_HEAD(&task->pending_link); in mpp_task_init()
1951 INIT_LIST_HEAD(&task->queue_link); in mpp_task_init()
1952 INIT_LIST_HEAD(&task->mem_region_list); in mpp_task_init()
1953 task->state = 0; in mpp_task_init()
1954 task->mem_count = 0; in mpp_task_init()
1955 task->session = session; in mpp_task_init()
1961 struct mpp_task *task) in mpp_task_finish() argument
1963 struct mpp_dev *mpp = mpp_get_task_used_device(task, session); in mpp_task_finish()
1966 mpp->dev_ops->finish(mpp, task); in mpp_task_finish()
1973 set_bit(TASK_STATE_FINISH, &task->state); in mpp_task_finish()
1974 set_bit(TASK_STATE_DONE, &task->state); in mpp_task_finish()
1979 task->on_finish = ktime_get(); in mpp_task_finish()
1980 set_bit(TASK_TIMING_FINISH, &task->state); in mpp_task_finish()
1982 time_diff = ktime_us_delta(task->on_finish, task->on_create); in mpp_task_finish()
1985 mpp_task_dump_timing(task, time_diff); in mpp_task_finish()
1989 wake_up(&task->wait); in mpp_task_finish()
1990 mpp_taskqueue_pop_running(mpp->queue, task); in mpp_task_finish()
1996 struct mpp_task *task) in mpp_task_finalize() argument
1999 struct mpp_dev *mpp = mpp_get_task_used_device(task, session); in mpp_task_finalize()
2003 &task->mem_region_list, in mpp_task_finalize()
2017 struct mpp_task *task) in mpp_task_dump_mem_region() argument
2021 if (!task) in mpp_task_dump_mem_region()
2024 mpp_err("--- dump task %d mem region ---\n", task->task_index); in mpp_task_dump_mem_region()
2025 if (!list_empty(&task->mem_region_list)) { in mpp_task_dump_mem_region()
2027 &task->mem_region_list, in mpp_task_dump_mem_region()
2040 struct mpp_task *task) in mpp_task_dump_reg() argument
2042 if (!task) in mpp_task_dump_reg()
2046 mpp_err("--- dump task register ---\n"); in mpp_task_dump_reg()
2047 if (task->reg) { in mpp_task_dump_reg()
2049 u32 s = task->hw_info->reg_start; in mpp_task_dump_reg()
2050 u32 e = task->hw_info->reg_end; in mpp_task_dump_reg()
2056 i, reg, task->reg[i]); in mpp_task_dump_reg()
2117 ret = of_property_read_u32(np, "rockchip,task-capacity", in mpp_dev_probe()
2256 struct mpp_task *task = mpp->cur_task; in mpp_dev_irq() local
2260 if (task && timing_en) { in mpp_dev_irq()
2261 task->on_irq = ktime_get(); in mpp_dev_irq()
2262 set_bit(TASK_TIMING_IRQ, &task->state); in mpp_dev_irq()
2268 if (task) { in mpp_dev_irq()
2273 if (test_and_set_bit(TASK_STATE_HANDLE, &task->state)) { in mpp_dev_irq()
2274 mpp_err("error, task has been handled, irq_status %08x\n", in mpp_dev_irq()
2280 task->on_cancel_timeout = ktime_get(); in mpp_dev_irq()
2281 set_bit(TASK_TIMING_TO_CANCEL, &task->state); in mpp_dev_irq()
2283 cancel_delayed_work(&task->timeout_work); in mpp_dev_irq()
2285 set_bit(TASK_STATE_IRQ, &task->state); in mpp_dev_irq()
2291 mpp_debug(DEBUG_IRQ_CHECK, "error, task is null\n"); in mpp_dev_irq()
2301 struct mpp_task *task = mpp->cur_task; in mpp_dev_isr_sched() local
2303 if (task && mpp->srv->timing_en) { in mpp_dev_isr_sched()
2304 task->on_isr = ktime_get(); in mpp_dev_isr_sched()
2305 set_bit(TASK_TIMING_ISR, &task->state); in mpp_dev_isr_sched()
2316 /* trigger current queue to run next task */ in mpp_dev_isr_sched()
2354 int mpp_time_record(struct mpp_task *task) in mpp_time_record() argument
2356 if (mpp_debug_unlikely(DEBUG_TIMING) && task) { in mpp_time_record()
2357 task->start = ktime_get(); in mpp_time_record()
2358 task->part = task->start; in mpp_time_record()
2364 int mpp_time_part_diff(struct mpp_task *task) in mpp_time_part_diff() argument
2368 struct mpp_dev *mpp = mpp_get_task_used_device(task, task->session); in mpp_time_part_diff()
2372 dev_name(mpp->dev), task->core_id, task->session->pid, in mpp_time_part_diff()
2373 task->session->index, ktime_us_delta(end, task->part)); in mpp_time_part_diff()
2374 task->part = end; in mpp_time_part_diff()
2380 int mpp_time_diff(struct mpp_task *task) in mpp_time_diff() argument
2384 struct mpp_dev *mpp = mpp_get_task_used_device(task, task->session); in mpp_time_diff()
2388 dev_name(mpp->dev), task->core_id, task->session->pid, in mpp_time_diff()
2389 task->session->index, ktime_us_delta(end, task->start)); in mpp_time_diff()
2395 int mpp_time_diff_with_hw_time(struct mpp_task *task, u32 clk_hz) in mpp_time_diff_with_hw_time() argument
2399 struct mpp_dev *mpp = mpp_get_task_used_device(task, task->session); in mpp_time_diff_with_hw_time()
2405 dev_name(mpp->dev), task->core_id, task->session->pid, in mpp_time_diff_with_hw_time()
2406 task->session->index, ktime_us_delta(end, task->start), in mpp_time_diff_with_hw_time()
2407 task->hw_cycles / (clk_hz / 1000000)); in mpp_time_diff_with_hw_time()
2410 dev_name(mpp->dev), task->core_id, task->session->pid, in mpp_time_diff_with_hw_time()
2411 task->session->index, ktime_us_delta(end, task->start)); in mpp_time_diff_with_hw_time()
2425 void mpp_task_dump_timing(struct mpp_task *task, s64 time_diff) in mpp_task_dump_timing() argument
2427 ktime_t s = task->on_create; in mpp_task_dump_timing()
2428 unsigned long state = task->state; in mpp_task_dump_timing()
2430 pr_info("task %d dump timing at %lld us:", task->task_id, time_diff); in mpp_task_dump_timing()
2433 LOG_TIMING(state, TASK_TIMING_CREATE_END, "create end", task->on_create_end, s); in mpp_task_dump_timing()
2434 LOG_TIMING(state, TASK_TIMING_PENDING, "pending", task->on_pending, s); in mpp_task_dump_timing()
2435 LOG_TIMING(state, TASK_TIMING_RUN, "run", task->on_run, s); in mpp_task_dump_timing()
2436 LOG_TIMING(state, TASK_TIMING_TO_SCHED, "timeout start", task->on_sched_timeout, s); in mpp_task_dump_timing()
2437 LOG_TIMING(state, TASK_TIMING_RUN_END, "run end", task->on_run_end, s); in mpp_task_dump_timing()
2438 LOG_TIMING(state, TASK_TIMING_IRQ, "irq", task->on_irq, s); in mpp_task_dump_timing()
2439 LOG_TIMING(state, TASK_TIMING_TO_CANCEL, "timeout cancel", task->on_cancel_timeout, s); in mpp_task_dump_timing()
2440 LOG_TIMING(state, TASK_TIMING_ISR, "isr", task->on_isr, s); in mpp_task_dump_timing()
2441 LOG_TIMING(state, TASK_TIMING_FINISH, "finish", task->on_finish, s); in mpp_task_dump_timing()