Lines Matching refs:task

83 	WARN_ON(ipp->task);  in exynos_drm_ipp_unregister()
257 struct exynos_drm_ipp_task *task; in exynos_drm_ipp_task_alloc() local
259 task = kzalloc(sizeof(*task), GFP_KERNEL); in exynos_drm_ipp_task_alloc()
260 if (!task) in exynos_drm_ipp_task_alloc()
263 task->dev = ipp->dev; in exynos_drm_ipp_task_alloc()
264 task->ipp = ipp; in exynos_drm_ipp_task_alloc()
267 task->src.rect.w = task->dst.rect.w = UINT_MAX; in exynos_drm_ipp_task_alloc()
268 task->src.rect.h = task->dst.rect.h = UINT_MAX; in exynos_drm_ipp_task_alloc()
269 task->transform.rotation = DRM_MODE_ROTATE_0; in exynos_drm_ipp_task_alloc()
271 DRM_DEBUG_DRIVER("Allocated task %pK\n", task); in exynos_drm_ipp_task_alloc()
273 return task; in exynos_drm_ipp_task_alloc()
310 static int exynos_drm_ipp_task_set(struct exynos_drm_ipp_task *task, in exynos_drm_ipp_task_set() argument
330 if (copy_from_user((void *)task + map[i].offset, params, in exynos_drm_ipp_task_set()
338 DRM_DEBUG_DRIVER("Got task %pK configuration from userspace\n", task); in exynos_drm_ipp_task_set()
390 struct exynos_drm_ipp_task *task) in exynos_drm_ipp_task_free() argument
392 DRM_DEBUG_DRIVER("Freeing task %pK\n", task); in exynos_drm_ipp_task_free()
394 exynos_drm_ipp_task_release_buf(&task->src); in exynos_drm_ipp_task_free()
395 exynos_drm_ipp_task_release_buf(&task->dst); in exynos_drm_ipp_task_free()
396 if (task->event) in exynos_drm_ipp_task_free()
397 drm_event_cancel_free(ipp->dev, &task->event->base); in exynos_drm_ipp_task_free()
398 kfree(task); in exynos_drm_ipp_task_free()
543 static int exynos_drm_ipp_check_format(struct exynos_drm_ipp_task *task, in exynos_drm_ipp_check_format() argument
552 fmt = __ipp_format_get(task->ipp, buf->buf.fourcc, buf->buf.modifier, in exynos_drm_ipp_check_format()
556 DRM_DEBUG_DRIVER("Task %pK: %s format not supported\n", task, in exynos_drm_ipp_check_format()
596 static int exynos_drm_ipp_task_check(struct exynos_drm_ipp_task *task) in exynos_drm_ipp_task_check() argument
598 struct exynos_drm_ipp *ipp = task->ipp; in exynos_drm_ipp_task_check()
599 struct exynos_drm_ipp_buffer *src = &task->src, *dst = &task->dst; in exynos_drm_ipp_task_check()
600 unsigned int rotation = task->transform.rotation; in exynos_drm_ipp_task_check()
606 DRM_DEBUG_DRIVER("Checking task %pK\n", task); in exynos_drm_ipp_task_check()
622 task); in exynos_drm_ipp_task_check()
638 DRM_DEBUG_DRIVER("Task %pK: hw capabilities exceeded\n", task); in exynos_drm_ipp_task_check()
642 ret = exynos_drm_ipp_check_format(task, src, src, dst, rotate, swap); in exynos_drm_ipp_task_check()
646 ret = exynos_drm_ipp_check_format(task, dst, src, dst, false, swap); in exynos_drm_ipp_task_check()
650 DRM_DEBUG_DRIVER("Task %pK: all checks done.\n", task); in exynos_drm_ipp_task_check()
655 static int exynos_drm_ipp_task_setup_buffers(struct exynos_drm_ipp_task *task, in exynos_drm_ipp_task_setup_buffers() argument
658 struct exynos_drm_ipp_buffer *src = &task->src, *dst = &task->dst; in exynos_drm_ipp_task_setup_buffers()
661 DRM_DEBUG_DRIVER("Setting buffer for task %pK\n", task); in exynos_drm_ipp_task_setup_buffers()
665 DRM_DEBUG_DRIVER("Task %pK: src buffer setup failed\n", task); in exynos_drm_ipp_task_setup_buffers()
670 DRM_DEBUG_DRIVER("Task %pK: dst buffer setup failed\n", task); in exynos_drm_ipp_task_setup_buffers()
674 DRM_DEBUG_DRIVER("Task %pK: buffers prepared.\n", task); in exynos_drm_ipp_task_setup_buffers()
680 static int exynos_drm_ipp_event_create(struct exynos_drm_ipp_task *task, in exynos_drm_ipp_event_create() argument
694 ret = drm_event_reserve_init(task->dev, file_priv, &e->base, in exynos_drm_ipp_event_create()
699 task->event = e; in exynos_drm_ipp_event_create()
706 static void exynos_drm_ipp_event_send(struct exynos_drm_ipp_task *task) in exynos_drm_ipp_event_send() argument
711 task->event->event.tv_sec = now.tv_sec; in exynos_drm_ipp_event_send()
712 task->event->event.tv_usec = now.tv_nsec / NSEC_PER_USEC; in exynos_drm_ipp_event_send()
713 task->event->event.sequence = atomic_inc_return(&task->ipp->sequence); in exynos_drm_ipp_event_send()
715 drm_send_event(task->dev, &task->event->base); in exynos_drm_ipp_event_send()
718 static int exynos_drm_ipp_task_cleanup(struct exynos_drm_ipp_task *task) in exynos_drm_ipp_task_cleanup() argument
720 int ret = task->ret; in exynos_drm_ipp_task_cleanup()
722 if (ret == 0 && task->event) { in exynos_drm_ipp_task_cleanup()
723 exynos_drm_ipp_event_send(task); in exynos_drm_ipp_task_cleanup()
725 task->event = NULL; in exynos_drm_ipp_task_cleanup()
728 exynos_drm_ipp_task_free(task->ipp, task); in exynos_drm_ipp_task_cleanup()
734 struct exynos_drm_ipp_task *task = container_of(work, in exynos_drm_ipp_cleanup_work() local
737 exynos_drm_ipp_task_cleanup(task); in exynos_drm_ipp_cleanup_work()
747 void exynos_drm_ipp_task_done(struct exynos_drm_ipp_task *task, int ret) in exynos_drm_ipp_task_done() argument
749 struct exynos_drm_ipp *ipp = task->ipp; in exynos_drm_ipp_task_done()
752 DRM_DEBUG_DRIVER("ipp: %d, task %pK done: %d\n", ipp->id, task, ret); in exynos_drm_ipp_task_done()
755 if (ipp->task == task) in exynos_drm_ipp_task_done()
756 ipp->task = NULL; in exynos_drm_ipp_task_done()
757 task->flags |= DRM_EXYNOS_IPP_TASK_DONE; in exynos_drm_ipp_task_done()
758 task->ret = ret; in exynos_drm_ipp_task_done()
764 if (task->flags & DRM_EXYNOS_IPP_TASK_ASYNC) { in exynos_drm_ipp_task_done()
765 INIT_WORK(&task->cleanup_work, exynos_drm_ipp_cleanup_work); in exynos_drm_ipp_task_done()
766 schedule_work(&task->cleanup_work); in exynos_drm_ipp_task_done()
772 struct exynos_drm_ipp_task *task; in exynos_drm_ipp_next_task() local
780 if (ipp->task || list_empty(&ipp->todo_list)) { in exynos_drm_ipp_next_task()
785 task = list_first_entry(&ipp->todo_list, struct exynos_drm_ipp_task, in exynos_drm_ipp_next_task()
787 list_del_init(&task->head); in exynos_drm_ipp_next_task()
788 ipp->task = task; in exynos_drm_ipp_next_task()
792 DRM_DEBUG_DRIVER("ipp: %d, selected task %pK to run\n", ipp->id, task); in exynos_drm_ipp_next_task()
794 ret = ipp->funcs->commit(ipp, task); in exynos_drm_ipp_next_task()
796 exynos_drm_ipp_task_done(task, ret); in exynos_drm_ipp_next_task()
800 struct exynos_drm_ipp_task *task) in exynos_drm_ipp_schedule_task() argument
805 list_add(&task->head, &ipp->todo_list); in exynos_drm_ipp_schedule_task()
812 struct exynos_drm_ipp_task *task) in exynos_drm_ipp_task_abort() argument
817 if (task->flags & DRM_EXYNOS_IPP_TASK_DONE) { in exynos_drm_ipp_task_abort()
819 exynos_drm_ipp_task_cleanup(task); in exynos_drm_ipp_task_abort()
820 } else if (ipp->task != task) { in exynos_drm_ipp_task_abort()
822 list_del_init(&task->head); in exynos_drm_ipp_task_abort()
823 exynos_drm_ipp_task_cleanup(task); in exynos_drm_ipp_task_abort()
829 task->flags |= DRM_EXYNOS_IPP_TASK_ASYNC; in exynos_drm_ipp_task_abort()
832 ipp->funcs->abort(ipp, task); in exynos_drm_ipp_task_abort()
857 struct exynos_drm_ipp_task *task; in exynos_drm_ipp_commit_ioctl() local
872 task = exynos_drm_ipp_task_alloc(ipp); in exynos_drm_ipp_commit_ioctl()
873 if (!task) in exynos_drm_ipp_commit_ioctl()
876 ret = exynos_drm_ipp_task_set(task, arg); in exynos_drm_ipp_commit_ioctl()
880 ret = exynos_drm_ipp_task_check(task); in exynos_drm_ipp_commit_ioctl()
884 ret = exynos_drm_ipp_task_setup_buffers(task, file_priv); in exynos_drm_ipp_commit_ioctl()
889 ret = exynos_drm_ipp_event_create(task, file_priv, in exynos_drm_ipp_commit_ioctl()
901 ipp->id, task); in exynos_drm_ipp_commit_ioctl()
903 task->flags |= DRM_EXYNOS_IPP_TASK_ASYNC; in exynos_drm_ipp_commit_ioctl()
904 exynos_drm_ipp_schedule_task(task->ipp, task); in exynos_drm_ipp_commit_ioctl()
908 task); in exynos_drm_ipp_commit_ioctl()
909 exynos_drm_ipp_schedule_task(ipp, task); in exynos_drm_ipp_commit_ioctl()
911 task->flags & DRM_EXYNOS_IPP_TASK_DONE); in exynos_drm_ipp_commit_ioctl()
913 exynos_drm_ipp_task_abort(ipp, task); in exynos_drm_ipp_commit_ioctl()
915 ret = exynos_drm_ipp_task_cleanup(task); in exynos_drm_ipp_commit_ioctl()
919 exynos_drm_ipp_task_free(ipp, task); in exynos_drm_ipp_commit_ioctl()