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. */ 49 static 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 */ 57 struct 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 */ 72 struct 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 */ 92 struct 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 102 static LIST_HEAD(exynos_drm_ippdrv_list); 103 static DEFINE_MUTEX(exynos_drm_ippdrv_lock); 104 static BLOCKING_NOTIFIER_HEAD(exynos_drm_ippnb_list); 105 106 int 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 122 void 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 130 int 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 142 int 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 154 static 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 170 static 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 191 static 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 205 static 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 271 static 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 302 int 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 355 static 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 370 static 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 405 static 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 418 static 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 431 int 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 537 err_free_stop: 538 kfree(c_node->stop_work); 539 err_free_start: 540 kfree(c_node->start_work); 541 err_clear: 542 kfree(c_node); 543 return ret; 544 } 545 546 static 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 563 static 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 610 static 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 635 static 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 671 err_unlock: 672 mutex_unlock(&c_node->mem_lock); 673 return ret; 674 } 675 676 static 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 730 err_clear: 731 kfree(m_node); 732 err_unlock: 733 mutex_unlock(&c_node->mem_lock); 734 return ERR_PTR(-EFAULT); 735 } 736 737 static 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 776 static void ipp_free_event(struct drm_pending_event *event) 777 { 778 kfree(event); 779 } 780 781 static 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 813 static 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 849 static 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 861 static 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 915 static 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 932 int 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 1018 err_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 1025 static 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 1059 err_status: 1060 DRM_ERROR("invalid status:ctrl[%d]state[%d]\n", ctrl, state); 1061 return false; 1062 } 1063 1064 int 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 1167 int exynos_drm_ippnb_register(struct notifier_block *nb) 1168 { 1169 return blocking_notifier_chain_register( 1170 &exynos_drm_ippnb_list, nb); 1171 } 1172 1173 int exynos_drm_ippnb_unregister(struct notifier_block *nb) 1174 { 1175 return blocking_notifier_chain_unregister( 1176 &exynos_drm_ippnb_list, nb); 1177 } 1178 1179 int 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 1185 static 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 1250 static 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 1343 static 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 1420 err_clear: 1421 /* stop operations */ 1422 if (ippdrv->stop) 1423 ippdrv->stop(ippdrv->dev, property->cmd); 1424 1425 return ret; 1426 } 1427 1428 void 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 1496 err_unlock: 1497 mutex_unlock(&c_node->cmd_lock); 1498 } 1499 1500 static 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 1640 void 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 1687 err_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 1694 static 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 1739 err_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 1745 err_idr: 1746 idr_destroy(&ctx->ipp_idr); 1747 idr_destroy(&ctx->prop_idr); 1748 return ret; 1749 } 1750 1751 static 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 1765 static 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 1784 static 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 1830 err_clear: 1831 kfree(priv); 1832 return; 1833 } 1834 1835 static 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 1898 err_cmd_workq: 1899 destroy_workqueue(ctx->cmd_workq); 1900 err_event_workq: 1901 destroy_workqueue(ctx->event_workq); 1902 return ret; 1903 } 1904 1905 static 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 1926 static 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 1934 static 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 1944 static 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 1956 static 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 1963 static 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 1971 static 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 1976 struct 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 1986