Lines Matching full:task
87 WARN_ON(ipp->task); in exynos_drm_ipp_unregister()
261 struct exynos_drm_ipp_task *task; in exynos_drm_ipp_task_alloc() local
263 task = kzalloc_obj(*task); in exynos_drm_ipp_task_alloc()
264 if (!task) in exynos_drm_ipp_task_alloc()
267 task->dev = ipp->dev; in exynos_drm_ipp_task_alloc()
268 task->ipp = ipp; in exynos_drm_ipp_task_alloc()
271 task->src.rect.w = task->dst.rect.w = UINT_MAX; in exynos_drm_ipp_task_alloc()
272 task->src.rect.h = task->dst.rect.h = UINT_MAX; in exynos_drm_ipp_task_alloc()
273 task->transform.rotation = DRM_MODE_ROTATE_0; in exynos_drm_ipp_task_alloc()
275 DRM_DEV_DEBUG_DRIVER(task->dev, "Allocated task %p\n", task); in exynos_drm_ipp_task_alloc()
277 return task; in exynos_drm_ipp_task_alloc()
314 static int exynos_drm_ipp_task_set(struct exynos_drm_ipp_task *task, in exynos_drm_ipp_task_set() argument
334 if (copy_from_user((void *)task + map[i].offset, params, in exynos_drm_ipp_task_set()
342 DRM_DEV_DEBUG_DRIVER(task->dev, in exynos_drm_ipp_task_set()
343 "Got task %p configuration from userspace\n", in exynos_drm_ipp_task_set()
344 task); in exynos_drm_ipp_task_set()
396 struct exynos_drm_ipp_task *task) in exynos_drm_ipp_task_free() argument
398 DRM_DEV_DEBUG_DRIVER(task->dev, "Freeing task %p\n", task); in exynos_drm_ipp_task_free()
400 exynos_drm_ipp_task_release_buf(&task->src); in exynos_drm_ipp_task_free()
401 exynos_drm_ipp_task_release_buf(&task->dst); in exynos_drm_ipp_task_free()
402 if (task->event) in exynos_drm_ipp_task_free()
403 drm_event_cancel_free(ipp->drm_dev, &task->event->base); in exynos_drm_ipp_task_free()
404 kfree(task); in exynos_drm_ipp_task_free()
549 static int exynos_drm_ipp_check_format(struct exynos_drm_ipp_task *task, in exynos_drm_ipp_check_format() argument
558 fmt = __ipp_format_get(task->ipp, buf->buf.fourcc, buf->buf.modifier, in exynos_drm_ipp_check_format()
562 DRM_DEV_DEBUG_DRIVER(task->dev, in exynos_drm_ipp_check_format()
563 "Task %p: %s format not supported\n", in exynos_drm_ipp_check_format()
564 task, buf == src ? "src" : "dst"); in exynos_drm_ipp_check_format()
603 static int exynos_drm_ipp_task_check(struct exynos_drm_ipp_task *task) in exynos_drm_ipp_task_check() argument
605 struct exynos_drm_ipp *ipp = task->ipp; in exynos_drm_ipp_task_check()
606 struct exynos_drm_ipp_buffer *src = &task->src, *dst = &task->dst; in exynos_drm_ipp_task_check()
607 unsigned int rotation = task->transform.rotation; in exynos_drm_ipp_task_check()
613 DRM_DEV_DEBUG_DRIVER(task->dev, "Checking task %p\n", task); in exynos_drm_ipp_task_check()
628 DRM_DEV_DEBUG_DRIVER(task->dev, in exynos_drm_ipp_task_check()
629 "Task %p: defined area is outside provided buffers\n", in exynos_drm_ipp_task_check()
630 task); in exynos_drm_ipp_task_check()
646 DRM_DEV_DEBUG_DRIVER(task->dev, "Task %p: hw capabilities exceeded\n", in exynos_drm_ipp_task_check()
647 task); in exynos_drm_ipp_task_check()
651 ret = exynos_drm_ipp_check_format(task, src, src, dst, rotate, swap); in exynos_drm_ipp_task_check()
655 ret = exynos_drm_ipp_check_format(task, dst, src, dst, false, swap); in exynos_drm_ipp_task_check()
659 DRM_DEV_DEBUG_DRIVER(ipp->dev, "Task %p: all checks done.\n", in exynos_drm_ipp_task_check()
660 task); in exynos_drm_ipp_task_check()
665 static int exynos_drm_ipp_task_setup_buffers(struct exynos_drm_ipp_task *task, in exynos_drm_ipp_task_setup_buffers() argument
668 struct exynos_drm_ipp_buffer *src = &task->src, *dst = &task->dst; in exynos_drm_ipp_task_setup_buffers()
671 DRM_DEV_DEBUG_DRIVER(task->dev, "Setting buffer for task %p\n", in exynos_drm_ipp_task_setup_buffers()
672 task); in exynos_drm_ipp_task_setup_buffers()
676 DRM_DEV_DEBUG_DRIVER(task->dev, in exynos_drm_ipp_task_setup_buffers()
677 "Task %p: src buffer setup failed\n", in exynos_drm_ipp_task_setup_buffers()
678 task); in exynos_drm_ipp_task_setup_buffers()
683 DRM_DEV_DEBUG_DRIVER(task->dev, in exynos_drm_ipp_task_setup_buffers()
684 "Task %p: dst buffer setup failed\n", in exynos_drm_ipp_task_setup_buffers()
685 task); in exynos_drm_ipp_task_setup_buffers()
689 DRM_DEV_DEBUG_DRIVER(task->dev, "Task %p: buffers prepared.\n", in exynos_drm_ipp_task_setup_buffers()
690 task); in exynos_drm_ipp_task_setup_buffers()
696 static int exynos_drm_ipp_event_create(struct exynos_drm_ipp_task *task, in exynos_drm_ipp_event_create() argument
710 ret = drm_event_reserve_init(task->ipp->drm_dev, file_priv, &e->base, in exynos_drm_ipp_event_create()
715 task->event = e; in exynos_drm_ipp_event_create()
722 static void exynos_drm_ipp_event_send(struct exynos_drm_ipp_task *task) in exynos_drm_ipp_event_send() argument
727 task->event->event.tv_sec = now.tv_sec; in exynos_drm_ipp_event_send()
728 task->event->event.tv_usec = now.tv_nsec / NSEC_PER_USEC; in exynos_drm_ipp_event_send()
729 task->event->event.sequence = atomic_inc_return(&task->ipp->sequence); in exynos_drm_ipp_event_send()
731 drm_send_event(task->ipp->drm_dev, &task->event->base); in exynos_drm_ipp_event_send()
734 static int exynos_drm_ipp_task_cleanup(struct exynos_drm_ipp_task *task) in exynos_drm_ipp_task_cleanup() argument
736 int ret = task->ret; in exynos_drm_ipp_task_cleanup()
738 if (ret == 0 && task->event) { in exynos_drm_ipp_task_cleanup()
739 exynos_drm_ipp_event_send(task); in exynos_drm_ipp_task_cleanup()
740 /* ensure event won't be canceled on task free */ in exynos_drm_ipp_task_cleanup()
741 task->event = NULL; in exynos_drm_ipp_task_cleanup()
744 exynos_drm_ipp_task_free(task->ipp, task); in exynos_drm_ipp_task_cleanup()
750 struct exynos_drm_ipp_task *task = container_of(work, in exynos_drm_ipp_cleanup_work() local
753 exynos_drm_ipp_task_cleanup(task); in exynos_drm_ipp_cleanup_work()
759 * exynos_drm_ipp_task_done - finish given task and set return code
760 * @task: ipp task to finish
763 void exynos_drm_ipp_task_done(struct exynos_drm_ipp_task *task, int ret) in exynos_drm_ipp_task_done() argument
765 struct exynos_drm_ipp *ipp = task->ipp; in exynos_drm_ipp_task_done()
768 DRM_DEV_DEBUG_DRIVER(task->dev, "ipp: %d, task %p done: %d\n", in exynos_drm_ipp_task_done()
769 ipp->id, task, ret); in exynos_drm_ipp_task_done()
772 if (ipp->task == task) in exynos_drm_ipp_task_done()
773 ipp->task = NULL; in exynos_drm_ipp_task_done()
774 task->flags |= DRM_EXYNOS_IPP_TASK_DONE; in exynos_drm_ipp_task_done()
775 task->ret = ret; in exynos_drm_ipp_task_done()
781 if (task->flags & DRM_EXYNOS_IPP_TASK_ASYNC) { in exynos_drm_ipp_task_done()
782 INIT_WORK(&task->cleanup_work, exynos_drm_ipp_cleanup_work); in exynos_drm_ipp_task_done()
783 schedule_work(&task->cleanup_work); in exynos_drm_ipp_task_done()
789 struct exynos_drm_ipp_task *task; in exynos_drm_ipp_next_task() local
793 DRM_DEV_DEBUG_DRIVER(ipp->dev, "ipp: %d, try to run new task\n", in exynos_drm_ipp_next_task()
798 if (ipp->task || list_empty(&ipp->todo_list)) { in exynos_drm_ipp_next_task()
803 task = list_first_entry(&ipp->todo_list, struct exynos_drm_ipp_task, in exynos_drm_ipp_next_task()
805 list_del_init(&task->head); in exynos_drm_ipp_next_task()
806 ipp->task = task; in exynos_drm_ipp_next_task()
811 "ipp: %d, selected task %p to run\n", ipp->id, in exynos_drm_ipp_next_task()
812 task); in exynos_drm_ipp_next_task()
814 ret = ipp->funcs->commit(ipp, task); in exynos_drm_ipp_next_task()
816 exynos_drm_ipp_task_done(task, ret); in exynos_drm_ipp_next_task()
820 struct exynos_drm_ipp_task *task) in exynos_drm_ipp_schedule_task() argument
825 list_add(&task->head, &ipp->todo_list); in exynos_drm_ipp_schedule_task()
832 struct exynos_drm_ipp_task *task) in exynos_drm_ipp_task_abort() argument
837 if (task->flags & DRM_EXYNOS_IPP_TASK_DONE) { in exynos_drm_ipp_task_abort()
838 /* already completed task */ in exynos_drm_ipp_task_abort()
839 exynos_drm_ipp_task_cleanup(task); in exynos_drm_ipp_task_abort()
840 } else if (ipp->task != task) { in exynos_drm_ipp_task_abort()
841 /* task has not been scheduled for execution yet */ in exynos_drm_ipp_task_abort()
842 list_del_init(&task->head); in exynos_drm_ipp_task_abort()
843 exynos_drm_ipp_task_cleanup(task); in exynos_drm_ipp_task_abort()
846 * currently processed task, call abort() and perform in exynos_drm_ipp_task_abort()
849 task->flags |= DRM_EXYNOS_IPP_TASK_ASYNC; in exynos_drm_ipp_task_abort()
852 ipp->funcs->abort(ipp, task); in exynos_drm_ipp_task_abort()
864 * Construct a ipp task from the set of properties provided from the user
877 struct exynos_drm_ipp_task *task; in exynos_drm_ipp_commit_ioctl() local
892 task = exynos_drm_ipp_task_alloc(ipp); in exynos_drm_ipp_commit_ioctl()
893 if (!task) in exynos_drm_ipp_commit_ioctl()
896 ret = exynos_drm_ipp_task_set(task, arg); in exynos_drm_ipp_commit_ioctl()
900 ret = exynos_drm_ipp_task_check(task); in exynos_drm_ipp_commit_ioctl()
904 ret = exynos_drm_ipp_task_setup_buffers(task, file_priv); in exynos_drm_ipp_commit_ioctl()
909 ret = exynos_drm_ipp_event_create(task, file_priv, in exynos_drm_ipp_commit_ioctl()
916 * Queue task for processing on the hardware. task object will be in exynos_drm_ipp_commit_ioctl()
921 "ipp: %d, nonblocking processing task %p\n", in exynos_drm_ipp_commit_ioctl()
922 ipp->id, task); in exynos_drm_ipp_commit_ioctl()
924 task->flags |= DRM_EXYNOS_IPP_TASK_ASYNC; in exynos_drm_ipp_commit_ioctl()
925 exynos_drm_ipp_schedule_task(task->ipp, task); in exynos_drm_ipp_commit_ioctl()
928 DRM_DEV_DEBUG_DRIVER(ipp->dev, "ipp: %d, processing task %p\n", in exynos_drm_ipp_commit_ioctl()
929 ipp->id, task); in exynos_drm_ipp_commit_ioctl()
930 exynos_drm_ipp_schedule_task(ipp, task); in exynos_drm_ipp_commit_ioctl()
932 task->flags & DRM_EXYNOS_IPP_TASK_DONE); in exynos_drm_ipp_commit_ioctl()
934 exynos_drm_ipp_task_abort(ipp, task); in exynos_drm_ipp_commit_ioctl()
936 ret = exynos_drm_ipp_task_cleanup(task); in exynos_drm_ipp_commit_ioctl()
940 exynos_drm_ipp_task_free(ipp, task); in exynos_drm_ipp_commit_ioctl()