Lines Matching defs:ipp

37  * @ipp: ipp module to init
38 * @funcs: callbacks for the new ipp object
39 * @caps: bitmask of ipp capabilities (%DRM_EXYNOS_IPP_CAP_*)
44 * Initializes a ipp module.
49 int exynos_drm_ipp_register(struct device *dev, struct exynos_drm_ipp *ipp,
54 WARN_ON(!ipp);
59 spin_lock_init(&ipp->lock);
60 INIT_LIST_HEAD(&ipp->todo_list);
61 init_waitqueue_head(&ipp->done_wq);
62 ipp->dev = dev;
63 ipp->funcs = funcs;
64 ipp->capabilities = caps;
65 ipp->name = name;
66 ipp->formats = formats;
67 ipp->num_formats = num_formats;
70 list_add_tail(&ipp->head, &ipp_list);
71 ipp->id = num_ipp++;
73 DRM_DEV_DEBUG_DRIVER(dev, "Registered ipp %d\n", ipp->id);
81 * @ipp: ipp module
84 struct exynos_drm_ipp *ipp)
86 WARN_ON(ipp->task);
87 WARN_ON(!list_empty(&ipp->todo_list));
88 list_del(&ipp->head);
92 * exynos_drm_ipp_get_res_ioctl - enumerate all ipp modules
97 * Construct a list of ipp ids.
108 struct exynos_drm_ipp *ipp;
118 list_for_each_entry(ipp, &ipp_list, head) {
119 if (put_user(ipp->id, ipp_ptr + copied))
131 struct exynos_drm_ipp *ipp;
133 list_for_each_entry(ipp, &ipp_list, head)
134 if (ipp->id == id)
135 return ipp;
140 * exynos_drm_ipp_get_caps_ioctl - get ipp module capabilities and formats
145 * Construct a structure describing ipp module capabilities.
157 struct exynos_drm_ipp *ipp;
160 ipp = __ipp_get(resp->ipp_id);
161 if (!ipp)
164 resp->ipp_id = ipp->id;
165 resp->capabilities = ipp->capabilities;
171 if (resp->formats_count >= ipp->num_formats) {
172 for (i = 0; i < ipp->num_formats; i++) {
174 .fourcc = ipp->formats[i].fourcc,
175 .type = ipp->formats[i].type,
176 .modifier = ipp->formats[i].modifier,
184 resp->formats_count = ipp->num_formats;
190 struct exynos_drm_ipp *ipp, uint32_t fourcc,
195 for (i = 0; i < ipp->num_formats; i++) {
196 if ((ipp->formats[i].type & type) &&
197 ipp->formats[i].fourcc == fourcc &&
198 ipp->formats[i].modifier == mod)
199 return &ipp->formats[i];
205 * exynos_drm_ipp_get_limits_ioctl - get ipp module limits
210 * Construct a structure describing ipp module limitations for provided
224 struct exynos_drm_ipp *ipp;
230 ipp = __ipp_get(resp->ipp_id);
231 if (!ipp)
234 format = __ipp_format_get(ipp, resp->fourcc, resp->modifier,
258 exynos_drm_ipp_task_alloc(struct exynos_drm_ipp *ipp)
266 task->dev = ipp->dev;
267 task->ipp = ipp;
394 static void exynos_drm_ipp_task_free(struct exynos_drm_ipp *ipp,
402 drm_event_cancel_free(ipp->drm_dev, &task->event->base);
557 fmt = __ipp_format_get(task->ipp, buf->buf.fourcc, buf->buf.modifier,
604 struct exynos_drm_ipp *ipp = task->ipp;
639 if ((!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_CROP) &&
641 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_ROTATE) && rotate) ||
642 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_SCALE) && scale) ||
643 (!(ipp->capabilities & DRM_EXYNOS_IPP_CAP_CONVERT) &&
658 DRM_DEV_DEBUG_DRIVER(ipp->dev, "Task %pK: all checks done.\n",
709 ret = drm_event_reserve_init(task->ipp->drm_dev, file_priv, &e->base,
728 task->event->event.sequence = atomic_inc_return(&task->ipp->sequence);
730 drm_send_event(task->ipp->drm_dev, &task->event->base);
743 exynos_drm_ipp_task_free(task->ipp, task);
755 static void exynos_drm_ipp_next_task(struct exynos_drm_ipp *ipp);
759 * @task: ipp task to finish
764 struct exynos_drm_ipp *ipp = task->ipp;
767 DRM_DEV_DEBUG_DRIVER(task->dev, "ipp: %d, task %pK done: %d\n",
768 ipp->id, task, ret);
770 spin_lock_irqsave(&ipp->lock, flags);
771 if (ipp->task == task)
772 ipp->task = NULL;
775 spin_unlock_irqrestore(&ipp->lock, flags);
777 exynos_drm_ipp_next_task(ipp);
778 wake_up(&ipp->done_wq);
786 static void exynos_drm_ipp_next_task(struct exynos_drm_ipp *ipp)
792 DRM_DEV_DEBUG_DRIVER(ipp->dev, "ipp: %d, try to run new task\n",
793 ipp->id);
795 spin_lock_irqsave(&ipp->lock, flags);
797 if (ipp->task || list_empty(&ipp->todo_list)) {
798 spin_unlock_irqrestore(&ipp->lock, flags);
802 task = list_first_entry(&ipp->todo_list, struct exynos_drm_ipp_task,
805 ipp->task = task;
807 spin_unlock_irqrestore(&ipp->lock, flags);
809 DRM_DEV_DEBUG_DRIVER(ipp->dev,
810 "ipp: %d, selected task %pK to run\n", ipp->id,
813 ret = ipp->funcs->commit(ipp, task);
818 static void exynos_drm_ipp_schedule_task(struct exynos_drm_ipp *ipp,
823 spin_lock_irqsave(&ipp->lock, flags);
824 list_add(&task->head, &ipp->todo_list);
825 spin_unlock_irqrestore(&ipp->lock, flags);
827 exynos_drm_ipp_next_task(ipp);
830 static void exynos_drm_ipp_task_abort(struct exynos_drm_ipp *ipp,
835 spin_lock_irqsave(&ipp->lock, flags);
839 } else if (ipp->task != task) {
849 spin_unlock_irqrestore(&ipp->lock, flags);
850 if (ipp->funcs->abort)
851 ipp->funcs->abort(ipp, task);
854 spin_unlock_irqrestore(&ipp->lock, flags);
863 * Construct a ipp task from the set of properties provided from the user
875 struct exynos_drm_ipp *ipp;
887 ipp = __ipp_get(arg->ipp_id);
888 if (!ipp)
891 task = exynos_drm_ipp_task_alloc(ipp);
919 DRM_DEV_DEBUG_DRIVER(ipp->dev,
920 "ipp: %d, nonblocking processing task %pK\n",
921 ipp->id, task);
924 exynos_drm_ipp_schedule_task(task->ipp, task);
927 DRM_DEV_DEBUG_DRIVER(ipp->dev, "ipp: %d, processing task %pK\n",
928 ipp->id, task);
929 exynos_drm_ipp_schedule_task(ipp, task);
930 ret = wait_event_interruptible(ipp->done_wq,
933 exynos_drm_ipp_task_abort(ipp, task);
939 exynos_drm_ipp_task_free(ipp, task);