1 /*
2  * Copyright (C) 2012 Samsung Electronics Co.Ltd
3  * Authors:
4  *	Eunchul Kim <chulspro.kim@samsung.com>
5  *	Jinyoung Jeon <jy0.jeon@samsung.com>
6  *	Sangmin Lee <lsmin.lee@samsung.com>
7  *
8  * This program is free software; you can redistribute  it and/or modify it
9  * under  the terms of  the GNU General  Public License as published by the
10  * Free Software Foundation;  either version 2 of the  License, or (at your
11  * option) any later version.
12  *
13  */
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/platform_device.h>
17 #include <linux/types.h>
18 #include <linux/clk.h>
19 #include <linux/pm_runtime.h>
20 #include <plat/map-base.h>
21 
22 #include <drm/drmP.h>
23 #include <drm/exynos_drm.h>
24 #include "exynos_drm_drv.h"
25 #include "exynos_drm_gem.h"
26 #include "exynos_drm_ipp.h"
27 #include "exynos_drm_iommu.h"
28 
29 /*
30  * IPP stands for Image Post Processing and
31  * supports image scaler/rotator and input/output DMA operations.
32  * using FIMC, GSC, Rotator, so on.
33  * IPP is integration device driver of same attribute h/w
34  */
35 
36 /*
37  * TODO
38  * 1. expand command control id.
39  * 2. integrate	property and config.
40  * 3. removed send_event id check routine.
41  * 4. compare send_event id if needed.
42  * 5. free subdrv_remove notifier callback list if needed.
43  * 6. need to check subdrv_open about multi-open.
44  * 7. need to power_on implement power and sysmmu ctrl.
45  */
46 
47 #define get_ipp_context(dev)	platform_get_drvdata(to_platform_device(dev))
48 #define ipp_is_m2m_cmd(c)	(c == IPP_CMD_M2M)
49 
50 /*
51  * A structure of event.
52  *
53  * @base: base of event.
54  * @event: ipp event.
55  */
56 struct drm_exynos_ipp_send_event {
57 	struct drm_pending_event	base;
58 	struct drm_exynos_ipp_event	event;
59 };
60 
61 /*
62  * A structure of memory node.
63  *
64  * @list: list head to memory queue information.
65  * @ops_id: id of operations.
66  * @prop_id: id of property.
67  * @buf_id: id of buffer.
68  * @buf_info: gem objects and dma address, size.
69  * @filp: a pointer to drm_file.
70  */
71 struct drm_exynos_ipp_mem_node {
72 	struct list_head	list;
73 	enum drm_exynos_ops_id	ops_id;
74 	u32	prop_id;
75 	u32	buf_id;
76 	struct drm_exynos_ipp_buf_info	buf_info;
77 	struct drm_file		*filp;
78 };
79 
80 /*
81  * A structure of ipp context.
82  *
83  * @subdrv: prepare initialization using subdrv.
84  * @ipp_lock: lock for synchronization of access to ipp_idr.
85  * @prop_lock: lock for synchronization of access to prop_idr.
86  * @ipp_idr: ipp driver idr.
87  * @prop_idr: property idr.
88  * @event_workq: event work queue.
89  * @cmd_workq: command work queue.
90  */
91 struct ipp_context {
92 	struct exynos_drm_subdrv	subdrv;
93 	struct mutex	ipp_lock;
94 	struct mutex	prop_lock;
95 	struct idr	ipp_idr;
96 	struct idr	prop_idr;
97 	struct workqueue_struct	*event_workq;
98 	struct workqueue_struct	*cmd_workq;
99 };
100 
101 static LIST_HEAD(exynos_drm_ippdrv_list);
102 static DEFINE_MUTEX(exynos_drm_ippdrv_lock);
103 static BLOCKING_NOTIFIER_HEAD(exynos_drm_ippnb_list);
104 
105 int exynos_drm_ippdrv_register(struct exynos_drm_ippdrv *ippdrv)
106 {
107 	DRM_DEBUG_KMS("%s\n", __func__);
108 
109 	if (!ippdrv)
110 		return -EINVAL;
111 
112 	mutex_lock(&exynos_drm_ippdrv_lock);
113 	list_add_tail(&ippdrv->drv_list, &exynos_drm_ippdrv_list);
114 	mutex_unlock(&exynos_drm_ippdrv_lock);
115 
116 	return 0;
117 }
118 
119 int exynos_drm_ippdrv_unregister(struct exynos_drm_ippdrv *ippdrv)
120 {
121 	DRM_DEBUG_KMS("%s\n", __func__);
122 
123 	if (!ippdrv)
124 		return -EINVAL;
125 
126 	mutex_lock(&exynos_drm_ippdrv_lock);
127 	list_del(&ippdrv->drv_list);
128 	mutex_unlock(&exynos_drm_ippdrv_lock);
129 
130 	return 0;
131 }
132 
133 static int ipp_create_id(struct idr *id_idr, struct mutex *lock, void *obj,
134 		u32 *idp)
135 {
136 	int ret;
137 
138 	DRM_DEBUG_KMS("%s\n", __func__);
139 
140 	/* do the allocation under our mutexlock */
141 	mutex_lock(lock);
142 	ret = idr_alloc(id_idr, obj, 1, 0, GFP_KERNEL);
143 	mutex_unlock(lock);
144 	if (ret < 0)
145 		return ret;
146 
147 	*idp = ret;
148 	return 0;
149 }
150 
151 static void *ipp_find_obj(struct idr *id_idr, struct mutex *lock, u32 id)
152 {
153 	void *obj;
154 
155 	DRM_DEBUG_KMS("%s:id[%d]\n", __func__, id);
156 
157 	mutex_lock(lock);
158 
159 	/* find object using handle */
160 	obj = idr_find(id_idr, id);
161 	if (!obj) {
162 		DRM_ERROR("failed to find object.\n");
163 		mutex_unlock(lock);
164 		return ERR_PTR(-ENODEV);
165 	}
166 
167 	mutex_unlock(lock);
168 
169 	return obj;
170 }
171 
172 static inline bool ipp_check_dedicated(struct exynos_drm_ippdrv *ippdrv,
173 		enum drm_exynos_ipp_cmd	cmd)
174 {
175 	/*
176 	 * check dedicated flag and WB, OUTPUT operation with
177 	 * power on state.
178 	 */
179 	if (ippdrv->dedicated || (!ipp_is_m2m_cmd(cmd) &&
180 	    !pm_runtime_suspended(ippdrv->dev)))
181 		return true;
182 
183 	return false;
184 }
185 
186 static struct exynos_drm_ippdrv *ipp_find_driver(struct ipp_context *ctx,
187 		struct drm_exynos_ipp_property *property)
188 {
189 	struct exynos_drm_ippdrv *ippdrv;
190 	u32 ipp_id = property->ipp_id;
191 
192 	DRM_DEBUG_KMS("%s:ipp_id[%d]\n", __func__, ipp_id);
193 
194 	if (ipp_id) {
195 		/* find ipp driver using idr */
196 		ippdrv = ipp_find_obj(&ctx->ipp_idr, &ctx->ipp_lock,
197 			ipp_id);
198 		if (IS_ERR_OR_NULL(ippdrv)) {
199 			DRM_ERROR("not found ipp%d driver.\n", ipp_id);
200 			return ippdrv;
201 		}
202 
203 		/*
204 		 * WB, OUTPUT opertion not supported multi-operation.
205 		 * so, make dedicated state at set property ioctl.
206 		 * when ipp driver finished operations, clear dedicated flags.
207 		 */
208 		if (ipp_check_dedicated(ippdrv, property->cmd)) {
209 			DRM_ERROR("already used choose device.\n");
210 			return ERR_PTR(-EBUSY);
211 		}
212 
213 		/*
214 		 * This is necessary to find correct device in ipp drivers.
215 		 * ipp drivers have different abilities,
216 		 * so need to check property.
217 		 */
218 		if (ippdrv->check_property &&
219 		    ippdrv->check_property(ippdrv->dev, property)) {
220 			DRM_ERROR("not support property.\n");
221 			return ERR_PTR(-EINVAL);
222 		}
223 
224 		return ippdrv;
225 	} else {
226 		/*
227 		 * This case is search all ipp driver for finding.
228 		 * user application don't set ipp_id in this case,
229 		 * so ipp subsystem search correct driver in driver list.
230 		 */
231 		list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list) {
232 			if (ipp_check_dedicated(ippdrv, property->cmd)) {
233 				DRM_DEBUG_KMS("%s:used device.\n", __func__);
234 				continue;
235 			}
236 
237 			if (ippdrv->check_property &&
238 			    ippdrv->check_property(ippdrv->dev, property)) {
239 				DRM_DEBUG_KMS("%s:not support property.\n",
240 					__func__);
241 				continue;
242 			}
243 
244 			return ippdrv;
245 		}
246 
247 		DRM_ERROR("not support ipp driver operations.\n");
248 	}
249 
250 	return ERR_PTR(-ENODEV);
251 }
252 
253 static struct exynos_drm_ippdrv *ipp_find_drv_by_handle(u32 prop_id)
254 {
255 	struct exynos_drm_ippdrv *ippdrv;
256 	struct drm_exynos_ipp_cmd_node *c_node;
257 	int count = 0;
258 
259 	DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, prop_id);
260 
261 	if (list_empty(&exynos_drm_ippdrv_list)) {
262 		DRM_DEBUG_KMS("%s:ippdrv_list is empty.\n", __func__);
263 		return ERR_PTR(-ENODEV);
264 	}
265 
266 	/*
267 	 * This case is search ipp driver by prop_id handle.
268 	 * sometimes, ipp subsystem find driver by prop_id.
269 	 * e.g PAUSE state, queue buf, command contro.
270 	 */
271 	list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list) {
272 		DRM_DEBUG_KMS("%s:count[%d]ippdrv[0x%x]\n", __func__,
273 			count++, (int)ippdrv);
274 
275 		if (!list_empty(&ippdrv->cmd_list)) {
276 			list_for_each_entry(c_node, &ippdrv->cmd_list, list)
277 				if (c_node->property.prop_id == prop_id)
278 					return ippdrv;
279 		}
280 	}
281 
282 	return ERR_PTR(-ENODEV);
283 }
284 
285 int exynos_drm_ipp_get_property(struct drm_device *drm_dev, void *data,
286 		struct drm_file *file)
287 {
288 	struct drm_exynos_file_private *file_priv = file->driver_priv;
289 	struct exynos_drm_ipp_private *priv = file_priv->ipp_priv;
290 	struct device *dev = priv->dev;
291 	struct ipp_context *ctx = get_ipp_context(dev);
292 	struct drm_exynos_ipp_prop_list *prop_list = data;
293 	struct exynos_drm_ippdrv *ippdrv;
294 	int count = 0;
295 
296 	DRM_DEBUG_KMS("%s\n", __func__);
297 
298 	if (!ctx) {
299 		DRM_ERROR("invalid context.\n");
300 		return -EINVAL;
301 	}
302 
303 	if (!prop_list) {
304 		DRM_ERROR("invalid property parameter.\n");
305 		return -EINVAL;
306 	}
307 
308 	DRM_DEBUG_KMS("%s:ipp_id[%d]\n", __func__, prop_list->ipp_id);
309 
310 	if (!prop_list->ipp_id) {
311 		list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list)
312 			count++;
313 		/*
314 		 * Supports ippdrv list count for user application.
315 		 * First step user application getting ippdrv count.
316 		 * and second step getting ippdrv capability using ipp_id.
317 		 */
318 		prop_list->count = count;
319 	} else {
320 		/*
321 		 * Getting ippdrv capability by ipp_id.
322 		 * some deivce not supported wb, output interface.
323 		 * so, user application detect correct ipp driver
324 		 * using this ioctl.
325 		 */
326 		ippdrv = ipp_find_obj(&ctx->ipp_idr, &ctx->ipp_lock,
327 						prop_list->ipp_id);
328 		if (!ippdrv) {
329 			DRM_ERROR("not found ipp%d driver.\n",
330 					prop_list->ipp_id);
331 			return -EINVAL;
332 		}
333 
334 		prop_list = ippdrv->prop_list;
335 	}
336 
337 	return 0;
338 }
339 
340 static void ipp_print_property(struct drm_exynos_ipp_property *property,
341 		int idx)
342 {
343 	struct drm_exynos_ipp_config *config = &property->config[idx];
344 	struct drm_exynos_pos *pos = &config->pos;
345 	struct drm_exynos_sz *sz = &config->sz;
346 
347 	DRM_DEBUG_KMS("%s:prop_id[%d]ops[%s]fmt[0x%x]\n",
348 		__func__, property->prop_id, idx ? "dst" : "src", config->fmt);
349 
350 	DRM_DEBUG_KMS("%s:pos[%d %d %d %d]sz[%d %d]f[%d]r[%d]\n",
351 		__func__, pos->x, pos->y, pos->w, pos->h,
352 		sz->hsize, sz->vsize, config->flip, config->degree);
353 }
354 
355 static int ipp_find_and_set_property(struct drm_exynos_ipp_property *property)
356 {
357 	struct exynos_drm_ippdrv *ippdrv;
358 	struct drm_exynos_ipp_cmd_node *c_node;
359 	u32 prop_id = property->prop_id;
360 
361 	DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, prop_id);
362 
363 	ippdrv = ipp_find_drv_by_handle(prop_id);
364 	if (IS_ERR_OR_NULL(ippdrv)) {
365 		DRM_ERROR("failed to get ipp driver.\n");
366 		return -EINVAL;
367 	}
368 
369 	/*
370 	 * Find command node using command list in ippdrv.
371 	 * when we find this command no using prop_id.
372 	 * return property information set in this command node.
373 	 */
374 	list_for_each_entry(c_node, &ippdrv->cmd_list, list) {
375 		if ((c_node->property.prop_id == prop_id) &&
376 		    (c_node->state == IPP_STATE_STOP)) {
377 			DRM_DEBUG_KMS("%s:found cmd[%d]ippdrv[0x%x]\n",
378 				__func__, property->cmd, (int)ippdrv);
379 
380 			c_node->property = *property;
381 			return 0;
382 		}
383 	}
384 
385 	DRM_ERROR("failed to search property.\n");
386 
387 	return -EINVAL;
388 }
389 
390 static struct drm_exynos_ipp_cmd_work *ipp_create_cmd_work(void)
391 {
392 	struct drm_exynos_ipp_cmd_work *cmd_work;
393 
394 	DRM_DEBUG_KMS("%s\n", __func__);
395 
396 	cmd_work = kzalloc(sizeof(*cmd_work), GFP_KERNEL);
397 	if (!cmd_work) {
398 		DRM_ERROR("failed to alloc cmd_work.\n");
399 		return ERR_PTR(-ENOMEM);
400 	}
401 
402 	INIT_WORK((struct work_struct *)cmd_work, ipp_sched_cmd);
403 
404 	return cmd_work;
405 }
406 
407 static struct drm_exynos_ipp_event_work *ipp_create_event_work(void)
408 {
409 	struct drm_exynos_ipp_event_work *event_work;
410 
411 	DRM_DEBUG_KMS("%s\n", __func__);
412 
413 	event_work = kzalloc(sizeof(*event_work), GFP_KERNEL);
414 	if (!event_work) {
415 		DRM_ERROR("failed to alloc event_work.\n");
416 		return ERR_PTR(-ENOMEM);
417 	}
418 
419 	INIT_WORK((struct work_struct *)event_work, ipp_sched_event);
420 
421 	return event_work;
422 }
423 
424 int exynos_drm_ipp_set_property(struct drm_device *drm_dev, void *data,
425 		struct drm_file *file)
426 {
427 	struct drm_exynos_file_private *file_priv = file->driver_priv;
428 	struct exynos_drm_ipp_private *priv = file_priv->ipp_priv;
429 	struct device *dev = priv->dev;
430 	struct ipp_context *ctx = get_ipp_context(dev);
431 	struct drm_exynos_ipp_property *property = data;
432 	struct exynos_drm_ippdrv *ippdrv;
433 	struct drm_exynos_ipp_cmd_node *c_node;
434 	int ret, i;
435 
436 	DRM_DEBUG_KMS("%s\n", __func__);
437 
438 	if (!ctx) {
439 		DRM_ERROR("invalid context.\n");
440 		return -EINVAL;
441 	}
442 
443 	if (!property) {
444 		DRM_ERROR("invalid property parameter.\n");
445 		return -EINVAL;
446 	}
447 
448 	/*
449 	 * This is log print for user application property.
450 	 * user application set various property.
451 	 */
452 	for_each_ipp_ops(i)
453 		ipp_print_property(property, i);
454 
455 	/*
456 	 * set property ioctl generated new prop_id.
457 	 * but in this case already asigned prop_id using old set property.
458 	 * e.g PAUSE state. this case supports find current prop_id and use it
459 	 * instead of allocation.
460 	 */
461 	if (property->prop_id) {
462 		DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id);
463 		return ipp_find_and_set_property(property);
464 	}
465 
466 	/* find ipp driver using ipp id */
467 	ippdrv = ipp_find_driver(ctx, property);
468 	if (IS_ERR_OR_NULL(ippdrv)) {
469 		DRM_ERROR("failed to get ipp driver.\n");
470 		return -EINVAL;
471 	}
472 
473 	/* allocate command node */
474 	c_node = kzalloc(sizeof(*c_node), GFP_KERNEL);
475 	if (!c_node) {
476 		DRM_ERROR("failed to allocate map node.\n");
477 		return -ENOMEM;
478 	}
479 
480 	/* create property id */
481 	ret = ipp_create_id(&ctx->prop_idr, &ctx->prop_lock, c_node,
482 		&property->prop_id);
483 	if (ret) {
484 		DRM_ERROR("failed to create id.\n");
485 		goto err_clear;
486 	}
487 
488 	DRM_DEBUG_KMS("%s:created prop_id[%d]cmd[%d]ippdrv[0x%x]\n",
489 		__func__, property->prop_id, property->cmd, (int)ippdrv);
490 
491 	/* stored property information and ippdrv in private data */
492 	c_node->priv = priv;
493 	c_node->property = *property;
494 	c_node->state = IPP_STATE_IDLE;
495 
496 	c_node->start_work = ipp_create_cmd_work();
497 	if (IS_ERR_OR_NULL(c_node->start_work)) {
498 		DRM_ERROR("failed to create start work.\n");
499 		goto err_clear;
500 	}
501 
502 	c_node->stop_work = ipp_create_cmd_work();
503 	if (IS_ERR_OR_NULL(c_node->stop_work)) {
504 		DRM_ERROR("failed to create stop work.\n");
505 		goto err_free_start;
506 	}
507 
508 	c_node->event_work = ipp_create_event_work();
509 	if (IS_ERR_OR_NULL(c_node->event_work)) {
510 		DRM_ERROR("failed to create event work.\n");
511 		goto err_free_stop;
512 	}
513 
514 	mutex_init(&c_node->cmd_lock);
515 	mutex_init(&c_node->mem_lock);
516 	mutex_init(&c_node->event_lock);
517 
518 	init_completion(&c_node->start_complete);
519 	init_completion(&c_node->stop_complete);
520 
521 	for_each_ipp_ops(i)
522 		INIT_LIST_HEAD(&c_node->mem_list[i]);
523 
524 	INIT_LIST_HEAD(&c_node->event_list);
525 	list_splice_init(&priv->event_list, &c_node->event_list);
526 	list_add_tail(&c_node->list, &ippdrv->cmd_list);
527 
528 	/* make dedicated state without m2m */
529 	if (!ipp_is_m2m_cmd(property->cmd))
530 		ippdrv->dedicated = true;
531 
532 	return 0;
533 
534 err_free_stop:
535 	kfree(c_node->stop_work);
536 err_free_start:
537 	kfree(c_node->start_work);
538 err_clear:
539 	kfree(c_node);
540 	return ret;
541 }
542 
543 static void ipp_clean_cmd_node(struct drm_exynos_ipp_cmd_node *c_node)
544 {
545 	DRM_DEBUG_KMS("%s\n", __func__);
546 
547 	/* delete list */
548 	list_del(&c_node->list);
549 
550 	/* destroy mutex */
551 	mutex_destroy(&c_node->cmd_lock);
552 	mutex_destroy(&c_node->mem_lock);
553 	mutex_destroy(&c_node->event_lock);
554 
555 	/* free command node */
556 	kfree(c_node->start_work);
557 	kfree(c_node->stop_work);
558 	kfree(c_node->event_work);
559 	kfree(c_node);
560 }
561 
562 static int ipp_check_mem_list(struct drm_exynos_ipp_cmd_node *c_node)
563 {
564 	struct drm_exynos_ipp_property *property = &c_node->property;
565 	struct drm_exynos_ipp_mem_node *m_node;
566 	struct list_head *head;
567 	int ret, i, count[EXYNOS_DRM_OPS_MAX] = { 0, };
568 
569 	DRM_DEBUG_KMS("%s\n", __func__);
570 
571 	mutex_lock(&c_node->mem_lock);
572 
573 	for_each_ipp_ops(i) {
574 		/* source/destination memory list */
575 		head = &c_node->mem_list[i];
576 
577 		if (list_empty(head)) {
578 			DRM_DEBUG_KMS("%s:%s memory empty.\n", __func__,
579 				i ? "dst" : "src");
580 			continue;
581 		}
582 
583 		/* find memory node entry */
584 		list_for_each_entry(m_node, head, list) {
585 			DRM_DEBUG_KMS("%s:%s,count[%d]m_node[0x%x]\n", __func__,
586 				i ? "dst" : "src", count[i], (int)m_node);
587 			count[i]++;
588 		}
589 	}
590 
591 	DRM_DEBUG_KMS("%s:min[%d]max[%d]\n", __func__,
592 		min(count[EXYNOS_DRM_OPS_SRC], count[EXYNOS_DRM_OPS_DST]),
593 		max(count[EXYNOS_DRM_OPS_SRC], count[EXYNOS_DRM_OPS_DST]));
594 
595 	/*
596 	 * M2M operations should be need paired memory address.
597 	 * so, need to check minimum count about src, dst.
598 	 * other case not use paired memory, so use maximum count
599 	 */
600 	if (ipp_is_m2m_cmd(property->cmd))
601 		ret = min(count[EXYNOS_DRM_OPS_SRC],
602 			count[EXYNOS_DRM_OPS_DST]);
603 	else
604 		ret = max(count[EXYNOS_DRM_OPS_SRC],
605 			count[EXYNOS_DRM_OPS_DST]);
606 
607 	mutex_unlock(&c_node->mem_lock);
608 
609 	return ret;
610 }
611 
612 static struct drm_exynos_ipp_mem_node
613 		*ipp_find_mem_node(struct drm_exynos_ipp_cmd_node *c_node,
614 		struct drm_exynos_ipp_queue_buf *qbuf)
615 {
616 	struct drm_exynos_ipp_mem_node *m_node;
617 	struct list_head *head;
618 	int count = 0;
619 
620 	DRM_DEBUG_KMS("%s:buf_id[%d]\n", __func__, qbuf->buf_id);
621 
622 	/* source/destination memory list */
623 	head = &c_node->mem_list[qbuf->ops_id];
624 
625 	/* find memory node from memory list */
626 	list_for_each_entry(m_node, head, list) {
627 		DRM_DEBUG_KMS("%s:count[%d]m_node[0x%x]\n",
628 			__func__, count++, (int)m_node);
629 
630 		/* compare buffer id */
631 		if (m_node->buf_id == qbuf->buf_id)
632 			return m_node;
633 	}
634 
635 	return NULL;
636 }
637 
638 static int ipp_set_mem_node(struct exynos_drm_ippdrv *ippdrv,
639 		struct drm_exynos_ipp_cmd_node *c_node,
640 		struct drm_exynos_ipp_mem_node *m_node)
641 {
642 	struct exynos_drm_ipp_ops *ops = NULL;
643 	int ret = 0;
644 
645 	DRM_DEBUG_KMS("%s:node[0x%x]\n", __func__, (int)m_node);
646 
647 	if (!m_node) {
648 		DRM_ERROR("invalid queue node.\n");
649 		return -EFAULT;
650 	}
651 
652 	mutex_lock(&c_node->mem_lock);
653 
654 	DRM_DEBUG_KMS("%s:ops_id[%d]\n", __func__, m_node->ops_id);
655 
656 	/* get operations callback */
657 	ops = ippdrv->ops[m_node->ops_id];
658 	if (!ops) {
659 		DRM_ERROR("not support ops.\n");
660 		ret = -EFAULT;
661 		goto err_unlock;
662 	}
663 
664 	/* set address and enable irq */
665 	if (ops->set_addr) {
666 		ret = ops->set_addr(ippdrv->dev, &m_node->buf_info,
667 			m_node->buf_id, IPP_BUF_ENQUEUE);
668 		if (ret) {
669 			DRM_ERROR("failed to set addr.\n");
670 			goto err_unlock;
671 		}
672 	}
673 
674 err_unlock:
675 	mutex_unlock(&c_node->mem_lock);
676 	return ret;
677 }
678 
679 static struct drm_exynos_ipp_mem_node
680 		*ipp_get_mem_node(struct drm_device *drm_dev,
681 		struct drm_file *file,
682 		struct drm_exynos_ipp_cmd_node *c_node,
683 		struct drm_exynos_ipp_queue_buf *qbuf)
684 {
685 	struct drm_exynos_ipp_mem_node *m_node;
686 	struct drm_exynos_ipp_buf_info buf_info;
687 	void *addr;
688 	int i;
689 
690 	DRM_DEBUG_KMS("%s\n", __func__);
691 
692 	mutex_lock(&c_node->mem_lock);
693 
694 	m_node = kzalloc(sizeof(*m_node), GFP_KERNEL);
695 	if (!m_node) {
696 		DRM_ERROR("failed to allocate queue node.\n");
697 		goto err_unlock;
698 	}
699 
700 	/* clear base address for error handling */
701 	memset(&buf_info, 0x0, sizeof(buf_info));
702 
703 	/* operations, buffer id */
704 	m_node->ops_id = qbuf->ops_id;
705 	m_node->prop_id = qbuf->prop_id;
706 	m_node->buf_id = qbuf->buf_id;
707 
708 	DRM_DEBUG_KMS("%s:m_node[0x%x]ops_id[%d]\n", __func__,
709 		(int)m_node, qbuf->ops_id);
710 	DRM_DEBUG_KMS("%s:prop_id[%d]buf_id[%d]\n", __func__,
711 		qbuf->prop_id, m_node->buf_id);
712 
713 	for_each_ipp_planar(i) {
714 		DRM_DEBUG_KMS("%s:i[%d]handle[0x%x]\n", __func__,
715 			i, qbuf->handle[i]);
716 
717 		/* get dma address by handle */
718 		if (qbuf->handle[i]) {
719 			addr = exynos_drm_gem_get_dma_addr(drm_dev,
720 					qbuf->handle[i], file);
721 			if (IS_ERR(addr)) {
722 				DRM_ERROR("failed to get addr.\n");
723 				goto err_clear;
724 			}
725 
726 			buf_info.handles[i] = qbuf->handle[i];
727 			buf_info.base[i] = *(dma_addr_t *) addr;
728 			DRM_DEBUG_KMS("%s:i[%d]base[0x%x]hd[0x%x]\n",
729 				__func__, i, buf_info.base[i],
730 				(int)buf_info.handles[i]);
731 		}
732 	}
733 
734 	m_node->filp = file;
735 	m_node->buf_info = buf_info;
736 	list_add_tail(&m_node->list, &c_node->mem_list[qbuf->ops_id]);
737 
738 	mutex_unlock(&c_node->mem_lock);
739 	return m_node;
740 
741 err_clear:
742 	kfree(m_node);
743 err_unlock:
744 	mutex_unlock(&c_node->mem_lock);
745 	return ERR_PTR(-EFAULT);
746 }
747 
748 static int ipp_put_mem_node(struct drm_device *drm_dev,
749 		struct drm_exynos_ipp_cmd_node *c_node,
750 		struct drm_exynos_ipp_mem_node *m_node)
751 {
752 	int i;
753 
754 	DRM_DEBUG_KMS("%s:node[0x%x]\n", __func__, (int)m_node);
755 
756 	if (!m_node) {
757 		DRM_ERROR("invalid dequeue node.\n");
758 		return -EFAULT;
759 	}
760 
761 	if (list_empty(&m_node->list)) {
762 		DRM_ERROR("empty memory node.\n");
763 		return -ENOMEM;
764 	}
765 
766 	mutex_lock(&c_node->mem_lock);
767 
768 	DRM_DEBUG_KMS("%s:ops_id[%d]\n", __func__, m_node->ops_id);
769 
770 	/* put gem buffer */
771 	for_each_ipp_planar(i) {
772 		unsigned long handle = m_node->buf_info.handles[i];
773 		if (handle)
774 			exynos_drm_gem_put_dma_addr(drm_dev, handle,
775 							m_node->filp);
776 	}
777 
778 	/* delete list in queue */
779 	list_del(&m_node->list);
780 	kfree(m_node);
781 
782 	mutex_unlock(&c_node->mem_lock);
783 
784 	return 0;
785 }
786 
787 static void ipp_free_event(struct drm_pending_event *event)
788 {
789 	kfree(event);
790 }
791 
792 static int ipp_get_event(struct drm_device *drm_dev,
793 		struct drm_file *file,
794 		struct drm_exynos_ipp_cmd_node *c_node,
795 		struct drm_exynos_ipp_queue_buf *qbuf)
796 {
797 	struct drm_exynos_ipp_send_event *e;
798 	unsigned long flags;
799 
800 	DRM_DEBUG_KMS("%s:ops_id[%d]buf_id[%d]\n", __func__,
801 		qbuf->ops_id, qbuf->buf_id);
802 
803 	e = kzalloc(sizeof(*e), GFP_KERNEL);
804 
805 	if (!e) {
806 		DRM_ERROR("failed to allocate event.\n");
807 		spin_lock_irqsave(&drm_dev->event_lock, flags);
808 		file->event_space += sizeof(e->event);
809 		spin_unlock_irqrestore(&drm_dev->event_lock, flags);
810 		return -ENOMEM;
811 	}
812 
813 	/* make event */
814 	e->event.base.type = DRM_EXYNOS_IPP_EVENT;
815 	e->event.base.length = sizeof(e->event);
816 	e->event.user_data = qbuf->user_data;
817 	e->event.prop_id = qbuf->prop_id;
818 	e->event.buf_id[EXYNOS_DRM_OPS_DST] = qbuf->buf_id;
819 	e->base.event = &e->event.base;
820 	e->base.file_priv = file;
821 	e->base.destroy = ipp_free_event;
822 	list_add_tail(&e->base.link, &c_node->event_list);
823 
824 	return 0;
825 }
826 
827 static void ipp_put_event(struct drm_exynos_ipp_cmd_node *c_node,
828 		struct drm_exynos_ipp_queue_buf *qbuf)
829 {
830 	struct drm_exynos_ipp_send_event *e, *te;
831 	int count = 0;
832 
833 	DRM_DEBUG_KMS("%s\n", __func__);
834 
835 	if (list_empty(&c_node->event_list)) {
836 		DRM_DEBUG_KMS("%s:event_list is empty.\n", __func__);
837 		return;
838 	}
839 
840 	list_for_each_entry_safe(e, te, &c_node->event_list, base.link) {
841 		DRM_DEBUG_KMS("%s:count[%d]e[0x%x]\n",
842 			__func__, count++, (int)e);
843 
844 		/*
845 		 * quf == NULL condition means all event deletion.
846 		 * stop operations want to delete all event list.
847 		 * another case delete only same buf id.
848 		 */
849 		if (!qbuf) {
850 			/* delete list */
851 			list_del(&e->base.link);
852 			kfree(e);
853 		}
854 
855 		/* compare buffer id */
856 		if (qbuf && (qbuf->buf_id ==
857 		    e->event.buf_id[EXYNOS_DRM_OPS_DST])) {
858 			/* delete list */
859 			list_del(&e->base.link);
860 			kfree(e);
861 			return;
862 		}
863 	}
864 }
865 
866 static void ipp_handle_cmd_work(struct device *dev,
867 		struct exynos_drm_ippdrv *ippdrv,
868 		struct drm_exynos_ipp_cmd_work *cmd_work,
869 		struct drm_exynos_ipp_cmd_node *c_node)
870 {
871 	struct ipp_context *ctx = get_ipp_context(dev);
872 
873 	cmd_work->ippdrv = ippdrv;
874 	cmd_work->c_node = c_node;
875 	queue_work(ctx->cmd_workq, (struct work_struct *)cmd_work);
876 }
877 
878 static int ipp_queue_buf_with_run(struct device *dev,
879 		struct drm_exynos_ipp_cmd_node *c_node,
880 		struct drm_exynos_ipp_mem_node *m_node,
881 		struct drm_exynos_ipp_queue_buf *qbuf)
882 {
883 	struct exynos_drm_ippdrv *ippdrv;
884 	struct drm_exynos_ipp_property *property;
885 	struct exynos_drm_ipp_ops *ops;
886 	int ret;
887 
888 	DRM_DEBUG_KMS("%s\n", __func__);
889 
890 	ippdrv = ipp_find_drv_by_handle(qbuf->prop_id);
891 	if (IS_ERR_OR_NULL(ippdrv)) {
892 		DRM_ERROR("failed to get ipp driver.\n");
893 		return -EFAULT;
894 	}
895 
896 	ops = ippdrv->ops[qbuf->ops_id];
897 	if (!ops) {
898 		DRM_ERROR("failed to get ops.\n");
899 		return -EFAULT;
900 	}
901 
902 	property = &c_node->property;
903 
904 	if (c_node->state != IPP_STATE_START) {
905 		DRM_DEBUG_KMS("%s:bypass for invalid state.\n" , __func__);
906 		return 0;
907 	}
908 
909 	if (!ipp_check_mem_list(c_node)) {
910 		DRM_DEBUG_KMS("%s:empty memory.\n", __func__);
911 		return 0;
912 	}
913 
914 	/*
915 	 * If set destination buffer and enabled clock,
916 	 * then m2m operations need start operations at queue_buf
917 	 */
918 	if (ipp_is_m2m_cmd(property->cmd)) {
919 		struct drm_exynos_ipp_cmd_work *cmd_work = c_node->start_work;
920 
921 		cmd_work->ctrl = IPP_CTRL_PLAY;
922 		ipp_handle_cmd_work(dev, ippdrv, cmd_work, c_node);
923 	} else {
924 		ret = ipp_set_mem_node(ippdrv, c_node, m_node);
925 		if (ret) {
926 			DRM_ERROR("failed to set m node.\n");
927 			return ret;
928 		}
929 	}
930 
931 	return 0;
932 }
933 
934 static void ipp_clean_queue_buf(struct drm_device *drm_dev,
935 		struct drm_exynos_ipp_cmd_node *c_node,
936 		struct drm_exynos_ipp_queue_buf *qbuf)
937 {
938 	struct drm_exynos_ipp_mem_node *m_node, *tm_node;
939 
940 	DRM_DEBUG_KMS("%s\n", __func__);
941 
942 	if (!list_empty(&c_node->mem_list[qbuf->ops_id])) {
943 		/* delete list */
944 		list_for_each_entry_safe(m_node, tm_node,
945 			&c_node->mem_list[qbuf->ops_id], list) {
946 			if (m_node->buf_id == qbuf->buf_id &&
947 			    m_node->ops_id == qbuf->ops_id)
948 				ipp_put_mem_node(drm_dev, c_node, m_node);
949 		}
950 	}
951 }
952 
953 int exynos_drm_ipp_queue_buf(struct drm_device *drm_dev, void *data,
954 		struct drm_file *file)
955 {
956 	struct drm_exynos_file_private *file_priv = file->driver_priv;
957 	struct exynos_drm_ipp_private *priv = file_priv->ipp_priv;
958 	struct device *dev = priv->dev;
959 	struct ipp_context *ctx = get_ipp_context(dev);
960 	struct drm_exynos_ipp_queue_buf *qbuf = data;
961 	struct drm_exynos_ipp_cmd_node *c_node;
962 	struct drm_exynos_ipp_mem_node *m_node;
963 	int ret;
964 
965 	DRM_DEBUG_KMS("%s\n", __func__);
966 
967 	if (!qbuf) {
968 		DRM_ERROR("invalid buf parameter.\n");
969 		return -EINVAL;
970 	}
971 
972 	if (qbuf->ops_id >= EXYNOS_DRM_OPS_MAX) {
973 		DRM_ERROR("invalid ops parameter.\n");
974 		return -EINVAL;
975 	}
976 
977 	DRM_DEBUG_KMS("%s:prop_id[%d]ops_id[%s]buf_id[%d]buf_type[%d]\n",
978 		__func__, qbuf->prop_id, qbuf->ops_id ? "dst" : "src",
979 		qbuf->buf_id, qbuf->buf_type);
980 
981 	/* find command node */
982 	c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock,
983 		qbuf->prop_id);
984 	if (!c_node) {
985 		DRM_ERROR("failed to get command node.\n");
986 		return -EFAULT;
987 	}
988 
989 	/* buffer control */
990 	switch (qbuf->buf_type) {
991 	case IPP_BUF_ENQUEUE:
992 		/* get memory node */
993 		m_node = ipp_get_mem_node(drm_dev, file, c_node, qbuf);
994 		if (IS_ERR(m_node)) {
995 			DRM_ERROR("failed to get m_node.\n");
996 			return PTR_ERR(m_node);
997 		}
998 
999 		/*
1000 		 * first step get event for destination buffer.
1001 		 * and second step when M2M case run with destination buffer
1002 		 * if needed.
1003 		 */
1004 		if (qbuf->ops_id == EXYNOS_DRM_OPS_DST) {
1005 			/* get event for destination buffer */
1006 			ret = ipp_get_event(drm_dev, file, c_node, qbuf);
1007 			if (ret) {
1008 				DRM_ERROR("failed to get event.\n");
1009 				goto err_clean_node;
1010 			}
1011 
1012 			/*
1013 			 * M2M case run play control for streaming feature.
1014 			 * other case set address and waiting.
1015 			 */
1016 			ret = ipp_queue_buf_with_run(dev, c_node, m_node, qbuf);
1017 			if (ret) {
1018 				DRM_ERROR("failed to run command.\n");
1019 				goto err_clean_node;
1020 			}
1021 		}
1022 		break;
1023 	case IPP_BUF_DEQUEUE:
1024 		mutex_lock(&c_node->cmd_lock);
1025 
1026 		/* put event for destination buffer */
1027 		if (qbuf->ops_id == EXYNOS_DRM_OPS_DST)
1028 			ipp_put_event(c_node, qbuf);
1029 
1030 		ipp_clean_queue_buf(drm_dev, c_node, qbuf);
1031 
1032 		mutex_unlock(&c_node->cmd_lock);
1033 		break;
1034 	default:
1035 		DRM_ERROR("invalid buffer control.\n");
1036 		return -EINVAL;
1037 	}
1038 
1039 	return 0;
1040 
1041 err_clean_node:
1042 	DRM_ERROR("clean memory nodes.\n");
1043 
1044 	ipp_clean_queue_buf(drm_dev, c_node, qbuf);
1045 	return ret;
1046 }
1047 
1048 static bool exynos_drm_ipp_check_valid(struct device *dev,
1049 		enum drm_exynos_ipp_ctrl ctrl, enum drm_exynos_ipp_state state)
1050 {
1051 	DRM_DEBUG_KMS("%s\n", __func__);
1052 
1053 	if (ctrl != IPP_CTRL_PLAY) {
1054 		if (pm_runtime_suspended(dev)) {
1055 			DRM_ERROR("pm:runtime_suspended.\n");
1056 			goto err_status;
1057 		}
1058 	}
1059 
1060 	switch (ctrl) {
1061 	case IPP_CTRL_PLAY:
1062 		if (state != IPP_STATE_IDLE)
1063 			goto err_status;
1064 		break;
1065 	case IPP_CTRL_STOP:
1066 		if (state == IPP_STATE_STOP)
1067 			goto err_status;
1068 		break;
1069 	case IPP_CTRL_PAUSE:
1070 		if (state != IPP_STATE_START)
1071 			goto err_status;
1072 		break;
1073 	case IPP_CTRL_RESUME:
1074 		if (state != IPP_STATE_STOP)
1075 			goto err_status;
1076 		break;
1077 	default:
1078 		DRM_ERROR("invalid state.\n");
1079 		goto err_status;
1080 		break;
1081 	}
1082 
1083 	return true;
1084 
1085 err_status:
1086 	DRM_ERROR("invalid status:ctrl[%d]state[%d]\n", ctrl, state);
1087 	return false;
1088 }
1089 
1090 int exynos_drm_ipp_cmd_ctrl(struct drm_device *drm_dev, void *data,
1091 		struct drm_file *file)
1092 {
1093 	struct drm_exynos_file_private *file_priv = file->driver_priv;
1094 	struct exynos_drm_ipp_private *priv = file_priv->ipp_priv;
1095 	struct exynos_drm_ippdrv *ippdrv = NULL;
1096 	struct device *dev = priv->dev;
1097 	struct ipp_context *ctx = get_ipp_context(dev);
1098 	struct drm_exynos_ipp_cmd_ctrl *cmd_ctrl = data;
1099 	struct drm_exynos_ipp_cmd_work *cmd_work;
1100 	struct drm_exynos_ipp_cmd_node *c_node;
1101 
1102 	DRM_DEBUG_KMS("%s\n", __func__);
1103 
1104 	if (!ctx) {
1105 		DRM_ERROR("invalid context.\n");
1106 		return -EINVAL;
1107 	}
1108 
1109 	if (!cmd_ctrl) {
1110 		DRM_ERROR("invalid control parameter.\n");
1111 		return -EINVAL;
1112 	}
1113 
1114 	DRM_DEBUG_KMS("%s:ctrl[%d]prop_id[%d]\n", __func__,
1115 		cmd_ctrl->ctrl, cmd_ctrl->prop_id);
1116 
1117 	ippdrv = ipp_find_drv_by_handle(cmd_ctrl->prop_id);
1118 	if (IS_ERR(ippdrv)) {
1119 		DRM_ERROR("failed to get ipp driver.\n");
1120 		return PTR_ERR(ippdrv);
1121 	}
1122 
1123 	c_node = ipp_find_obj(&ctx->prop_idr, &ctx->prop_lock,
1124 		cmd_ctrl->prop_id);
1125 	if (!c_node) {
1126 		DRM_ERROR("invalid command node list.\n");
1127 		return -EINVAL;
1128 	}
1129 
1130 	if (!exynos_drm_ipp_check_valid(ippdrv->dev, cmd_ctrl->ctrl,
1131 	    c_node->state)) {
1132 		DRM_ERROR("invalid state.\n");
1133 		return -EINVAL;
1134 	}
1135 
1136 	switch (cmd_ctrl->ctrl) {
1137 	case IPP_CTRL_PLAY:
1138 		if (pm_runtime_suspended(ippdrv->dev))
1139 			pm_runtime_get_sync(ippdrv->dev);
1140 		c_node->state = IPP_STATE_START;
1141 
1142 		cmd_work = c_node->start_work;
1143 		cmd_work->ctrl = cmd_ctrl->ctrl;
1144 		ipp_handle_cmd_work(dev, ippdrv, cmd_work, c_node);
1145 		c_node->state = IPP_STATE_START;
1146 		break;
1147 	case IPP_CTRL_STOP:
1148 		cmd_work = c_node->stop_work;
1149 		cmd_work->ctrl = cmd_ctrl->ctrl;
1150 		ipp_handle_cmd_work(dev, ippdrv, cmd_work, c_node);
1151 
1152 		if (!wait_for_completion_timeout(&c_node->stop_complete,
1153 		    msecs_to_jiffies(300))) {
1154 			DRM_ERROR("timeout stop:prop_id[%d]\n",
1155 				c_node->property.prop_id);
1156 		}
1157 
1158 		c_node->state = IPP_STATE_STOP;
1159 		ippdrv->dedicated = false;
1160 		ipp_clean_cmd_node(c_node);
1161 
1162 		if (list_empty(&ippdrv->cmd_list))
1163 			pm_runtime_put_sync(ippdrv->dev);
1164 		break;
1165 	case IPP_CTRL_PAUSE:
1166 		cmd_work = c_node->stop_work;
1167 		cmd_work->ctrl = cmd_ctrl->ctrl;
1168 		ipp_handle_cmd_work(dev, ippdrv, cmd_work, c_node);
1169 
1170 		if (!wait_for_completion_timeout(&c_node->stop_complete,
1171 		    msecs_to_jiffies(200))) {
1172 			DRM_ERROR("timeout stop:prop_id[%d]\n",
1173 				c_node->property.prop_id);
1174 		}
1175 
1176 		c_node->state = IPP_STATE_STOP;
1177 		break;
1178 	case IPP_CTRL_RESUME:
1179 		c_node->state = IPP_STATE_START;
1180 		cmd_work = c_node->start_work;
1181 		cmd_work->ctrl = cmd_ctrl->ctrl;
1182 		ipp_handle_cmd_work(dev, ippdrv, cmd_work, c_node);
1183 		break;
1184 	default:
1185 		DRM_ERROR("could not support this state currently.\n");
1186 		return -EINVAL;
1187 	}
1188 
1189 	DRM_DEBUG_KMS("%s:done ctrl[%d]prop_id[%d]\n", __func__,
1190 		cmd_ctrl->ctrl, cmd_ctrl->prop_id);
1191 
1192 	return 0;
1193 }
1194 
1195 int exynos_drm_ippnb_register(struct notifier_block *nb)
1196 {
1197 	return blocking_notifier_chain_register(
1198 		&exynos_drm_ippnb_list, nb);
1199 }
1200 
1201 int exynos_drm_ippnb_unregister(struct notifier_block *nb)
1202 {
1203 	return blocking_notifier_chain_unregister(
1204 		&exynos_drm_ippnb_list, nb);
1205 }
1206 
1207 int exynos_drm_ippnb_send_event(unsigned long val, void *v)
1208 {
1209 	return blocking_notifier_call_chain(
1210 		&exynos_drm_ippnb_list, val, v);
1211 }
1212 
1213 static int ipp_set_property(struct exynos_drm_ippdrv *ippdrv,
1214 		struct drm_exynos_ipp_property *property)
1215 {
1216 	struct exynos_drm_ipp_ops *ops = NULL;
1217 	bool swap = false;
1218 	int ret, i;
1219 
1220 	if (!property) {
1221 		DRM_ERROR("invalid property parameter.\n");
1222 		return -EINVAL;
1223 	}
1224 
1225 	DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id);
1226 
1227 	/* reset h/w block */
1228 	if (ippdrv->reset &&
1229 	    ippdrv->reset(ippdrv->dev)) {
1230 		DRM_ERROR("failed to reset.\n");
1231 		return -EINVAL;
1232 	}
1233 
1234 	/* set source,destination operations */
1235 	for_each_ipp_ops(i) {
1236 		struct drm_exynos_ipp_config *config =
1237 			&property->config[i];
1238 
1239 		ops = ippdrv->ops[i];
1240 		if (!ops || !config) {
1241 			DRM_ERROR("not support ops and config.\n");
1242 			return -EINVAL;
1243 		}
1244 
1245 		/* set format */
1246 		if (ops->set_fmt) {
1247 			ret = ops->set_fmt(ippdrv->dev, config->fmt);
1248 			if (ret) {
1249 				DRM_ERROR("not support format.\n");
1250 				return ret;
1251 			}
1252 		}
1253 
1254 		/* set transform for rotation, flip */
1255 		if (ops->set_transf) {
1256 			ret = ops->set_transf(ippdrv->dev, config->degree,
1257 				config->flip, &swap);
1258 			if (ret) {
1259 				DRM_ERROR("not support tranf.\n");
1260 				return -EINVAL;
1261 			}
1262 		}
1263 
1264 		/* set size */
1265 		if (ops->set_size) {
1266 			ret = ops->set_size(ippdrv->dev, swap, &config->pos,
1267 				&config->sz);
1268 			if (ret) {
1269 				DRM_ERROR("not support size.\n");
1270 				return ret;
1271 			}
1272 		}
1273 	}
1274 
1275 	return 0;
1276 }
1277 
1278 static int ipp_start_property(struct exynos_drm_ippdrv *ippdrv,
1279 		struct drm_exynos_ipp_cmd_node *c_node)
1280 {
1281 	struct drm_exynos_ipp_mem_node *m_node;
1282 	struct drm_exynos_ipp_property *property = &c_node->property;
1283 	struct list_head *head;
1284 	int ret, i;
1285 
1286 	DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id);
1287 
1288 	/* store command info in ippdrv */
1289 	ippdrv->c_node = c_node;
1290 
1291 	if (!ipp_check_mem_list(c_node)) {
1292 		DRM_DEBUG_KMS("%s:empty memory.\n", __func__);
1293 		return -ENOMEM;
1294 	}
1295 
1296 	/* set current property in ippdrv */
1297 	ret = ipp_set_property(ippdrv, property);
1298 	if (ret) {
1299 		DRM_ERROR("failed to set property.\n");
1300 		ippdrv->c_node = NULL;
1301 		return ret;
1302 	}
1303 
1304 	/* check command */
1305 	switch (property->cmd) {
1306 	case IPP_CMD_M2M:
1307 		for_each_ipp_ops(i) {
1308 			/* source/destination memory list */
1309 			head = &c_node->mem_list[i];
1310 
1311 			m_node = list_first_entry(head,
1312 				struct drm_exynos_ipp_mem_node, list);
1313 			if (!m_node) {
1314 				DRM_ERROR("failed to get node.\n");
1315 				ret = -EFAULT;
1316 				return ret;
1317 			}
1318 
1319 			DRM_DEBUG_KMS("%s:m_node[0x%x]\n",
1320 				__func__, (int)m_node);
1321 
1322 			ret = ipp_set_mem_node(ippdrv, c_node, m_node);
1323 			if (ret) {
1324 				DRM_ERROR("failed to set m node.\n");
1325 				return ret;
1326 			}
1327 		}
1328 		break;
1329 	case IPP_CMD_WB:
1330 		/* destination memory list */
1331 		head = &c_node->mem_list[EXYNOS_DRM_OPS_DST];
1332 
1333 		list_for_each_entry(m_node, head, list) {
1334 			ret = ipp_set_mem_node(ippdrv, c_node, m_node);
1335 			if (ret) {
1336 				DRM_ERROR("failed to set m node.\n");
1337 				return ret;
1338 			}
1339 		}
1340 		break;
1341 	case IPP_CMD_OUTPUT:
1342 		/* source memory list */
1343 		head = &c_node->mem_list[EXYNOS_DRM_OPS_SRC];
1344 
1345 		list_for_each_entry(m_node, head, list) {
1346 			ret = ipp_set_mem_node(ippdrv, c_node, m_node);
1347 			if (ret) {
1348 				DRM_ERROR("failed to set m node.\n");
1349 				return ret;
1350 			}
1351 		}
1352 		break;
1353 	default:
1354 		DRM_ERROR("invalid operations.\n");
1355 		return -EINVAL;
1356 	}
1357 
1358 	DRM_DEBUG_KMS("%s:cmd[%d]\n", __func__, property->cmd);
1359 
1360 	/* start operations */
1361 	if (ippdrv->start) {
1362 		ret = ippdrv->start(ippdrv->dev, property->cmd);
1363 		if (ret) {
1364 			DRM_ERROR("failed to start ops.\n");
1365 			return ret;
1366 		}
1367 	}
1368 
1369 	return 0;
1370 }
1371 
1372 static int ipp_stop_property(struct drm_device *drm_dev,
1373 		struct exynos_drm_ippdrv *ippdrv,
1374 		struct drm_exynos_ipp_cmd_node *c_node)
1375 {
1376 	struct drm_exynos_ipp_mem_node *m_node, *tm_node;
1377 	struct drm_exynos_ipp_property *property = &c_node->property;
1378 	struct list_head *head;
1379 	int ret = 0, i;
1380 
1381 	DRM_DEBUG_KMS("%s:prop_id[%d]\n", __func__, property->prop_id);
1382 
1383 	/* put event */
1384 	ipp_put_event(c_node, NULL);
1385 
1386 	/* check command */
1387 	switch (property->cmd) {
1388 	case IPP_CMD_M2M:
1389 		for_each_ipp_ops(i) {
1390 			/* source/destination memory list */
1391 			head = &c_node->mem_list[i];
1392 
1393 			if (list_empty(head)) {
1394 				DRM_DEBUG_KMS("%s:mem_list is empty.\n",
1395 					__func__);
1396 				break;
1397 			}
1398 
1399 			list_for_each_entry_safe(m_node, tm_node,
1400 				head, list) {
1401 				ret = ipp_put_mem_node(drm_dev, c_node,
1402 					m_node);
1403 				if (ret) {
1404 					DRM_ERROR("failed to put m_node.\n");
1405 					goto err_clear;
1406 				}
1407 			}
1408 		}
1409 		break;
1410 	case IPP_CMD_WB:
1411 		/* destination memory list */
1412 		head = &c_node->mem_list[EXYNOS_DRM_OPS_DST];
1413 
1414 		if (list_empty(head)) {
1415 			DRM_DEBUG_KMS("%s:mem_list is empty.\n", __func__);
1416 			break;
1417 		}
1418 
1419 		list_for_each_entry_safe(m_node, tm_node, head, list) {
1420 			ret = ipp_put_mem_node(drm_dev, c_node, m_node);
1421 			if (ret) {
1422 				DRM_ERROR("failed to put m_node.\n");
1423 				goto err_clear;
1424 			}
1425 		}
1426 		break;
1427 	case IPP_CMD_OUTPUT:
1428 		/* source memory list */
1429 		head = &c_node->mem_list[EXYNOS_DRM_OPS_SRC];
1430 
1431 		if (list_empty(head)) {
1432 			DRM_DEBUG_KMS("%s:mem_list is empty.\n", __func__);
1433 			break;
1434 		}
1435 
1436 		list_for_each_entry_safe(m_node, tm_node, head, list) {
1437 			ret = ipp_put_mem_node(drm_dev, c_node, m_node);
1438 			if (ret) {
1439 				DRM_ERROR("failed to put m_node.\n");
1440 				goto err_clear;
1441 			}
1442 		}
1443 		break;
1444 	default:
1445 		DRM_ERROR("invalid operations.\n");
1446 		ret = -EINVAL;
1447 		goto err_clear;
1448 	}
1449 
1450 err_clear:
1451 	/* stop operations */
1452 	if (ippdrv->stop)
1453 		ippdrv->stop(ippdrv->dev, property->cmd);
1454 
1455 	return ret;
1456 }
1457 
1458 void ipp_sched_cmd(struct work_struct *work)
1459 {
1460 	struct drm_exynos_ipp_cmd_work *cmd_work =
1461 		(struct drm_exynos_ipp_cmd_work *)work;
1462 	struct exynos_drm_ippdrv *ippdrv;
1463 	struct drm_exynos_ipp_cmd_node *c_node;
1464 	struct drm_exynos_ipp_property *property;
1465 	int ret;
1466 
1467 	DRM_DEBUG_KMS("%s\n", __func__);
1468 
1469 	ippdrv = cmd_work->ippdrv;
1470 	if (!ippdrv) {
1471 		DRM_ERROR("invalid ippdrv list.\n");
1472 		return;
1473 	}
1474 
1475 	c_node = cmd_work->c_node;
1476 	if (!c_node) {
1477 		DRM_ERROR("invalid command node list.\n");
1478 		return;
1479 	}
1480 
1481 	mutex_lock(&c_node->cmd_lock);
1482 
1483 	property = &c_node->property;
1484 
1485 	switch (cmd_work->ctrl) {
1486 	case IPP_CTRL_PLAY:
1487 	case IPP_CTRL_RESUME:
1488 		ret = ipp_start_property(ippdrv, c_node);
1489 		if (ret) {
1490 			DRM_ERROR("failed to start property:prop_id[%d]\n",
1491 				c_node->property.prop_id);
1492 			goto err_unlock;
1493 		}
1494 
1495 		/*
1496 		 * M2M case supports wait_completion of transfer.
1497 		 * because M2M case supports single unit operation
1498 		 * with multiple queue.
1499 		 * M2M need to wait completion of data transfer.
1500 		 */
1501 		if (ipp_is_m2m_cmd(property->cmd)) {
1502 			if (!wait_for_completion_timeout
1503 			    (&c_node->start_complete, msecs_to_jiffies(200))) {
1504 				DRM_ERROR("timeout event:prop_id[%d]\n",
1505 					c_node->property.prop_id);
1506 				goto err_unlock;
1507 			}
1508 		}
1509 		break;
1510 	case IPP_CTRL_STOP:
1511 	case IPP_CTRL_PAUSE:
1512 		ret = ipp_stop_property(ippdrv->drm_dev, ippdrv,
1513 			c_node);
1514 		if (ret) {
1515 			DRM_ERROR("failed to stop property.\n");
1516 			goto err_unlock;
1517 		}
1518 
1519 		complete(&c_node->stop_complete);
1520 		break;
1521 	default:
1522 		DRM_ERROR("unknown control type\n");
1523 		break;
1524 	}
1525 
1526 	DRM_DEBUG_KMS("%s:ctrl[%d] done.\n", __func__, cmd_work->ctrl);
1527 
1528 err_unlock:
1529 	mutex_unlock(&c_node->cmd_lock);
1530 }
1531 
1532 static int ipp_send_event(struct exynos_drm_ippdrv *ippdrv,
1533 		struct drm_exynos_ipp_cmd_node *c_node, int *buf_id)
1534 {
1535 	struct drm_device *drm_dev = ippdrv->drm_dev;
1536 	struct drm_exynos_ipp_property *property = &c_node->property;
1537 	struct drm_exynos_ipp_mem_node *m_node;
1538 	struct drm_exynos_ipp_queue_buf qbuf;
1539 	struct drm_exynos_ipp_send_event *e;
1540 	struct list_head *head;
1541 	struct timeval now;
1542 	unsigned long flags;
1543 	u32 tbuf_id[EXYNOS_DRM_OPS_MAX] = {0, };
1544 	int ret, i;
1545 
1546 	for_each_ipp_ops(i)
1547 		DRM_DEBUG_KMS("%s:%s buf_id[%d]\n", __func__,
1548 			i ? "dst" : "src", buf_id[i]);
1549 
1550 	if (!drm_dev) {
1551 		DRM_ERROR("failed to get drm_dev.\n");
1552 		return -EINVAL;
1553 	}
1554 
1555 	if (!property) {
1556 		DRM_ERROR("failed to get property.\n");
1557 		return -EINVAL;
1558 	}
1559 
1560 	if (list_empty(&c_node->event_list)) {
1561 		DRM_DEBUG_KMS("%s:event list is empty.\n", __func__);
1562 		return 0;
1563 	}
1564 
1565 	if (!ipp_check_mem_list(c_node)) {
1566 		DRM_DEBUG_KMS("%s:empty memory.\n", __func__);
1567 		return 0;
1568 	}
1569 
1570 	/* check command */
1571 	switch (property->cmd) {
1572 	case IPP_CMD_M2M:
1573 		for_each_ipp_ops(i) {
1574 			/* source/destination memory list */
1575 			head = &c_node->mem_list[i];
1576 
1577 			m_node = list_first_entry(head,
1578 				struct drm_exynos_ipp_mem_node, list);
1579 			if (!m_node) {
1580 				DRM_ERROR("empty memory node.\n");
1581 				return -ENOMEM;
1582 			}
1583 
1584 			tbuf_id[i] = m_node->buf_id;
1585 			DRM_DEBUG_KMS("%s:%s buf_id[%d]\n", __func__,
1586 				i ? "dst" : "src", tbuf_id[i]);
1587 
1588 			ret = ipp_put_mem_node(drm_dev, c_node, m_node);
1589 			if (ret)
1590 				DRM_ERROR("failed to put m_node.\n");
1591 		}
1592 		break;
1593 	case IPP_CMD_WB:
1594 		/* clear buf for finding */
1595 		memset(&qbuf, 0x0, sizeof(qbuf));
1596 		qbuf.ops_id = EXYNOS_DRM_OPS_DST;
1597 		qbuf.buf_id = buf_id[EXYNOS_DRM_OPS_DST];
1598 
1599 		/* get memory node entry */
1600 		m_node = ipp_find_mem_node(c_node, &qbuf);
1601 		if (!m_node) {
1602 			DRM_ERROR("empty memory node.\n");
1603 			return -ENOMEM;
1604 		}
1605 
1606 		tbuf_id[EXYNOS_DRM_OPS_DST] = m_node->buf_id;
1607 
1608 		ret = ipp_put_mem_node(drm_dev, c_node, m_node);
1609 		if (ret)
1610 			DRM_ERROR("failed to put m_node.\n");
1611 		break;
1612 	case IPP_CMD_OUTPUT:
1613 		/* source memory list */
1614 		head = &c_node->mem_list[EXYNOS_DRM_OPS_SRC];
1615 
1616 		m_node = list_first_entry(head,
1617 			struct drm_exynos_ipp_mem_node, list);
1618 		if (!m_node) {
1619 			DRM_ERROR("empty memory node.\n");
1620 			return -ENOMEM;
1621 		}
1622 
1623 		tbuf_id[EXYNOS_DRM_OPS_SRC] = m_node->buf_id;
1624 
1625 		ret = ipp_put_mem_node(drm_dev, c_node, m_node);
1626 		if (ret)
1627 			DRM_ERROR("failed to put m_node.\n");
1628 		break;
1629 	default:
1630 		DRM_ERROR("invalid operations.\n");
1631 		return -EINVAL;
1632 	}
1633 
1634 	if (tbuf_id[EXYNOS_DRM_OPS_DST] != buf_id[EXYNOS_DRM_OPS_DST])
1635 		DRM_ERROR("failed to match buf_id[%d %d]prop_id[%d]\n",
1636 			tbuf_id[1], buf_id[1], property->prop_id);
1637 
1638 	/*
1639 	 * command node have event list of destination buffer
1640 	 * If destination buffer enqueue to mem list,
1641 	 * then we make event and link to event list tail.
1642 	 * so, we get first event for first enqueued buffer.
1643 	 */
1644 	e = list_first_entry(&c_node->event_list,
1645 		struct drm_exynos_ipp_send_event, base.link);
1646 
1647 	if (!e) {
1648 		DRM_ERROR("empty event.\n");
1649 		return -EINVAL;
1650 	}
1651 
1652 	do_gettimeofday(&now);
1653 	DRM_DEBUG_KMS("%s:tv_sec[%ld]tv_usec[%ld]\n"
1654 		, __func__, now.tv_sec, now.tv_usec);
1655 	e->event.tv_sec = now.tv_sec;
1656 	e->event.tv_usec = now.tv_usec;
1657 	e->event.prop_id = property->prop_id;
1658 
1659 	/* set buffer id about source destination */
1660 	for_each_ipp_ops(i)
1661 		e->event.buf_id[i] = tbuf_id[i];
1662 
1663 	spin_lock_irqsave(&drm_dev->event_lock, flags);
1664 	list_move_tail(&e->base.link, &e->base.file_priv->event_list);
1665 	wake_up_interruptible(&e->base.file_priv->event_wait);
1666 	spin_unlock_irqrestore(&drm_dev->event_lock, flags);
1667 
1668 	DRM_DEBUG_KMS("%s:done cmd[%d]prop_id[%d]buf_id[%d]\n", __func__,
1669 		property->cmd, property->prop_id, tbuf_id[EXYNOS_DRM_OPS_DST]);
1670 
1671 	return 0;
1672 }
1673 
1674 void ipp_sched_event(struct work_struct *work)
1675 {
1676 	struct drm_exynos_ipp_event_work *event_work =
1677 		(struct drm_exynos_ipp_event_work *)work;
1678 	struct exynos_drm_ippdrv *ippdrv;
1679 	struct drm_exynos_ipp_cmd_node *c_node;
1680 	int ret;
1681 
1682 	if (!event_work) {
1683 		DRM_ERROR("failed to get event_work.\n");
1684 		return;
1685 	}
1686 
1687 	DRM_DEBUG_KMS("%s:buf_id[%d]\n", __func__,
1688 		event_work->buf_id[EXYNOS_DRM_OPS_DST]);
1689 
1690 	ippdrv = event_work->ippdrv;
1691 	if (!ippdrv) {
1692 		DRM_ERROR("failed to get ipp driver.\n");
1693 		return;
1694 	}
1695 
1696 	c_node = ippdrv->c_node;
1697 	if (!c_node) {
1698 		DRM_ERROR("failed to get command node.\n");
1699 		return;
1700 	}
1701 
1702 	/*
1703 	 * IPP supports command thread, event thread synchronization.
1704 	 * If IPP close immediately from user land, then IPP make
1705 	 * synchronization with command thread, so make complete event.
1706 	 * or going out operations.
1707 	 */
1708 	if (c_node->state != IPP_STATE_START) {
1709 		DRM_DEBUG_KMS("%s:bypass state[%d]prop_id[%d]\n",
1710 			__func__, c_node->state, c_node->property.prop_id);
1711 		goto err_completion;
1712 	}
1713 
1714 	mutex_lock(&c_node->event_lock);
1715 
1716 	ret = ipp_send_event(ippdrv, c_node, event_work->buf_id);
1717 	if (ret) {
1718 		DRM_ERROR("failed to send event.\n");
1719 		goto err_completion;
1720 	}
1721 
1722 err_completion:
1723 	if (ipp_is_m2m_cmd(c_node->property.cmd))
1724 		complete(&c_node->start_complete);
1725 
1726 	mutex_unlock(&c_node->event_lock);
1727 }
1728 
1729 static int ipp_subdrv_probe(struct drm_device *drm_dev, struct device *dev)
1730 {
1731 	struct ipp_context *ctx = get_ipp_context(dev);
1732 	struct exynos_drm_ippdrv *ippdrv;
1733 	int ret, count = 0;
1734 
1735 	DRM_DEBUG_KMS("%s\n", __func__);
1736 
1737 	/* get ipp driver entry */
1738 	list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list) {
1739 		ippdrv->drm_dev = drm_dev;
1740 
1741 		ret = ipp_create_id(&ctx->ipp_idr, &ctx->ipp_lock, ippdrv,
1742 			&ippdrv->ipp_id);
1743 		if (ret) {
1744 			DRM_ERROR("failed to create id.\n");
1745 			goto err_idr;
1746 		}
1747 
1748 		DRM_DEBUG_KMS("%s:count[%d]ippdrv[0x%x]ipp_id[%d]\n", __func__,
1749 			count++, (int)ippdrv, ippdrv->ipp_id);
1750 
1751 		if (ippdrv->ipp_id == 0) {
1752 			DRM_ERROR("failed to get ipp_id[%d]\n",
1753 				ippdrv->ipp_id);
1754 			goto err_idr;
1755 		}
1756 
1757 		/* store parent device for node */
1758 		ippdrv->parent_dev = dev;
1759 
1760 		/* store event work queue and handler */
1761 		ippdrv->event_workq = ctx->event_workq;
1762 		ippdrv->sched_event = ipp_sched_event;
1763 		INIT_LIST_HEAD(&ippdrv->cmd_list);
1764 
1765 		if (is_drm_iommu_supported(drm_dev)) {
1766 			ret = drm_iommu_attach_device(drm_dev, ippdrv->dev);
1767 			if (ret) {
1768 				DRM_ERROR("failed to activate iommu\n");
1769 				goto err_iommu;
1770 			}
1771 		}
1772 	}
1773 
1774 	return 0;
1775 
1776 err_iommu:
1777 	/* get ipp driver entry */
1778 	list_for_each_entry_reverse(ippdrv, &exynos_drm_ippdrv_list, drv_list)
1779 		if (is_drm_iommu_supported(drm_dev))
1780 			drm_iommu_detach_device(drm_dev, ippdrv->dev);
1781 
1782 err_idr:
1783 	idr_destroy(&ctx->ipp_idr);
1784 	idr_destroy(&ctx->prop_idr);
1785 	return ret;
1786 }
1787 
1788 static void ipp_subdrv_remove(struct drm_device *drm_dev, struct device *dev)
1789 {
1790 	struct exynos_drm_ippdrv *ippdrv;
1791 
1792 	DRM_DEBUG_KMS("%s\n", __func__);
1793 
1794 	/* get ipp driver entry */
1795 	list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list) {
1796 		if (is_drm_iommu_supported(drm_dev))
1797 			drm_iommu_detach_device(drm_dev, ippdrv->dev);
1798 
1799 		ippdrv->drm_dev = NULL;
1800 		exynos_drm_ippdrv_unregister(ippdrv);
1801 	}
1802 }
1803 
1804 static int ipp_subdrv_open(struct drm_device *drm_dev, struct device *dev,
1805 		struct drm_file *file)
1806 {
1807 	struct drm_exynos_file_private *file_priv = file->driver_priv;
1808 	struct exynos_drm_ipp_private *priv;
1809 
1810 	DRM_DEBUG_KMS("%s\n", __func__);
1811 
1812 	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1813 	if (!priv) {
1814 		DRM_ERROR("failed to allocate priv.\n");
1815 		return -ENOMEM;
1816 	}
1817 	priv->dev = dev;
1818 	file_priv->ipp_priv = priv;
1819 
1820 	INIT_LIST_HEAD(&priv->event_list);
1821 
1822 	DRM_DEBUG_KMS("%s:done priv[0x%x]\n", __func__, (int)priv);
1823 
1824 	return 0;
1825 }
1826 
1827 static void ipp_subdrv_close(struct drm_device *drm_dev, struct device *dev,
1828 		struct drm_file *file)
1829 {
1830 	struct drm_exynos_file_private *file_priv = file->driver_priv;
1831 	struct exynos_drm_ipp_private *priv = file_priv->ipp_priv;
1832 	struct exynos_drm_ippdrv *ippdrv = NULL;
1833 	struct drm_exynos_ipp_cmd_node *c_node, *tc_node;
1834 	int count = 0;
1835 
1836 	DRM_DEBUG_KMS("%s:for priv[0x%x]\n", __func__, (int)priv);
1837 
1838 	if (list_empty(&exynos_drm_ippdrv_list)) {
1839 		DRM_DEBUG_KMS("%s:ippdrv_list is empty.\n", __func__);
1840 		goto err_clear;
1841 	}
1842 
1843 	list_for_each_entry(ippdrv, &exynos_drm_ippdrv_list, drv_list) {
1844 		if (list_empty(&ippdrv->cmd_list))
1845 			continue;
1846 
1847 		list_for_each_entry_safe(c_node, tc_node,
1848 			&ippdrv->cmd_list, list) {
1849 			DRM_DEBUG_KMS("%s:count[%d]ippdrv[0x%x]\n",
1850 				__func__, count++, (int)ippdrv);
1851 
1852 			if (c_node->priv == priv) {
1853 				/*
1854 				 * userland goto unnormal state. process killed.
1855 				 * and close the file.
1856 				 * so, IPP didn't called stop cmd ctrl.
1857 				 * so, we are make stop operation in this state.
1858 				 */
1859 				if (c_node->state == IPP_STATE_START) {
1860 					ipp_stop_property(drm_dev, ippdrv,
1861 						c_node);
1862 					c_node->state = IPP_STATE_STOP;
1863 				}
1864 
1865 				ippdrv->dedicated = false;
1866 				ipp_clean_cmd_node(c_node);
1867 				if (list_empty(&ippdrv->cmd_list))
1868 					pm_runtime_put_sync(ippdrv->dev);
1869 			}
1870 		}
1871 	}
1872 
1873 err_clear:
1874 	kfree(priv);
1875 	return;
1876 }
1877 
1878 static int ipp_probe(struct platform_device *pdev)
1879 {
1880 	struct device *dev = &pdev->dev;
1881 	struct ipp_context *ctx;
1882 	struct exynos_drm_subdrv *subdrv;
1883 	int ret;
1884 
1885 	ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL);
1886 	if (!ctx)
1887 		return -ENOMEM;
1888 
1889 	DRM_DEBUG_KMS("%s\n", __func__);
1890 
1891 	mutex_init(&ctx->ipp_lock);
1892 	mutex_init(&ctx->prop_lock);
1893 
1894 	idr_init(&ctx->ipp_idr);
1895 	idr_init(&ctx->prop_idr);
1896 
1897 	/*
1898 	 * create single thread for ipp event
1899 	 * IPP supports event thread for IPP drivers.
1900 	 * IPP driver send event_work to this thread.
1901 	 * and IPP event thread send event to user process.
1902 	 */
1903 	ctx->event_workq = create_singlethread_workqueue("ipp_event");
1904 	if (!ctx->event_workq) {
1905 		dev_err(dev, "failed to create event workqueue\n");
1906 		return -EINVAL;
1907 	}
1908 
1909 	/*
1910 	 * create single thread for ipp command
1911 	 * IPP supports command thread for user process.
1912 	 * user process make command node using set property ioctl.
1913 	 * and make start_work and send this work to command thread.
1914 	 * and then this command thread start property.
1915 	 */
1916 	ctx->cmd_workq = create_singlethread_workqueue("ipp_cmd");
1917 	if (!ctx->cmd_workq) {
1918 		dev_err(dev, "failed to create cmd workqueue\n");
1919 		ret = -EINVAL;
1920 		goto err_event_workq;
1921 	}
1922 
1923 	/* set sub driver informations */
1924 	subdrv = &ctx->subdrv;
1925 	subdrv->dev = dev;
1926 	subdrv->probe = ipp_subdrv_probe;
1927 	subdrv->remove = ipp_subdrv_remove;
1928 	subdrv->open = ipp_subdrv_open;
1929 	subdrv->close = ipp_subdrv_close;
1930 
1931 	platform_set_drvdata(pdev, ctx);
1932 
1933 	ret = exynos_drm_subdrv_register(subdrv);
1934 	if (ret < 0) {
1935 		DRM_ERROR("failed to register drm ipp device.\n");
1936 		goto err_cmd_workq;
1937 	}
1938 
1939 	dev_info(&pdev->dev, "drm ipp registered successfully.\n");
1940 
1941 	return 0;
1942 
1943 err_cmd_workq:
1944 	destroy_workqueue(ctx->cmd_workq);
1945 err_event_workq:
1946 	destroy_workqueue(ctx->event_workq);
1947 	return ret;
1948 }
1949 
1950 static int ipp_remove(struct platform_device *pdev)
1951 {
1952 	struct ipp_context *ctx = platform_get_drvdata(pdev);
1953 
1954 	DRM_DEBUG_KMS("%s\n", __func__);
1955 
1956 	/* unregister sub driver */
1957 	exynos_drm_subdrv_unregister(&ctx->subdrv);
1958 
1959 	/* remove,destroy ipp idr */
1960 	idr_destroy(&ctx->ipp_idr);
1961 	idr_destroy(&ctx->prop_idr);
1962 
1963 	mutex_destroy(&ctx->ipp_lock);
1964 	mutex_destroy(&ctx->prop_lock);
1965 
1966 	/* destroy command, event work queue */
1967 	destroy_workqueue(ctx->cmd_workq);
1968 	destroy_workqueue(ctx->event_workq);
1969 
1970 	return 0;
1971 }
1972 
1973 static int ipp_power_ctrl(struct ipp_context *ctx, bool enable)
1974 {
1975 	DRM_DEBUG_KMS("%s:enable[%d]\n", __func__, enable);
1976 
1977 	return 0;
1978 }
1979 
1980 #ifdef CONFIG_PM_SLEEP
1981 static int ipp_suspend(struct device *dev)
1982 {
1983 	struct ipp_context *ctx = get_ipp_context(dev);
1984 
1985 	DRM_DEBUG_KMS("%s\n", __func__);
1986 
1987 	if (pm_runtime_suspended(dev))
1988 		return 0;
1989 
1990 	return ipp_power_ctrl(ctx, false);
1991 }
1992 
1993 static int ipp_resume(struct device *dev)
1994 {
1995 	struct ipp_context *ctx = get_ipp_context(dev);
1996 
1997 	DRM_DEBUG_KMS("%s\n", __func__);
1998 
1999 	if (!pm_runtime_suspended(dev))
2000 		return ipp_power_ctrl(ctx, true);
2001 
2002 	return 0;
2003 }
2004 #endif
2005 
2006 #ifdef CONFIG_PM_RUNTIME
2007 static int ipp_runtime_suspend(struct device *dev)
2008 {
2009 	struct ipp_context *ctx = get_ipp_context(dev);
2010 
2011 	DRM_DEBUG_KMS("%s\n", __func__);
2012 
2013 	return ipp_power_ctrl(ctx, false);
2014 }
2015 
2016 static int ipp_runtime_resume(struct device *dev)
2017 {
2018 	struct ipp_context *ctx = get_ipp_context(dev);
2019 
2020 	DRM_DEBUG_KMS("%s\n", __func__);
2021 
2022 	return ipp_power_ctrl(ctx, true);
2023 }
2024 #endif
2025 
2026 static const struct dev_pm_ops ipp_pm_ops = {
2027 	SET_SYSTEM_SLEEP_PM_OPS(ipp_suspend, ipp_resume)
2028 	SET_RUNTIME_PM_OPS(ipp_runtime_suspend, ipp_runtime_resume, NULL)
2029 };
2030 
2031 struct platform_driver ipp_driver = {
2032 	.probe		= ipp_probe,
2033 	.remove		= ipp_remove,
2034 	.driver		= {
2035 		.name	= "exynos-drm-ipp",
2036 		.owner	= THIS_MODULE,
2037 		.pm	= &ipp_pm_ops,
2038 	},
2039 };
2040 
2041