Lines Matching refs:ipp
49 int exynos_drm_ipp_register(struct device *dev, struct exynos_drm_ipp *ipp, in exynos_drm_ipp_register() argument
54 WARN_ON(!ipp); in exynos_drm_ipp_register()
59 spin_lock_init(&ipp->lock); in exynos_drm_ipp_register()
60 INIT_LIST_HEAD(&ipp->todo_list); in exynos_drm_ipp_register()
61 init_waitqueue_head(&ipp->done_wq); in exynos_drm_ipp_register()
62 ipp->dev = dev; in exynos_drm_ipp_register()
63 ipp->funcs = funcs; in exynos_drm_ipp_register()
64 ipp->capabilities = caps; in exynos_drm_ipp_register()
65 ipp->name = name; in exynos_drm_ipp_register()
66 ipp->formats = formats; in exynos_drm_ipp_register()
67 ipp->num_formats = num_formats; in exynos_drm_ipp_register()
70 list_add_tail(&ipp->head, &ipp_list); in exynos_drm_ipp_register()
71 ipp->id = num_ipp++; in exynos_drm_ipp_register()
73 DRM_DEV_DEBUG_DRIVER(dev, "Registered ipp %d\n", ipp->id); in exynos_drm_ipp_register()
84 struct exynos_drm_ipp *ipp) in exynos_drm_ipp_unregister() argument
86 WARN_ON(ipp->task); in exynos_drm_ipp_unregister()
87 WARN_ON(!list_empty(&ipp->todo_list)); in exynos_drm_ipp_unregister()
88 list_del(&ipp->head); in exynos_drm_ipp_unregister()
108 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_get_res_ioctl() local
118 list_for_each_entry(ipp, &ipp_list, head) { in exynos_drm_ipp_get_res_ioctl()
119 if (put_user(ipp->id, ipp_ptr + copied)) in exynos_drm_ipp_get_res_ioctl()
131 struct exynos_drm_ipp *ipp; in __ipp_get() local
133 list_for_each_entry(ipp, &ipp_list, head) in __ipp_get()
134 if (ipp->id == id) in __ipp_get()
135 return ipp; in __ipp_get()
157 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_get_caps_ioctl() local
160 ipp = __ipp_get(resp->ipp_id); in exynos_drm_ipp_get_caps_ioctl()
161 if (!ipp) in exynos_drm_ipp_get_caps_ioctl()
164 resp->ipp_id = ipp->id; in exynos_drm_ipp_get_caps_ioctl()
165 resp->capabilities = ipp->capabilities; in exynos_drm_ipp_get_caps_ioctl()
171 if (resp->formats_count >= ipp->num_formats) { in exynos_drm_ipp_get_caps_ioctl()
172 for (i = 0; i < ipp->num_formats; i++) { in exynos_drm_ipp_get_caps_ioctl()
174 .fourcc = ipp->formats[i].fourcc, in exynos_drm_ipp_get_caps_ioctl()
175 .type = ipp->formats[i].type, in exynos_drm_ipp_get_caps_ioctl()
176 .modifier = ipp->formats[i].modifier, in exynos_drm_ipp_get_caps_ioctl()
184 resp->formats_count = ipp->num_formats; in exynos_drm_ipp_get_caps_ioctl()
190 struct exynos_drm_ipp *ipp, uint32_t fourcc, in __ipp_format_get() argument
195 for (i = 0; i < ipp->num_formats; i++) { in __ipp_format_get()
196 if ((ipp->formats[i].type & type) && in __ipp_format_get()
197 ipp->formats[i].fourcc == fourcc && in __ipp_format_get()
198 ipp->formats[i].modifier == mod) in __ipp_format_get()
199 return &ipp->formats[i]; in __ipp_format_get()
224 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_get_limits_ioctl() local
230 ipp = __ipp_get(resp->ipp_id); in exynos_drm_ipp_get_limits_ioctl()
231 if (!ipp) in exynos_drm_ipp_get_limits_ioctl()
234 format = __ipp_format_get(ipp, resp->fourcc, resp->modifier, in exynos_drm_ipp_get_limits_ioctl()
258 exynos_drm_ipp_task_alloc(struct exynos_drm_ipp *ipp) in exynos_drm_ipp_task_alloc() argument
266 task->dev = ipp->dev; in exynos_drm_ipp_task_alloc()
267 task->ipp = ipp; in exynos_drm_ipp_task_alloc()
394 static void exynos_drm_ipp_task_free(struct exynos_drm_ipp *ipp, in exynos_drm_ipp_task_free() argument
402 drm_event_cancel_free(ipp->drm_dev, &task->event->base); in exynos_drm_ipp_task_free()
557 fmt = __ipp_format_get(task->ipp, buf->buf.fourcc, buf->buf.modifier, in exynos_drm_ipp_check_format()
604 struct exynos_drm_ipp *ipp = task->ipp; in exynos_drm_ipp_task_check() local
639 if ((!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_CROP) && in exynos_drm_ipp_task_check()
641 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_ROTATE) && rotate) || in exynos_drm_ipp_task_check()
642 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_SCALE) && scale) || in exynos_drm_ipp_task_check()
643 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_CONVERT) && in exynos_drm_ipp_task_check()
658 DRM_DEV_DEBUG_DRIVER(ipp->dev, "Task %p: all checks done.\n", in exynos_drm_ipp_task_check()
709 ret = drm_event_reserve_init(task->ipp->drm_dev, file_priv, &e->base, in exynos_drm_ipp_event_create()
728 task->event->event.sequence = atomic_inc_return(&task->ipp->sequence); in exynos_drm_ipp_event_send()
730 drm_send_event(task->ipp->drm_dev, &task->event->base); in exynos_drm_ipp_event_send()
743 exynos_drm_ipp_task_free(task->ipp, task); in exynos_drm_ipp_task_cleanup()
755 static void exynos_drm_ipp_next_task(struct exynos_drm_ipp *ipp);
764 struct exynos_drm_ipp *ipp = task->ipp; in exynos_drm_ipp_task_done() local
768 ipp->id, task, ret); in exynos_drm_ipp_task_done()
770 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_task_done()
771 if (ipp->task == task) in exynos_drm_ipp_task_done()
772 ipp->task = NULL; in exynos_drm_ipp_task_done()
775 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_task_done()
777 exynos_drm_ipp_next_task(ipp); in exynos_drm_ipp_task_done()
778 wake_up(&ipp->done_wq); in exynos_drm_ipp_task_done()
786 static void exynos_drm_ipp_next_task(struct exynos_drm_ipp *ipp) in exynos_drm_ipp_next_task() argument
792 DRM_DEV_DEBUG_DRIVER(ipp->dev, "ipp: %d, try to run new task\n", in exynos_drm_ipp_next_task()
793 ipp->id); in exynos_drm_ipp_next_task()
795 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_next_task()
797 if (ipp->task || list_empty(&ipp->todo_list)) { in exynos_drm_ipp_next_task()
798 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_next_task()
802 task = list_first_entry(&ipp->todo_list, struct exynos_drm_ipp_task, in exynos_drm_ipp_next_task()
805 ipp->task = task; in exynos_drm_ipp_next_task()
807 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_next_task()
809 DRM_DEV_DEBUG_DRIVER(ipp->dev, in exynos_drm_ipp_next_task()
810 "ipp: %d, selected task %p to run\n", ipp->id, in exynos_drm_ipp_next_task()
813 ret = ipp->funcs->commit(ipp, task); in exynos_drm_ipp_next_task()
818 static void exynos_drm_ipp_schedule_task(struct exynos_drm_ipp *ipp, in exynos_drm_ipp_schedule_task() argument
823 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_schedule_task()
824 list_add(&task->head, &ipp->todo_list); in exynos_drm_ipp_schedule_task()
825 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_schedule_task()
827 exynos_drm_ipp_next_task(ipp); in exynos_drm_ipp_schedule_task()
830 static void exynos_drm_ipp_task_abort(struct exynos_drm_ipp *ipp, in exynos_drm_ipp_task_abort() argument
835 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_task_abort()
839 } else if (ipp->task != task) { in exynos_drm_ipp_task_abort()
849 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_task_abort()
850 if (ipp->funcs->abort) in exynos_drm_ipp_task_abort()
851 ipp->funcs->abort(ipp, task); in exynos_drm_ipp_task_abort()
854 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_task_abort()
875 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_commit_ioctl() local
887 ipp = __ipp_get(arg->ipp_id); in exynos_drm_ipp_commit_ioctl()
888 if (!ipp) in exynos_drm_ipp_commit_ioctl()
891 task = exynos_drm_ipp_task_alloc(ipp); in exynos_drm_ipp_commit_ioctl()
919 DRM_DEV_DEBUG_DRIVER(ipp->dev, in exynos_drm_ipp_commit_ioctl()
921 ipp->id, task); in exynos_drm_ipp_commit_ioctl()
924 exynos_drm_ipp_schedule_task(task->ipp, task); in exynos_drm_ipp_commit_ioctl()
927 DRM_DEV_DEBUG_DRIVER(ipp->dev, "ipp: %d, processing task %p\n", in exynos_drm_ipp_commit_ioctl()
928 ipp->id, task); in exynos_drm_ipp_commit_ioctl()
929 exynos_drm_ipp_schedule_task(ipp, task); in exynos_drm_ipp_commit_ioctl()
930 ret = wait_event_interruptible(ipp->done_wq, in exynos_drm_ipp_commit_ioctl()
933 exynos_drm_ipp_task_abort(ipp, task); in exynos_drm_ipp_commit_ioctl()
939 exynos_drm_ipp_task_free(ipp, task); in exynos_drm_ipp_commit_ioctl()