Lines Matching refs:session
107 if (!task->session || !task->session->mpp) in mpp_taskqueue_pop_pending()
180 if (!task->session || !task->session->mpp) in mpp_taskqueue_pop_running()
235 static void task_msgs_init(struct mpp_task_msgs *msgs, struct mpp_session *session) in task_msgs_init() argument
239 msgs->session = session; in task_msgs_init()
249 static struct mpp_task_msgs *get_task_msgs(struct mpp_session *session) in get_task_msgs() argument
254 spin_lock_irqsave(&session->lock_msgs, flags); in get_task_msgs()
255 msgs = list_first_entry_or_null(&session->list_msgs_idle, in get_task_msgs()
258 list_move_tail(&msgs->list_session, &session->list_msgs); in get_task_msgs()
259 spin_unlock_irqrestore(&session->lock_msgs, flags); in get_task_msgs()
263 spin_unlock_irqrestore(&session->lock_msgs, flags); in get_task_msgs()
266 task_msgs_init(msgs, session); in get_task_msgs()
269 spin_lock_irqsave(&session->lock_msgs, flags); in get_task_msgs()
270 list_move_tail(&msgs->list_session, &session->list_msgs); in get_task_msgs()
271 session->msgs_cnt++; in get_task_msgs()
272 spin_unlock_irqrestore(&session->lock_msgs, flags); in get_task_msgs()
275 session->pid, session->index, session->msgs_cnt); in get_task_msgs()
282 struct mpp_session *session = msgs->session; in put_task_msgs() local
285 if (!session) { in put_task_msgs()
297 spin_lock_irqsave(&session->lock_msgs, flags); in put_task_msgs()
298 list_move_tail(&msgs->list_session, &session->list_msgs_idle); in put_task_msgs()
299 spin_unlock_irqrestore(&session->lock_msgs, flags); in put_task_msgs()
302 static void clear_task_msgs(struct mpp_session *session) in clear_task_msgs() argument
308 spin_lock_irqsave(&session->lock_msgs, flags); in clear_task_msgs()
310 list_for_each_entry_safe(msgs, n, &session->list_msgs, list_session) in clear_task_msgs()
313 list_for_each_entry_safe(msgs, n, &session->list_msgs_idle, list_session) in clear_task_msgs()
316 spin_unlock_irqrestore(&session->lock_msgs, flags); in clear_task_msgs()
322 static void mpp_session_clear_pending(struct mpp_session *session) in mpp_session_clear_pending() argument
327 mutex_lock(&session->pending_lock); in mpp_session_clear_pending()
329 &session->pending_list, in mpp_session_clear_pending()
336 mutex_unlock(&session->pending_lock); in mpp_session_clear_pending()
341 struct mpp_session *session, *n; in mpp_session_cleanup_detach() local
347 list_for_each_entry_safe(session, n, &queue->session_detach, session_link) { in mpp_session_cleanup_detach()
348 s32 task_count = atomic_read(&session->task_count); in mpp_session_cleanup_detach()
351 list_del_init(&session->session_link); in mpp_session_cleanup_detach()
359 session->pid, session->index, in mpp_session_cleanup_detach()
362 mpp_session_clear_pending(session); in mpp_session_cleanup_detach()
367 mpp_session_deinit(session); in mpp_session_cleanup_detach()
384 struct mpp_session *session = kzalloc(sizeof(*session), GFP_KERNEL); in mpp_session_init() local
386 if (!session) in mpp_session_init()
389 session->pid = current->pid; in mpp_session_init()
391 mutex_init(&session->pending_lock); in mpp_session_init()
392 INIT_LIST_HEAD(&session->pending_list); in mpp_session_init()
393 INIT_LIST_HEAD(&session->service_link); in mpp_session_init()
394 INIT_LIST_HEAD(&session->session_link); in mpp_session_init()
396 atomic_set(&session->task_count, 0); in mpp_session_init()
397 atomic_set(&session->release_request, 0); in mpp_session_init()
399 INIT_LIST_HEAD(&session->list_msgs); in mpp_session_init()
400 INIT_LIST_HEAD(&session->list_msgs_idle); in mpp_session_init()
401 spin_lock_init(&session->lock_msgs); in mpp_session_init()
403 mpp_dbg_session("session %p init\n", session); in mpp_session_init()
404 return session; in mpp_session_init()
407 static void mpp_session_deinit_default(struct mpp_session *session) in mpp_session_deinit_default() argument
409 if (session->mpp) { in mpp_session_deinit_default()
410 struct mpp_dev *mpp = session->mpp; in mpp_session_deinit_default()
413 mpp->dev_ops->free_session(session); in mpp_session_deinit_default()
415 mpp_session_clear_pending(session); in mpp_session_deinit_default()
417 if (session->dma) { in mpp_session_deinit_default()
419 mpp_dma_session_destroy(session->dma); in mpp_session_deinit_default()
421 session->dma = NULL; in mpp_session_deinit_default()
425 if (session->srv) { in mpp_session_deinit_default()
426 struct mpp_service *srv = session->srv; in mpp_session_deinit_default()
429 list_del_init(&session->service_link); in mpp_session_deinit_default()
433 list_del_init(&session->session_link); in mpp_session_deinit_default()
436 void mpp_session_deinit(struct mpp_session *session) in mpp_session_deinit() argument
438 mpp_dbg_session("session %d:%d task %d deinit\n", session->pid, in mpp_session_deinit()
439 session->index, atomic_read(&session->task_count)); in mpp_session_deinit()
441 if (likely(session->deinit)) in mpp_session_deinit()
442 session->deinit(session); in mpp_session_deinit()
446 clear_task_msgs(session); in mpp_session_deinit()
448 kfree(session); in mpp_session_deinit()
451 static void mpp_session_attach_workqueue(struct mpp_session *session, in mpp_session_attach_workqueue() argument
454 mpp_dbg_session("session %d:%d attach\n", session->pid, session->index); in mpp_session_attach_workqueue()
456 list_add_tail(&session->session_link, &queue->session_attach); in mpp_session_attach_workqueue()
460 static void mpp_session_detach_workqueue(struct mpp_session *session) in mpp_session_detach_workqueue() argument
465 if (!session->mpp || !session->mpp->queue) in mpp_session_detach_workqueue()
468 mpp_dbg_session("session %d:%d detach\n", session->pid, session->index); in mpp_session_detach_workqueue()
469 mpp = session->mpp; in mpp_session_detach_workqueue()
473 list_del_init(&session->session_link); in mpp_session_detach_workqueue()
474 list_add_tail(&session->session_link, &queue->session_detach); in mpp_session_detach_workqueue()
482 mpp_session_push_pending(struct mpp_session *session, in mpp_session_push_pending() argument
486 mutex_lock(&session->pending_lock); in mpp_session_push_pending()
487 if (session->srv->timing_en) { in mpp_session_push_pending()
491 list_add_tail(&task->pending_link, &session->pending_list); in mpp_session_push_pending()
492 mutex_unlock(&session->pending_lock); in mpp_session_push_pending()
498 mpp_session_pop_pending(struct mpp_session *session, in mpp_session_pop_pending() argument
501 mutex_lock(&session->pending_lock); in mpp_session_pop_pending()
503 mutex_unlock(&session->pending_lock); in mpp_session_pop_pending()
510 mpp_session_get_pending_task(struct mpp_session *session) in mpp_session_get_pending_task() argument
514 mutex_lock(&session->pending_lock); in mpp_session_get_pending_task()
515 task = list_first_entry_or_null(&session->pending_list, in mpp_session_get_pending_task()
518 mutex_unlock(&session->pending_lock); in mpp_session_get_pending_task()
526 struct mpp_session *session; in mpp_free_task() local
529 if (!task->session) { in mpp_free_task()
533 session = task->session; in mpp_free_task()
536 session->index, task->task_id, task->state, 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()
544 atomic_dec(&session->task_count); in mpp_free_task()
551 struct mpp_session *session; in mpp_task_timeout_work() local
561 if (!task->session) { 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()
570 if (!session->mpp) { in mpp_task_timeout_work()
571 mpp_err("session %d:%d, session mpp is null.\n", session->pid, in mpp_task_timeout_work()
572 session->index); in mpp_task_timeout_work()
578 mpp = mpp_get_task_used_device(task, session); in mpp_task_timeout_work()
608 static int mpp_process_task_default(struct mpp_session *session, in mpp_process_task_default() argument
612 struct mpp_dev *mpp = session->mpp; in mpp_process_task_default()
618 session->pid, session->device_type); in mpp_process_task_default()
622 timing_en = session->srv->timing_en; in mpp_process_task_default()
627 task = mpp->dev_ops->alloc_task(session, msgs); in mpp_process_task_default()
641 mpp = mpp_get_task_used_device(task, session); in mpp_process_task_default()
663 atomic_inc(&session->task_count); in mpp_process_task_default()
664 mpp_session_push_pending(session, task); in mpp_process_task_default()
669 static int mpp_process_task(struct mpp_session *session, in mpp_process_task() argument
672 if (likely(session->process_task)) in mpp_process_task()
673 return session->process_task(session, msgs); in mpp_process_task()
835 task->session->pid, dev_name(mpp->dev)); in mpp_task_run()
874 mpp = task->session->mpp; in mpp_task_worker_default()
895 struct mpp_dev *task_mpp = mpp_get_task_used_device(task, task->session); in mpp_task_worker_default()
910 static int mpp_wait_result_default(struct mpp_session *session, in mpp_wait_result_default() argument
917 task = mpp_session_get_pending_task(session); in mpp_wait_result_default()
920 session->pid, session->index); in mpp_wait_result_default()
923 mpp = mpp_get_task_used_device(task, session); in mpp_wait_result_default()
935 session->pid, session->pid, session->index, in mpp_wait_result_default()
936 atomic_read(&session->task_count), task, in mpp_wait_result_default()
943 mpp_session_pop_pending(session, task); in mpp_wait_result_default()
948 static int mpp_wait_result(struct mpp_session *session, in mpp_wait_result() argument
951 if (likely(session->wait_result)) in mpp_wait_result()
952 return session->wait_result(session, msgs); in mpp_wait_result()
1175 static int mpp_process_request(struct mpp_session *session, in mpp_process_request() argument
1197 if (session && session->mpp) { in mpp_process_request()
1198 mpp = session->mpp; in mpp_process_request()
1245 session->device_type = (enum MPP_DEVICE_TYPE)client_type; in mpp_process_request()
1246 session->dma = mpp_dma_session_create(mpp->dev, mpp->session_max_buffers); in mpp_process_request()
1247 session->mpp = mpp; in mpp_process_request()
1250 session->process_task = in mpp_process_request()
1254 session->wait_result = in mpp_process_request()
1258 session->deinit = mpp->dev_ops->deinit; in mpp_process_request()
1260 session->index = atomic_fetch_inc(&mpp->session_index); in mpp_process_request()
1262 ret = mpp->dev_ops->init_session(session); in mpp_process_request()
1267 mpp_session_attach_workqueue(session, mpp->queue); in mpp_process_request()
1272 mpp = session->mpp; in mpp_process_request()
1281 if (session && req->size) { in mpp_process_request()
1282 int trans_tbl_size = sizeof(session->trans_table); in mpp_process_request()
1290 if (copy_from_user(session->trans_table, in mpp_process_request()
1295 session->trans_count = in mpp_process_request()
1296 req->size / sizeof(session->trans_table[0]); in mpp_process_request()
1330 &session->task_count, in mpp_process_request()
1335 mpp = session->mpp; in mpp_process_request()
1339 mpp_session_clear_pending(session); in mpp_process_request()
1341 ret = mpp_dma_session_destroy(session->dma); in mpp_process_request()
1351 mpp = session->mpp; in mpp_process_request()
1371 session->dma, fd); in mpp_process_request()
1403 ret = mpp_dma_release_fd(session->dma, data[i]); in mpp_process_request()
1411 mpp = session->mpp; in mpp_process_request()
1414 session->pid, session->device_type); in mpp_process_request()
1418 return mpp->dev_ops->ioctl(session, req); in mpp_process_request()
1429 struct mpp_session *session = msgs->session; in task_msgs_add() local
1435 session->msg_flags = msgs->flags; in task_msgs_add()
1436 ret = mpp_process_task(session, msgs); in task_msgs_add()
1447 static int mpp_collect_msgs(struct list_head *head, struct mpp_session *session, in mpp_collect_msgs() argument
1519 session = f.file->private_data; in mpp_collect_msgs()
1520 msgs = get_task_msgs(session); in mpp_collect_msgs()
1522 if (f.file->private_data == session) in mpp_collect_msgs()
1528 bat_msg.fd, session->index, session->msgs_cnt); in mpp_collect_msgs()
1539 msgs = get_task_msgs(session); in mpp_collect_msgs()
1543 session->pid, session->index); in mpp_collect_msgs()
1549 session->index, msgs->req_cnt, MPP_MAX_MSG_NUM); in mpp_collect_msgs()
1560 ret = mpp_process_request(session, session->srv, req, msgs); in mpp_collect_msgs()
1563 session->index, req->cmd, ret); in mpp_collect_msgs()
1627 struct mpp_session *session = msgs->session; in mpp_msgs_wait() local
1630 int ret = mpp_wait_result(session, msgs); in mpp_msgs_wait()
1634 session->index, ret); in mpp_msgs_wait()
1646 struct mpp_session *session = (struct mpp_session *)filp->private_data; in mpp_dev_ioctl() local
1652 if (!session || !session->srv) { in mpp_dev_ioctl()
1653 mpp_err("session %p\n", session); in mpp_dev_ioctl()
1657 srv = session->srv; in mpp_dev_ioctl()
1659 if (atomic_read(&session->release_request) > 0) { in mpp_dev_ioctl()
1670 ret = mpp_collect_msgs(&msgs_list, session, cmd, (void __user *)arg); in mpp_dev_ioctl()
1685 struct mpp_session *session = NULL; in mpp_dev_open() local
1691 session = mpp_session_init(); in mpp_dev_open()
1692 if (!session) in mpp_dev_open()
1695 session->srv = srv; in mpp_dev_open()
1697 if (session->srv) { in mpp_dev_open()
1699 list_add_tail(&session->service_link, &srv->session_list); in mpp_dev_open()
1702 session->process_task = mpp_process_task_default; in mpp_dev_open()
1703 session->wait_result = mpp_wait_result_default; in mpp_dev_open()
1704 session->deinit = mpp_session_deinit_default; in mpp_dev_open()
1705 filp->private_data = (void *)session; in mpp_dev_open()
1714 struct mpp_session *session = filp->private_data; in mpp_dev_release() local
1718 if (!session) { in mpp_dev_release()
1724 atomic_inc(&session->release_request); in mpp_dev_release()
1726 if (session->mpp || atomic_read(&session->task_count)) in mpp_dev_release()
1727 mpp_session_detach_workqueue(session); in mpp_dev_release()
1729 mpp_session_deinit(session); in mpp_dev_release()
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()
1798 int mpp_translate_reg_address(struct mpp_session *session, in mpp_translate_reg_address() argument
1808 if (session->trans_count > 0) { in mpp_translate_reg_address()
1809 cnt = session->trans_count; in mpp_translate_reg_address()
1810 tbl = session->trans_table; in mpp_translate_reg_address()
1812 struct mpp_dev *mpp = mpp_get_task_used_device(task, session); in mpp_translate_reg_address()
1824 if (session->msg_flags & MPP_FLAGS_REG_NO_OFFSET) { in mpp_translate_reg_address()
1948 int mpp_task_init(struct mpp_session *session, struct mpp_task *task) in mpp_task_init() argument
1955 task->session = session; in mpp_task_init()
1960 int mpp_task_finish(struct mpp_session *session, in mpp_task_finish() argument
1963 struct mpp_dev *mpp = mpp_get_task_used_device(task, session); in mpp_task_finish()
1976 if (session->srv->timing_en) { in mpp_task_finish()
1995 int mpp_task_finalize(struct mpp_session *session, in mpp_task_finalize() argument
1999 struct mpp_dev *mpp = mpp_get_task_used_device(task, session); in mpp_task_finalize()
2007 mpp_dma_release(session->dma, mem_region->hdl); in mpp_task_finalize()
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()
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()
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()
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()