Lines Matching refs:ipp
46 int exynos_drm_ipp_register(struct drm_device *dev, struct exynos_drm_ipp *ipp, in exynos_drm_ipp_register() argument
51 WARN_ON(!ipp); in exynos_drm_ipp_register()
56 spin_lock_init(&ipp->lock); in exynos_drm_ipp_register()
57 INIT_LIST_HEAD(&ipp->todo_list); in exynos_drm_ipp_register()
58 init_waitqueue_head(&ipp->done_wq); in exynos_drm_ipp_register()
59 ipp->dev = dev; in exynos_drm_ipp_register()
60 ipp->funcs = funcs; in exynos_drm_ipp_register()
61 ipp->capabilities = caps; in exynos_drm_ipp_register()
62 ipp->name = name; in exynos_drm_ipp_register()
63 ipp->formats = formats; in exynos_drm_ipp_register()
64 ipp->num_formats = num_formats; in exynos_drm_ipp_register()
67 list_add_tail(&ipp->head, &ipp_list); in exynos_drm_ipp_register()
68 ipp->id = num_ipp++; in exynos_drm_ipp_register()
70 DRM_DEBUG_DRIVER("Registered ipp %d\n", ipp->id); in exynos_drm_ipp_register()
81 struct exynos_drm_ipp *ipp) in exynos_drm_ipp_unregister() argument
83 WARN_ON(ipp->task); in exynos_drm_ipp_unregister()
84 WARN_ON(!list_empty(&ipp->todo_list)); in exynos_drm_ipp_unregister()
85 list_del(&ipp->head); in exynos_drm_ipp_unregister()
105 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_get_res_ioctl() local
115 list_for_each_entry(ipp, &ipp_list, head) { in exynos_drm_ipp_get_res_ioctl()
116 if (put_user(ipp->id, ipp_ptr + copied)) in exynos_drm_ipp_get_res_ioctl()
128 struct exynos_drm_ipp *ipp; in __ipp_get() local
130 list_for_each_entry(ipp, &ipp_list, head) in __ipp_get()
131 if (ipp->id == id) in __ipp_get()
132 return ipp; in __ipp_get()
154 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_get_caps_ioctl() local
157 ipp = __ipp_get(resp->ipp_id); in exynos_drm_ipp_get_caps_ioctl()
158 if (!ipp) in exynos_drm_ipp_get_caps_ioctl()
161 resp->ipp_id = ipp->id; in exynos_drm_ipp_get_caps_ioctl()
162 resp->capabilities = ipp->capabilities; in exynos_drm_ipp_get_caps_ioctl()
168 if (resp->formats_count >= ipp->num_formats) { in exynos_drm_ipp_get_caps_ioctl()
169 for (i = 0; i < ipp->num_formats; i++) { in exynos_drm_ipp_get_caps_ioctl()
171 .fourcc = ipp->formats[i].fourcc, in exynos_drm_ipp_get_caps_ioctl()
172 .type = ipp->formats[i].type, in exynos_drm_ipp_get_caps_ioctl()
173 .modifier = ipp->formats[i].modifier, in exynos_drm_ipp_get_caps_ioctl()
181 resp->formats_count = ipp->num_formats; in exynos_drm_ipp_get_caps_ioctl()
187 struct exynos_drm_ipp *ipp, uint32_t fourcc, in __ipp_format_get() argument
192 for (i = 0; i < ipp->num_formats; i++) { in __ipp_format_get()
193 if ((ipp->formats[i].type & type) && in __ipp_format_get()
194 ipp->formats[i].fourcc == fourcc && in __ipp_format_get()
195 ipp->formats[i].modifier == mod) in __ipp_format_get()
196 return &ipp->formats[i]; in __ipp_format_get()
221 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_get_limits_ioctl() local
227 ipp = __ipp_get(resp->ipp_id); in exynos_drm_ipp_get_limits_ioctl()
228 if (!ipp) in exynos_drm_ipp_get_limits_ioctl()
231 format = __ipp_format_get(ipp, resp->fourcc, resp->modifier, in exynos_drm_ipp_get_limits_ioctl()
255 exynos_drm_ipp_task_alloc(struct exynos_drm_ipp *ipp) in exynos_drm_ipp_task_alloc() argument
263 task->dev = ipp->dev; in exynos_drm_ipp_task_alloc()
264 task->ipp = ipp; in exynos_drm_ipp_task_alloc()
389 static void exynos_drm_ipp_task_free(struct exynos_drm_ipp *ipp, in exynos_drm_ipp_task_free() argument
397 drm_event_cancel_free(ipp->dev, &task->event->base); in exynos_drm_ipp_task_free()
552 fmt = __ipp_format_get(task->ipp, buf->buf.fourcc, buf->buf.modifier, in exynos_drm_ipp_check_format()
598 struct exynos_drm_ipp *ipp = task->ipp; in exynos_drm_ipp_task_check() local
632 if ((!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_CROP) && in exynos_drm_ipp_task_check()
634 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_ROTATE) && rotate) || in exynos_drm_ipp_task_check()
635 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_SCALE) && scale) || in exynos_drm_ipp_task_check()
636 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_CONVERT) && in exynos_drm_ipp_task_check()
713 task->event->event.sequence = atomic_inc_return(&task->ipp->sequence); in exynos_drm_ipp_event_send()
728 exynos_drm_ipp_task_free(task->ipp, task); in exynos_drm_ipp_task_cleanup()
740 static void exynos_drm_ipp_next_task(struct exynos_drm_ipp *ipp);
749 struct exynos_drm_ipp *ipp = task->ipp; in exynos_drm_ipp_task_done() local
752 DRM_DEBUG_DRIVER("ipp: %d, task %pK done: %d\n", ipp->id, task, ret); in exynos_drm_ipp_task_done()
754 spin_lock_irqsave(&ipp->lock, flags); 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()
759 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_task_done()
761 exynos_drm_ipp_next_task(ipp); in exynos_drm_ipp_task_done()
762 wake_up(&ipp->done_wq); in exynos_drm_ipp_task_done()
770 static void exynos_drm_ipp_next_task(struct exynos_drm_ipp *ipp) in exynos_drm_ipp_next_task() argument
776 DRM_DEBUG_DRIVER("ipp: %d, try to run new task\n", ipp->id); in exynos_drm_ipp_next_task()
778 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_next_task()
780 if (ipp->task || list_empty(&ipp->todo_list)) { in exynos_drm_ipp_next_task()
781 spin_unlock_irqrestore(&ipp->lock, flags); 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()
788 ipp->task = task; in exynos_drm_ipp_next_task()
790 spin_unlock_irqrestore(&ipp->lock, flags); 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()
799 static void exynos_drm_ipp_schedule_task(struct exynos_drm_ipp *ipp, in exynos_drm_ipp_schedule_task() argument
804 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_schedule_task()
805 list_add(&task->head, &ipp->todo_list); in exynos_drm_ipp_schedule_task()
806 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_schedule_task()
808 exynos_drm_ipp_next_task(ipp); in exynos_drm_ipp_schedule_task()
811 static void exynos_drm_ipp_task_abort(struct exynos_drm_ipp *ipp, in exynos_drm_ipp_task_abort() argument
816 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_task_abort()
820 } else if (ipp->task != task) { in exynos_drm_ipp_task_abort()
830 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_task_abort()
831 if (ipp->funcs->abort) in exynos_drm_ipp_task_abort()
832 ipp->funcs->abort(ipp, task); in exynos_drm_ipp_task_abort()
835 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_task_abort()
856 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_commit_ioctl() local
868 ipp = __ipp_get(arg->ipp_id); in exynos_drm_ipp_commit_ioctl()
869 if (!ipp) in exynos_drm_ipp_commit_ioctl()
872 task = exynos_drm_ipp_task_alloc(ipp); in exynos_drm_ipp_commit_ioctl()
901 ipp->id, task); in exynos_drm_ipp_commit_ioctl()
904 exynos_drm_ipp_schedule_task(task->ipp, task); in exynos_drm_ipp_commit_ioctl()
907 DRM_DEBUG_DRIVER("ipp: %d, processing task %pK\n", ipp->id, in exynos_drm_ipp_commit_ioctl()
909 exynos_drm_ipp_schedule_task(ipp, task); in exynos_drm_ipp_commit_ioctl()
910 ret = wait_event_interruptible(ipp->done_wq, in exynos_drm_ipp_commit_ioctl()
913 exynos_drm_ipp_task_abort(ipp, task); in exynos_drm_ipp_commit_ioctl()
919 exynos_drm_ipp_task_free(ipp, task); in exynos_drm_ipp_commit_ioctl()