Lines Matching refs:ipp

48 int exynos_drm_ipp_register(struct device *dev, struct exynos_drm_ipp *ipp,  in exynos_drm_ipp_register()  argument
53 WARN_ON(!ipp); in exynos_drm_ipp_register()
58 spin_lock_init(&ipp->lock); in exynos_drm_ipp_register()
59 INIT_LIST_HEAD(&ipp->todo_list); in exynos_drm_ipp_register()
60 init_waitqueue_head(&ipp->done_wq); in exynos_drm_ipp_register()
61 ipp->dev = dev; in exynos_drm_ipp_register()
62 ipp->funcs = funcs; in exynos_drm_ipp_register()
63 ipp->capabilities = caps; in exynos_drm_ipp_register()
64 ipp->name = name; in exynos_drm_ipp_register()
65 ipp->formats = formats; in exynos_drm_ipp_register()
66 ipp->num_formats = num_formats; in exynos_drm_ipp_register()
69 list_add_tail(&ipp->head, &ipp_list); in exynos_drm_ipp_register()
70 ipp->id = num_ipp++; in exynos_drm_ipp_register()
72 DRM_DEV_DEBUG_DRIVER(dev, "Registered ipp %d\n", ipp->id); in exynos_drm_ipp_register()
83 struct exynos_drm_ipp *ipp) in exynos_drm_ipp_unregister() argument
85 WARN_ON(ipp->task); in exynos_drm_ipp_unregister()
86 WARN_ON(!list_empty(&ipp->todo_list)); in exynos_drm_ipp_unregister()
87 list_del(&ipp->head); in exynos_drm_ipp_unregister()
107 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_get_res_ioctl() local
117 list_for_each_entry(ipp, &ipp_list, head) { in exynos_drm_ipp_get_res_ioctl()
118 if (put_user(ipp->id, ipp_ptr + copied)) in exynos_drm_ipp_get_res_ioctl()
130 struct exynos_drm_ipp *ipp; in __ipp_get() local
132 list_for_each_entry(ipp, &ipp_list, head) in __ipp_get()
133 if (ipp->id == id) in __ipp_get()
134 return ipp; in __ipp_get()
156 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_get_caps_ioctl() local
159 ipp = __ipp_get(resp->ipp_id); in exynos_drm_ipp_get_caps_ioctl()
160 if (!ipp) in exynos_drm_ipp_get_caps_ioctl()
163 resp->ipp_id = ipp->id; in exynos_drm_ipp_get_caps_ioctl()
164 resp->capabilities = ipp->capabilities; in exynos_drm_ipp_get_caps_ioctl()
170 if (resp->formats_count >= ipp->num_formats) { in exynos_drm_ipp_get_caps_ioctl()
171 for (i = 0; i < ipp->num_formats; i++) { in exynos_drm_ipp_get_caps_ioctl()
173 .fourcc = ipp->formats[i].fourcc, in exynos_drm_ipp_get_caps_ioctl()
174 .type = ipp->formats[i].type, in exynos_drm_ipp_get_caps_ioctl()
175 .modifier = ipp->formats[i].modifier, in exynos_drm_ipp_get_caps_ioctl()
183 resp->formats_count = ipp->num_formats; in exynos_drm_ipp_get_caps_ioctl()
189 struct exynos_drm_ipp *ipp, uint32_t fourcc, in __ipp_format_get() argument
194 for (i = 0; i < ipp->num_formats; i++) { in __ipp_format_get()
195 if ((ipp->formats[i].type & type) && in __ipp_format_get()
196 ipp->formats[i].fourcc == fourcc && in __ipp_format_get()
197 ipp->formats[i].modifier == mod) in __ipp_format_get()
198 return &ipp->formats[i]; in __ipp_format_get()
223 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_get_limits_ioctl() local
229 ipp = __ipp_get(resp->ipp_id); in exynos_drm_ipp_get_limits_ioctl()
230 if (!ipp) in exynos_drm_ipp_get_limits_ioctl()
233 format = __ipp_format_get(ipp, resp->fourcc, resp->modifier, in exynos_drm_ipp_get_limits_ioctl()
257 exynos_drm_ipp_task_alloc(struct exynos_drm_ipp *ipp) in exynos_drm_ipp_task_alloc() argument
265 task->dev = ipp->dev; in exynos_drm_ipp_task_alloc()
266 task->ipp = ipp; in exynos_drm_ipp_task_alloc()
393 static void exynos_drm_ipp_task_free(struct exynos_drm_ipp *ipp, in exynos_drm_ipp_task_free() argument
401 drm_event_cancel_free(ipp->drm_dev, &task->event->base); in exynos_drm_ipp_task_free()
556 fmt = __ipp_format_get(task->ipp, buf->buf.fourcc, buf->buf.modifier, in exynos_drm_ipp_check_format()
603 struct exynos_drm_ipp *ipp = task->ipp; in exynos_drm_ipp_task_check() local
638 if ((!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_CROP) && in exynos_drm_ipp_task_check()
640 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_ROTATE) && rotate) || in exynos_drm_ipp_task_check()
641 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_SCALE) && scale) || in exynos_drm_ipp_task_check()
642 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_CONVERT) && in exynos_drm_ipp_task_check()
657 DRM_DEV_DEBUG_DRIVER(ipp->dev, "Task %pK: all checks done.\n", in exynos_drm_ipp_task_check()
708 ret = drm_event_reserve_init(task->ipp->drm_dev, file_priv, &e->base, in exynos_drm_ipp_event_create()
727 task->event->event.sequence = atomic_inc_return(&task->ipp->sequence); in exynos_drm_ipp_event_send()
729 drm_send_event(task->ipp->drm_dev, &task->event->base); in exynos_drm_ipp_event_send()
742 exynos_drm_ipp_task_free(task->ipp, task); in exynos_drm_ipp_task_cleanup()
754 static void exynos_drm_ipp_next_task(struct exynos_drm_ipp *ipp);
763 struct exynos_drm_ipp *ipp = task->ipp; in exynos_drm_ipp_task_done() local
767 ipp->id, task, ret); in exynos_drm_ipp_task_done()
769 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_task_done()
770 if (ipp->task == task) in exynos_drm_ipp_task_done()
771 ipp->task = NULL; in exynos_drm_ipp_task_done()
774 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_task_done()
776 exynos_drm_ipp_next_task(ipp); in exynos_drm_ipp_task_done()
777 wake_up(&ipp->done_wq); in exynos_drm_ipp_task_done()
785 static void exynos_drm_ipp_next_task(struct exynos_drm_ipp *ipp) in exynos_drm_ipp_next_task() argument
791 DRM_DEV_DEBUG_DRIVER(ipp->dev, "ipp: %d, try to run new task\n", in exynos_drm_ipp_next_task()
792 ipp->id); in exynos_drm_ipp_next_task()
794 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_next_task()
796 if (ipp->task || list_empty(&ipp->todo_list)) { in exynos_drm_ipp_next_task()
797 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_next_task()
801 task = list_first_entry(&ipp->todo_list, struct exynos_drm_ipp_task, in exynos_drm_ipp_next_task()
804 ipp->task = task; in exynos_drm_ipp_next_task()
806 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_next_task()
808 DRM_DEV_DEBUG_DRIVER(ipp->dev, in exynos_drm_ipp_next_task()
809 "ipp: %d, selected task %pK to run\n", ipp->id, in exynos_drm_ipp_next_task()
812 ret = ipp->funcs->commit(ipp, task); in exynos_drm_ipp_next_task()
817 static void exynos_drm_ipp_schedule_task(struct exynos_drm_ipp *ipp, in exynos_drm_ipp_schedule_task() argument
822 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_schedule_task()
823 list_add(&task->head, &ipp->todo_list); in exynos_drm_ipp_schedule_task()
824 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_schedule_task()
826 exynos_drm_ipp_next_task(ipp); in exynos_drm_ipp_schedule_task()
829 static void exynos_drm_ipp_task_abort(struct exynos_drm_ipp *ipp, in exynos_drm_ipp_task_abort() argument
834 spin_lock_irqsave(&ipp->lock, flags); in exynos_drm_ipp_task_abort()
838 } else if (ipp->task != task) { in exynos_drm_ipp_task_abort()
848 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_task_abort()
849 if (ipp->funcs->abort) in exynos_drm_ipp_task_abort()
850 ipp->funcs->abort(ipp, task); in exynos_drm_ipp_task_abort()
853 spin_unlock_irqrestore(&ipp->lock, flags); in exynos_drm_ipp_task_abort()
874 struct exynos_drm_ipp *ipp; in exynos_drm_ipp_commit_ioctl() local
886 ipp = __ipp_get(arg->ipp_id); in exynos_drm_ipp_commit_ioctl()
887 if (!ipp) in exynos_drm_ipp_commit_ioctl()
890 task = exynos_drm_ipp_task_alloc(ipp); in exynos_drm_ipp_commit_ioctl()
918 DRM_DEV_DEBUG_DRIVER(ipp->dev, in exynos_drm_ipp_commit_ioctl()
920 ipp->id, task); in exynos_drm_ipp_commit_ioctl()
923 exynos_drm_ipp_schedule_task(task->ipp, task); in exynos_drm_ipp_commit_ioctl()
926 DRM_DEV_DEBUG_DRIVER(ipp->dev, "ipp: %d, processing task %pK\n", in exynos_drm_ipp_commit_ioctl()
927 ipp->id, task); in exynos_drm_ipp_commit_ioctl()
928 exynos_drm_ipp_schedule_task(ipp, task); in exynos_drm_ipp_commit_ioctl()
929 ret = wait_event_interruptible(ipp->done_wq, in exynos_drm_ipp_commit_ioctl()
932 exynos_drm_ipp_task_abort(ipp, task); in exynos_drm_ipp_commit_ioctl()
938 exynos_drm_ipp_task_free(ipp, task); in exynos_drm_ipp_commit_ioctl()