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