Linux Audio

Check our new training course

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