Lines Matching refs:c_node
227 struct drm_exynos_ipp_cmd_node *c_node; in ipp_find_drv_by_handle() local
241 list_for_each_entry(c_node, &ippdrv->cmd_list, list) { in ipp_find_drv_by_handle()
242 if (c_node->property.prop_id == prop_id) { in ipp_find_drv_by_handle()
355 struct drm_exynos_ipp_cmd_node *c_node; in exynos_drm_ipp_set_property() local
382 c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock, prop_id); in exynos_drm_ipp_set_property()
384 if (!c_node || c_node->filp != file) { in exynos_drm_ipp_set_property()
389 if (c_node->state != IPP_STATE_STOP) { in exynos_drm_ipp_set_property()
394 c_node->property = *property; in exynos_drm_ipp_set_property()
407 c_node = kzalloc(sizeof(*c_node), GFP_KERNEL); in exynos_drm_ipp_set_property()
408 if (!c_node) in exynos_drm_ipp_set_property()
411 ret = ipp_create_id(&ctx->prop_idr, &ctx->prop_lock, c_node); in exynos_drm_ipp_set_property()
422 c_node->property = *property; in exynos_drm_ipp_set_property()
423 c_node->state = IPP_STATE_IDLE; in exynos_drm_ipp_set_property()
424 c_node->filp = file; in exynos_drm_ipp_set_property()
426 c_node->start_work = ipp_create_cmd_work(); in exynos_drm_ipp_set_property()
427 if (IS_ERR(c_node->start_work)) { in exynos_drm_ipp_set_property()
429 ret = PTR_ERR(c_node->start_work); in exynos_drm_ipp_set_property()
433 c_node->stop_work = ipp_create_cmd_work(); in exynos_drm_ipp_set_property()
434 if (IS_ERR(c_node->stop_work)) { in exynos_drm_ipp_set_property()
436 ret = PTR_ERR(c_node->stop_work); in exynos_drm_ipp_set_property()
440 c_node->event_work = ipp_create_event_work(); in exynos_drm_ipp_set_property()
441 if (IS_ERR(c_node->event_work)) { in exynos_drm_ipp_set_property()
443 ret = PTR_ERR(c_node->event_work); in exynos_drm_ipp_set_property()
447 mutex_init(&c_node->lock); in exynos_drm_ipp_set_property()
448 mutex_init(&c_node->mem_lock); in exynos_drm_ipp_set_property()
449 mutex_init(&c_node->event_lock); in exynos_drm_ipp_set_property()
451 init_completion(&c_node->start_complete); in exynos_drm_ipp_set_property()
452 init_completion(&c_node->stop_complete); in exynos_drm_ipp_set_property()
455 INIT_LIST_HEAD(&c_node->mem_list[i]); in exynos_drm_ipp_set_property()
457 INIT_LIST_HEAD(&c_node->event_list); in exynos_drm_ipp_set_property()
459 list_add_tail(&c_node->list, &ippdrv->cmd_list); in exynos_drm_ipp_set_property()
469 kfree(c_node->stop_work); in exynos_drm_ipp_set_property()
471 kfree(c_node->start_work); in exynos_drm_ipp_set_property()
475 kfree(c_node); in exynos_drm_ipp_set_property()
481 struct drm_exynos_ipp_cmd_node *c_node) in ipp_validate_mem_node() argument
490 ipp_cfg = &c_node->property.config[m_node->prop_id]; in ipp_validate_mem_node()
509 c_node->filp); in ipp_validate_mem_node()
519 struct drm_exynos_ipp_cmd_node *c_node, in ipp_put_mem_node() argument
538 c_node->filp); in ipp_put_mem_node()
549 struct drm_exynos_ipp_cmd_node *c_node, in ipp_get_mem_node() argument
579 qbuf->handle[i], c_node->filp); in ipp_get_mem_node()
582 ipp_put_mem_node(drm_dev, c_node, m_node); in ipp_get_mem_node()
593 mutex_lock(&c_node->mem_lock); in ipp_get_mem_node()
594 if (ipp_validate_mem_node(drm_dev, m_node, c_node)) { in ipp_get_mem_node()
595 ipp_put_mem_node(drm_dev, c_node, m_node); in ipp_get_mem_node()
596 mutex_unlock(&c_node->mem_lock); in ipp_get_mem_node()
599 list_add_tail(&m_node->list, &c_node->mem_list[qbuf->ops_id]); in ipp_get_mem_node()
600 mutex_unlock(&c_node->mem_lock); in ipp_get_mem_node()
606 struct drm_exynos_ipp_cmd_node *c_node, int ops) in ipp_clean_mem_nodes() argument
609 struct list_head *head = &c_node->mem_list[ops]; in ipp_clean_mem_nodes()
611 mutex_lock(&c_node->mem_lock); in ipp_clean_mem_nodes()
616 ret = ipp_put_mem_node(drm_dev, c_node, m_node); in ipp_clean_mem_nodes()
621 mutex_unlock(&c_node->mem_lock); in ipp_clean_mem_nodes()
630 struct drm_exynos_ipp_cmd_node *c_node, in ipp_get_event() argument
641 c_node->filp->event_space += sizeof(e->event); in ipp_get_event()
653 e->base.file_priv = c_node->filp; in ipp_get_event()
655 mutex_lock(&c_node->event_lock); in ipp_get_event()
656 list_add_tail(&e->base.link, &c_node->event_list); in ipp_get_event()
657 mutex_unlock(&c_node->event_lock); in ipp_get_event()
662 static void ipp_put_event(struct drm_exynos_ipp_cmd_node *c_node, in ipp_put_event() argument
668 mutex_lock(&c_node->event_lock); in ipp_put_event()
669 list_for_each_entry_safe(e, te, &c_node->event_list, base.link) { in ipp_put_event()
694 mutex_unlock(&c_node->event_lock); in ipp_put_event()
699 struct drm_exynos_ipp_cmd_node *c_node) in ipp_clean_cmd_node() argument
704 cancel_work_sync(&c_node->start_work->work); in ipp_clean_cmd_node()
705 cancel_work_sync(&c_node->stop_work->work); in ipp_clean_cmd_node()
706 cancel_work_sync(&c_node->event_work->work); in ipp_clean_cmd_node()
709 ipp_put_event(c_node, NULL); in ipp_clean_cmd_node()
712 ipp_clean_mem_nodes(ctx->subdrv.drm_dev, c_node, i); in ipp_clean_cmd_node()
715 list_del(&c_node->list); in ipp_clean_cmd_node()
718 c_node->property.prop_id); in ipp_clean_cmd_node()
721 mutex_destroy(&c_node->lock); in ipp_clean_cmd_node()
722 mutex_destroy(&c_node->mem_lock); in ipp_clean_cmd_node()
723 mutex_destroy(&c_node->event_lock); in ipp_clean_cmd_node()
726 kfree(c_node->start_work); in ipp_clean_cmd_node()
727 kfree(c_node->stop_work); in ipp_clean_cmd_node()
728 kfree(c_node->event_work); in ipp_clean_cmd_node()
729 kfree(c_node); in ipp_clean_cmd_node()
732 static bool ipp_check_mem_list(struct drm_exynos_ipp_cmd_node *c_node) in ipp_check_mem_list() argument
734 switch (c_node->property.cmd) { in ipp_check_mem_list()
736 return !list_empty(&c_node->mem_list[EXYNOS_DRM_OPS_DST]); in ipp_check_mem_list()
738 return !list_empty(&c_node->mem_list[EXYNOS_DRM_OPS_SRC]); in ipp_check_mem_list()
741 return !list_empty(&c_node->mem_list[EXYNOS_DRM_OPS_SRC]) && in ipp_check_mem_list()
742 !list_empty(&c_node->mem_list[EXYNOS_DRM_OPS_DST]); in ipp_check_mem_list()
747 *ipp_find_mem_node(struct drm_exynos_ipp_cmd_node *c_node, in ipp_find_mem_node() argument
757 head = &c_node->mem_list[qbuf->ops_id]; in ipp_find_mem_node()
772 struct drm_exynos_ipp_cmd_node *c_node, in ipp_set_mem_node() argument
810 struct drm_exynos_ipp_cmd_node *c_node) in ipp_handle_cmd_work() argument
815 cmd_work->c_node = c_node; in ipp_handle_cmd_work()
820 struct drm_exynos_ipp_cmd_node *c_node, in ipp_queue_buf_with_run() argument
841 property = &c_node->property; in ipp_queue_buf_with_run()
843 if (c_node->state != IPP_STATE_START) { in ipp_queue_buf_with_run()
848 mutex_lock(&c_node->mem_lock); in ipp_queue_buf_with_run()
849 if (!ipp_check_mem_list(c_node)) { in ipp_queue_buf_with_run()
850 mutex_unlock(&c_node->mem_lock); in ipp_queue_buf_with_run()
860 struct drm_exynos_ipp_cmd_work *cmd_work = c_node->start_work; in ipp_queue_buf_with_run()
863 ipp_handle_cmd_work(dev, ippdrv, cmd_work, c_node); in ipp_queue_buf_with_run()
865 ret = ipp_set_mem_node(ippdrv, c_node, m_node); in ipp_queue_buf_with_run()
867 mutex_unlock(&c_node->mem_lock); in ipp_queue_buf_with_run()
872 mutex_unlock(&c_node->mem_lock); in ipp_queue_buf_with_run()
878 struct drm_exynos_ipp_cmd_node *c_node, in ipp_clean_queue_buf() argument
884 mutex_lock(&c_node->mem_lock); in ipp_clean_queue_buf()
886 &c_node->mem_list[qbuf->ops_id], list) { in ipp_clean_queue_buf()
889 ipp_put_mem_node(drm_dev, c_node, m_node); in ipp_clean_queue_buf()
891 mutex_unlock(&c_node->mem_lock); in ipp_clean_queue_buf()
901 struct drm_exynos_ipp_cmd_node *c_node; in exynos_drm_ipp_queue_buf() local
920 c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock, in exynos_drm_ipp_queue_buf()
922 if (!c_node || c_node->filp != file) { in exynos_drm_ipp_queue_buf()
931 m_node = ipp_get_mem_node(drm_dev, c_node, qbuf); in exynos_drm_ipp_queue_buf()
944 ret = ipp_get_event(drm_dev, c_node, qbuf); in exynos_drm_ipp_queue_buf()
954 ret = ipp_queue_buf_with_run(dev, c_node, m_node, qbuf); in exynos_drm_ipp_queue_buf()
962 mutex_lock(&c_node->lock); in exynos_drm_ipp_queue_buf()
966 ipp_put_event(c_node, qbuf); in exynos_drm_ipp_queue_buf()
968 ipp_clean_queue_buf(drm_dev, c_node, qbuf); in exynos_drm_ipp_queue_buf()
970 mutex_unlock(&c_node->lock); in exynos_drm_ipp_queue_buf()
982 ipp_clean_queue_buf(drm_dev, c_node, qbuf); in exynos_drm_ipp_queue_buf()
1034 struct drm_exynos_ipp_cmd_node *c_node; in exynos_drm_ipp_cmd_ctrl() local
1055 c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock, in exynos_drm_ipp_cmd_ctrl()
1057 if (!c_node || c_node->filp != file) { in exynos_drm_ipp_cmd_ctrl()
1063 c_node->state)) { in exynos_drm_ipp_cmd_ctrl()
1073 c_node->state = IPP_STATE_START; in exynos_drm_ipp_cmd_ctrl()
1075 cmd_work = c_node->start_work; in exynos_drm_ipp_cmd_ctrl()
1077 ipp_handle_cmd_work(dev, ippdrv, cmd_work, c_node); in exynos_drm_ipp_cmd_ctrl()
1080 cmd_work = c_node->stop_work; in exynos_drm_ipp_cmd_ctrl()
1082 ipp_handle_cmd_work(dev, ippdrv, cmd_work, c_node); in exynos_drm_ipp_cmd_ctrl()
1084 if (!wait_for_completion_timeout(&c_node->stop_complete, in exynos_drm_ipp_cmd_ctrl()
1087 c_node->property.prop_id); in exynos_drm_ipp_cmd_ctrl()
1090 c_node->state = IPP_STATE_STOP; in exynos_drm_ipp_cmd_ctrl()
1093 ipp_clean_cmd_node(ctx, c_node); in exynos_drm_ipp_cmd_ctrl()
1100 cmd_work = c_node->stop_work; in exynos_drm_ipp_cmd_ctrl()
1102 ipp_handle_cmd_work(dev, ippdrv, cmd_work, c_node); in exynos_drm_ipp_cmd_ctrl()
1104 if (!wait_for_completion_timeout(&c_node->stop_complete, in exynos_drm_ipp_cmd_ctrl()
1107 c_node->property.prop_id); in exynos_drm_ipp_cmd_ctrl()
1110 c_node->state = IPP_STATE_STOP; in exynos_drm_ipp_cmd_ctrl()
1113 c_node->state = IPP_STATE_START; in exynos_drm_ipp_cmd_ctrl()
1114 cmd_work = c_node->start_work; in exynos_drm_ipp_cmd_ctrl()
1116 ipp_handle_cmd_work(dev, ippdrv, cmd_work, c_node); in exynos_drm_ipp_cmd_ctrl()
1206 struct drm_exynos_ipp_cmd_node *c_node) in ipp_start_property() argument
1209 struct drm_exynos_ipp_property *property = &c_node->property; in ipp_start_property()
1216 ippdrv->c_node = c_node; in ipp_start_property()
1218 mutex_lock(&c_node->mem_lock); in ipp_start_property()
1219 if (!ipp_check_mem_list(c_node)) { in ipp_start_property()
1229 ippdrv->c_node = NULL; in ipp_start_property()
1238 head = &c_node->mem_list[i]; in ipp_start_property()
1245 ret = ipp_set_mem_node(ippdrv, c_node, m_node); in ipp_start_property()
1254 head = &c_node->mem_list[EXYNOS_DRM_OPS_DST]; in ipp_start_property()
1257 ret = ipp_set_mem_node(ippdrv, c_node, m_node); in ipp_start_property()
1266 head = &c_node->mem_list[EXYNOS_DRM_OPS_SRC]; in ipp_start_property()
1269 ret = ipp_set_mem_node(ippdrv, c_node, m_node); in ipp_start_property()
1281 mutex_unlock(&c_node->mem_lock); in ipp_start_property()
1290 ippdrv->c_node = NULL; in ipp_start_property()
1298 mutex_unlock(&c_node->mem_lock); in ipp_start_property()
1299 ippdrv->c_node = NULL; in ipp_start_property()
1305 struct drm_exynos_ipp_cmd_node *c_node) in ipp_stop_property() argument
1307 struct drm_exynos_ipp_property *property = &c_node->property; in ipp_stop_property()
1320 ipp_clean_mem_nodes(drm_dev, c_node, i); in ipp_stop_property()
1323 ipp_clean_mem_nodes(drm_dev, c_node, EXYNOS_DRM_OPS_DST); in ipp_stop_property()
1326 ipp_clean_mem_nodes(drm_dev, c_node, EXYNOS_DRM_OPS_SRC); in ipp_stop_property()
1341 struct drm_exynos_ipp_cmd_node *c_node; in ipp_sched_cmd() local
1351 c_node = cmd_work->c_node; in ipp_sched_cmd()
1352 if (!c_node) { in ipp_sched_cmd()
1357 mutex_lock(&c_node->lock); in ipp_sched_cmd()
1359 property = &c_node->property; in ipp_sched_cmd()
1364 ret = ipp_start_property(ippdrv, c_node); in ipp_sched_cmd()
1367 c_node->property.prop_id); in ipp_sched_cmd()
1379 (&c_node->start_complete, msecs_to_jiffies(200))) { in ipp_sched_cmd()
1381 c_node->property.prop_id); in ipp_sched_cmd()
1389 c_node); in ipp_sched_cmd()
1395 complete(&c_node->stop_complete); in ipp_sched_cmd()
1405 mutex_unlock(&c_node->lock); in ipp_sched_cmd()
1409 struct drm_exynos_ipp_cmd_node *c_node, int *buf_id) in ipp_send_event() argument
1412 struct drm_exynos_ipp_property *property = &c_node->property; in ipp_send_event()
1435 mutex_lock(&c_node->event_lock); in ipp_send_event()
1436 if (list_empty(&c_node->event_list)) { in ipp_send_event()
1442 mutex_lock(&c_node->mem_lock); in ipp_send_event()
1443 if (!ipp_check_mem_list(c_node)) { in ipp_send_event()
1454 head = &c_node->mem_list[i]; in ipp_send_event()
1463 ret = ipp_put_mem_node(drm_dev, c_node, m_node); in ipp_send_event()
1475 m_node = ipp_find_mem_node(c_node, &qbuf); in ipp_send_event()
1484 ret = ipp_put_mem_node(drm_dev, c_node, m_node); in ipp_send_event()
1490 head = &c_node->mem_list[EXYNOS_DRM_OPS_SRC]; in ipp_send_event()
1497 ret = ipp_put_mem_node(drm_dev, c_node, m_node); in ipp_send_event()
1506 mutex_unlock(&c_node->mem_lock); in ipp_send_event()
1518 e = list_first_entry(&c_node->event_list, in ipp_send_event()
1535 mutex_unlock(&c_node->event_lock); in ipp_send_event()
1543 mutex_unlock(&c_node->mem_lock); in ipp_send_event()
1545 mutex_unlock(&c_node->event_lock); in ipp_send_event()
1554 struct drm_exynos_ipp_cmd_node *c_node; in ipp_sched_event() local
1570 c_node = ippdrv->c_node; in ipp_sched_event()
1571 if (!c_node) { in ipp_sched_event()
1582 if (c_node->state != IPP_STATE_START) { in ipp_sched_event()
1584 c_node->state, c_node->property.prop_id); in ipp_sched_event()
1588 ret = ipp_send_event(ippdrv, c_node, event_work->buf_id); in ipp_sched_event()
1595 if (ipp_is_m2m_cmd(c_node->property.cmd)) in ipp_sched_event()
1596 complete(&c_node->start_complete); in ipp_sched_event()
1688 struct drm_exynos_ipp_cmd_node *c_node, *tc_node; in ipp_subdrv_close() local
1693 list_for_each_entry_safe(c_node, tc_node, in ipp_subdrv_close()
1698 if (c_node->filp == file) { in ipp_subdrv_close()
1705 if (c_node->state == IPP_STATE_START) { in ipp_subdrv_close()
1707 c_node); in ipp_subdrv_close()
1708 c_node->state = IPP_STATE_STOP; in ipp_subdrv_close()
1712 ipp_clean_cmd_node(ctx, c_node); in ipp_subdrv_close()