exynos_drm_g2d.c (40045B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2012 Samsung Electronics Co.Ltd 4 * Authors: Joonyoung Shim <jy0922.shim@samsung.com> 5 */ 6 7#include <linux/refcount.h> 8#include <linux/clk.h> 9#include <linux/component.h> 10#include <linux/delay.h> 11#include <linux/dma-mapping.h> 12#include <linux/err.h> 13#include <linux/interrupt.h> 14#include <linux/io.h> 15#include <linux/kernel.h> 16#include <linux/of.h> 17#include <linux/platform_device.h> 18#include <linux/pm_runtime.h> 19#include <linux/slab.h> 20#include <linux/uaccess.h> 21#include <linux/workqueue.h> 22 23#include <drm/drm_file.h> 24#include <drm/exynos_drm.h> 25 26#include "exynos_drm_drv.h" 27#include "exynos_drm_g2d.h" 28#include "exynos_drm_gem.h" 29 30#define G2D_HW_MAJOR_VER 4 31#define G2D_HW_MINOR_VER 1 32 33/* vaild register range set from user: 0x0104 ~ 0x0880 */ 34#define G2D_VALID_START 0x0104 35#define G2D_VALID_END 0x0880 36 37/* general registers */ 38#define G2D_SOFT_RESET 0x0000 39#define G2D_INTEN 0x0004 40#define G2D_INTC_PEND 0x000C 41#define G2D_DMA_SFR_BASE_ADDR 0x0080 42#define G2D_DMA_COMMAND 0x0084 43#define G2D_DMA_STATUS 0x008C 44#define G2D_DMA_HOLD_CMD 0x0090 45 46/* command registers */ 47#define G2D_BITBLT_START 0x0100 48 49/* registers for base address */ 50#define G2D_SRC_BASE_ADDR 0x0304 51#define G2D_SRC_STRIDE 0x0308 52#define G2D_SRC_COLOR_MODE 0x030C 53#define G2D_SRC_LEFT_TOP 0x0310 54#define G2D_SRC_RIGHT_BOTTOM 0x0314 55#define G2D_SRC_PLANE2_BASE_ADDR 0x0318 56#define G2D_DST_BASE_ADDR 0x0404 57#define G2D_DST_STRIDE 0x0408 58#define G2D_DST_COLOR_MODE 0x040C 59#define G2D_DST_LEFT_TOP 0x0410 60#define G2D_DST_RIGHT_BOTTOM 0x0414 61#define G2D_DST_PLANE2_BASE_ADDR 0x0418 62#define G2D_PAT_BASE_ADDR 0x0500 63#define G2D_MSK_BASE_ADDR 0x0520 64 65/* G2D_SOFT_RESET */ 66#define G2D_SFRCLEAR (1 << 1) 67#define G2D_R (1 << 0) 68 69/* G2D_INTEN */ 70#define G2D_INTEN_ACF (1 << 3) 71#define G2D_INTEN_UCF (1 << 2) 72#define G2D_INTEN_GCF (1 << 1) 73#define G2D_INTEN_SCF (1 << 0) 74 75/* G2D_INTC_PEND */ 76#define G2D_INTP_ACMD_FIN (1 << 3) 77#define G2D_INTP_UCMD_FIN (1 << 2) 78#define G2D_INTP_GCMD_FIN (1 << 1) 79#define G2D_INTP_SCMD_FIN (1 << 0) 80 81/* G2D_DMA_COMMAND */ 82#define G2D_DMA_HALT (1 << 2) 83#define G2D_DMA_CONTINUE (1 << 1) 84#define G2D_DMA_START (1 << 0) 85 86/* G2D_DMA_STATUS */ 87#define G2D_DMA_LIST_DONE_COUNT (0xFF << 17) 88#define G2D_DMA_BITBLT_DONE_COUNT (0xFFFF << 1) 89#define G2D_DMA_DONE (1 << 0) 90#define G2D_DMA_LIST_DONE_COUNT_OFFSET 17 91 92/* G2D_DMA_HOLD_CMD */ 93#define G2D_USER_HOLD (1 << 2) 94#define G2D_LIST_HOLD (1 << 1) 95#define G2D_BITBLT_HOLD (1 << 0) 96 97/* G2D_BITBLT_START */ 98#define G2D_START_CASESEL (1 << 2) 99#define G2D_START_NHOLT (1 << 1) 100#define G2D_START_BITBLT (1 << 0) 101 102/* buffer color format */ 103#define G2D_FMT_XRGB8888 0 104#define G2D_FMT_ARGB8888 1 105#define G2D_FMT_RGB565 2 106#define G2D_FMT_XRGB1555 3 107#define G2D_FMT_ARGB1555 4 108#define G2D_FMT_XRGB4444 5 109#define G2D_FMT_ARGB4444 6 110#define G2D_FMT_PACKED_RGB888 7 111#define G2D_FMT_A8 11 112#define G2D_FMT_L8 12 113 114/* buffer valid length */ 115#define G2D_LEN_MIN 1 116#define G2D_LEN_MAX 8000 117 118#define G2D_CMDLIST_SIZE (PAGE_SIZE / 4) 119#define G2D_CMDLIST_NUM 64 120#define G2D_CMDLIST_POOL_SIZE (G2D_CMDLIST_SIZE * G2D_CMDLIST_NUM) 121#define G2D_CMDLIST_DATA_NUM (G2D_CMDLIST_SIZE / sizeof(u32) - 2) 122 123/* maximum buffer pool size of userptr is 64MB as default */ 124#define MAX_POOL (64 * 1024 * 1024) 125 126enum { 127 BUF_TYPE_GEM = 1, 128 BUF_TYPE_USERPTR, 129}; 130 131enum g2d_reg_type { 132 REG_TYPE_NONE = -1, 133 REG_TYPE_SRC, 134 REG_TYPE_SRC_PLANE2, 135 REG_TYPE_DST, 136 REG_TYPE_DST_PLANE2, 137 REG_TYPE_PAT, 138 REG_TYPE_MSK, 139 MAX_REG_TYPE_NR 140}; 141 142enum g2d_flag_bits { 143 /* 144 * If set, suspends the runqueue worker after the currently 145 * processed node is finished. 146 */ 147 G2D_BIT_SUSPEND_RUNQUEUE, 148 /* 149 * If set, indicates that the engine is currently busy. 150 */ 151 G2D_BIT_ENGINE_BUSY, 152}; 153 154/* cmdlist data structure */ 155struct g2d_cmdlist { 156 u32 head; 157 unsigned long data[G2D_CMDLIST_DATA_NUM]; 158 u32 last; /* last data offset */ 159}; 160 161/* 162 * A structure of buffer description 163 * 164 * @format: color format 165 * @stride: buffer stride/pitch in bytes 166 * @left_x: the x coordinates of left top corner 167 * @top_y: the y coordinates of left top corner 168 * @right_x: the x coordinates of right bottom corner 169 * @bottom_y: the y coordinates of right bottom corner 170 * 171 */ 172struct g2d_buf_desc { 173 unsigned int format; 174 unsigned int stride; 175 unsigned int left_x; 176 unsigned int top_y; 177 unsigned int right_x; 178 unsigned int bottom_y; 179}; 180 181/* 182 * A structure of buffer information 183 * 184 * @map_nr: manages the number of mapped buffers 185 * @reg_types: stores regitster type in the order of requested command 186 * @handles: stores buffer handle in its reg_type position 187 * @types: stores buffer type in its reg_type position 188 * @descs: stores buffer description in its reg_type position 189 * 190 */ 191struct g2d_buf_info { 192 unsigned int map_nr; 193 enum g2d_reg_type reg_types[MAX_REG_TYPE_NR]; 194 void *obj[MAX_REG_TYPE_NR]; 195 unsigned int types[MAX_REG_TYPE_NR]; 196 struct g2d_buf_desc descs[MAX_REG_TYPE_NR]; 197}; 198 199struct drm_exynos_pending_g2d_event { 200 struct drm_pending_event base; 201 struct drm_exynos_g2d_event event; 202}; 203 204struct g2d_cmdlist_userptr { 205 struct list_head list; 206 dma_addr_t dma_addr; 207 unsigned long userptr; 208 unsigned long size; 209 struct page **pages; 210 unsigned int npages; 211 struct sg_table *sgt; 212 refcount_t refcount; 213 bool in_pool; 214 bool out_of_list; 215}; 216struct g2d_cmdlist_node { 217 struct list_head list; 218 struct g2d_cmdlist *cmdlist; 219 dma_addr_t dma_addr; 220 struct g2d_buf_info buf_info; 221 222 struct drm_exynos_pending_g2d_event *event; 223}; 224 225struct g2d_runqueue_node { 226 struct list_head list; 227 struct list_head run_cmdlist; 228 struct list_head event_list; 229 struct drm_file *filp; 230 pid_t pid; 231 struct completion complete; 232 int async; 233}; 234 235struct g2d_data { 236 struct device *dev; 237 void *dma_priv; 238 struct clk *gate_clk; 239 void __iomem *regs; 240 int irq; 241 struct workqueue_struct *g2d_workq; 242 struct work_struct runqueue_work; 243 struct drm_device *drm_dev; 244 unsigned long flags; 245 246 /* cmdlist */ 247 struct g2d_cmdlist_node *cmdlist_node; 248 struct list_head free_cmdlist; 249 struct mutex cmdlist_mutex; 250 dma_addr_t cmdlist_pool; 251 void *cmdlist_pool_virt; 252 unsigned long cmdlist_dma_attrs; 253 254 /* runqueue*/ 255 struct g2d_runqueue_node *runqueue_node; 256 struct list_head runqueue; 257 struct mutex runqueue_mutex; 258 struct kmem_cache *runqueue_slab; 259 260 unsigned long current_pool; 261 unsigned long max_pool; 262}; 263 264static inline void g2d_hw_reset(struct g2d_data *g2d) 265{ 266 writel(G2D_R | G2D_SFRCLEAR, g2d->regs + G2D_SOFT_RESET); 267 clear_bit(G2D_BIT_ENGINE_BUSY, &g2d->flags); 268} 269 270static int g2d_init_cmdlist(struct g2d_data *g2d) 271{ 272 struct device *dev = g2d->dev; 273 struct g2d_cmdlist_node *node; 274 int nr; 275 int ret; 276 struct g2d_buf_info *buf_info; 277 278 g2d->cmdlist_dma_attrs = DMA_ATTR_WRITE_COMBINE; 279 280 g2d->cmdlist_pool_virt = dma_alloc_attrs(to_dma_dev(g2d->drm_dev), 281 G2D_CMDLIST_POOL_SIZE, 282 &g2d->cmdlist_pool, GFP_KERNEL, 283 g2d->cmdlist_dma_attrs); 284 if (!g2d->cmdlist_pool_virt) { 285 dev_err(dev, "failed to allocate dma memory\n"); 286 return -ENOMEM; 287 } 288 289 node = kcalloc(G2D_CMDLIST_NUM, sizeof(*node), GFP_KERNEL); 290 if (!node) { 291 ret = -ENOMEM; 292 goto err; 293 } 294 295 for (nr = 0; nr < G2D_CMDLIST_NUM; nr++) { 296 unsigned int i; 297 298 node[nr].cmdlist = 299 g2d->cmdlist_pool_virt + nr * G2D_CMDLIST_SIZE; 300 node[nr].dma_addr = 301 g2d->cmdlist_pool + nr * G2D_CMDLIST_SIZE; 302 303 buf_info = &node[nr].buf_info; 304 for (i = 0; i < MAX_REG_TYPE_NR; i++) 305 buf_info->reg_types[i] = REG_TYPE_NONE; 306 307 list_add_tail(&node[nr].list, &g2d->free_cmdlist); 308 } 309 310 return 0; 311 312err: 313 dma_free_attrs(to_dma_dev(g2d->drm_dev), G2D_CMDLIST_POOL_SIZE, 314 g2d->cmdlist_pool_virt, 315 g2d->cmdlist_pool, g2d->cmdlist_dma_attrs); 316 return ret; 317} 318 319static void g2d_fini_cmdlist(struct g2d_data *g2d) 320{ 321 kfree(g2d->cmdlist_node); 322 323 if (g2d->cmdlist_pool_virt && g2d->cmdlist_pool) { 324 dma_free_attrs(to_dma_dev(g2d->drm_dev), 325 G2D_CMDLIST_POOL_SIZE, 326 g2d->cmdlist_pool_virt, 327 g2d->cmdlist_pool, g2d->cmdlist_dma_attrs); 328 } 329} 330 331static struct g2d_cmdlist_node *g2d_get_cmdlist(struct g2d_data *g2d) 332{ 333 struct device *dev = g2d->dev; 334 struct g2d_cmdlist_node *node; 335 336 mutex_lock(&g2d->cmdlist_mutex); 337 if (list_empty(&g2d->free_cmdlist)) { 338 dev_err(dev, "there is no free cmdlist\n"); 339 mutex_unlock(&g2d->cmdlist_mutex); 340 return NULL; 341 } 342 343 node = list_first_entry(&g2d->free_cmdlist, struct g2d_cmdlist_node, 344 list); 345 list_del_init(&node->list); 346 mutex_unlock(&g2d->cmdlist_mutex); 347 348 return node; 349} 350 351static void g2d_put_cmdlist(struct g2d_data *g2d, struct g2d_cmdlist_node *node) 352{ 353 mutex_lock(&g2d->cmdlist_mutex); 354 list_move_tail(&node->list, &g2d->free_cmdlist); 355 mutex_unlock(&g2d->cmdlist_mutex); 356} 357 358static void g2d_add_cmdlist_to_inuse(struct drm_exynos_file_private *file_priv, 359 struct g2d_cmdlist_node *node) 360{ 361 struct g2d_cmdlist_node *lnode; 362 363 if (list_empty(&file_priv->inuse_cmdlist)) 364 goto add_to_list; 365 366 /* this links to base address of new cmdlist */ 367 lnode = list_entry(file_priv->inuse_cmdlist.prev, 368 struct g2d_cmdlist_node, list); 369 lnode->cmdlist->data[lnode->cmdlist->last] = node->dma_addr; 370 371add_to_list: 372 list_add_tail(&node->list, &file_priv->inuse_cmdlist); 373 374 if (node->event) 375 list_add_tail(&node->event->base.link, &file_priv->event_list); 376} 377 378static void g2d_userptr_put_dma_addr(struct g2d_data *g2d, 379 void *obj, 380 bool force) 381{ 382 struct g2d_cmdlist_userptr *g2d_userptr = obj; 383 384 if (!obj) 385 return; 386 387 if (force) 388 goto out; 389 390 refcount_dec(&g2d_userptr->refcount); 391 392 if (refcount_read(&g2d_userptr->refcount) > 0) 393 return; 394 395 if (g2d_userptr->in_pool) 396 return; 397 398out: 399 dma_unmap_sgtable(to_dma_dev(g2d->drm_dev), g2d_userptr->sgt, 400 DMA_BIDIRECTIONAL, 0); 401 402 unpin_user_pages_dirty_lock(g2d_userptr->pages, g2d_userptr->npages, 403 true); 404 kvfree(g2d_userptr->pages); 405 406 if (!g2d_userptr->out_of_list) 407 list_del_init(&g2d_userptr->list); 408 409 sg_free_table(g2d_userptr->sgt); 410 kfree(g2d_userptr->sgt); 411 kfree(g2d_userptr); 412} 413 414static dma_addr_t *g2d_userptr_get_dma_addr(struct g2d_data *g2d, 415 unsigned long userptr, 416 unsigned long size, 417 struct drm_file *filp, 418 void **obj) 419{ 420 struct drm_exynos_file_private *file_priv = filp->driver_priv; 421 struct g2d_cmdlist_userptr *g2d_userptr; 422 struct sg_table *sgt; 423 unsigned long start, end; 424 unsigned int npages, offset; 425 int ret; 426 427 if (!size) { 428 DRM_DEV_ERROR(g2d->dev, "invalid userptr size.\n"); 429 return ERR_PTR(-EINVAL); 430 } 431 432 /* check if userptr already exists in userptr_list. */ 433 list_for_each_entry(g2d_userptr, &file_priv->userptr_list, list) { 434 if (g2d_userptr->userptr == userptr) { 435 /* 436 * also check size because there could be same address 437 * and different size. 438 */ 439 if (g2d_userptr->size == size) { 440 refcount_inc(&g2d_userptr->refcount); 441 *obj = g2d_userptr; 442 443 return &g2d_userptr->dma_addr; 444 } 445 446 /* 447 * at this moment, maybe g2d dma is accessing this 448 * g2d_userptr memory region so just remove this 449 * g2d_userptr object from userptr_list not to be 450 * referred again and also except it the userptr 451 * pool to be released after the dma access completion. 452 */ 453 g2d_userptr->out_of_list = true; 454 g2d_userptr->in_pool = false; 455 list_del_init(&g2d_userptr->list); 456 457 break; 458 } 459 } 460 461 g2d_userptr = kzalloc(sizeof(*g2d_userptr), GFP_KERNEL); 462 if (!g2d_userptr) 463 return ERR_PTR(-ENOMEM); 464 465 refcount_set(&g2d_userptr->refcount, 1); 466 g2d_userptr->size = size; 467 468 start = userptr & PAGE_MASK; 469 offset = userptr & ~PAGE_MASK; 470 end = PAGE_ALIGN(userptr + size); 471 npages = (end - start) >> PAGE_SHIFT; 472 g2d_userptr->pages = kvmalloc_array(npages, sizeof(*g2d_userptr->pages), 473 GFP_KERNEL); 474 if (!g2d_userptr->pages) { 475 ret = -ENOMEM; 476 goto err_free; 477 } 478 479 ret = pin_user_pages_fast(start, npages, 480 FOLL_FORCE | FOLL_WRITE | FOLL_LONGTERM, 481 g2d_userptr->pages); 482 if (ret != npages) { 483 DRM_DEV_ERROR(g2d->dev, 484 "failed to get user pages from userptr.\n"); 485 if (ret < 0) 486 goto err_destroy_pages; 487 npages = ret; 488 ret = -EFAULT; 489 goto err_unpin_pages; 490 } 491 g2d_userptr->npages = npages; 492 493 sgt = kzalloc(sizeof(*sgt), GFP_KERNEL); 494 if (!sgt) { 495 ret = -ENOMEM; 496 goto err_unpin_pages; 497 } 498 499 ret = sg_alloc_table_from_pages(sgt, 500 g2d_userptr->pages, 501 npages, offset, size, GFP_KERNEL); 502 if (ret < 0) { 503 DRM_DEV_ERROR(g2d->dev, "failed to get sgt from pages.\n"); 504 goto err_free_sgt; 505 } 506 507 g2d_userptr->sgt = sgt; 508 509 ret = dma_map_sgtable(to_dma_dev(g2d->drm_dev), sgt, 510 DMA_BIDIRECTIONAL, 0); 511 if (ret) { 512 DRM_DEV_ERROR(g2d->dev, "failed to map sgt with dma region.\n"); 513 goto err_sg_free_table; 514 } 515 516 g2d_userptr->dma_addr = sgt->sgl[0].dma_address; 517 g2d_userptr->userptr = userptr; 518 519 list_add_tail(&g2d_userptr->list, &file_priv->userptr_list); 520 521 if (g2d->current_pool + (npages << PAGE_SHIFT) < g2d->max_pool) { 522 g2d->current_pool += npages << PAGE_SHIFT; 523 g2d_userptr->in_pool = true; 524 } 525 526 *obj = g2d_userptr; 527 528 return &g2d_userptr->dma_addr; 529 530err_sg_free_table: 531 sg_free_table(sgt); 532 533err_free_sgt: 534 kfree(sgt); 535 536err_unpin_pages: 537 unpin_user_pages(g2d_userptr->pages, npages); 538 539err_destroy_pages: 540 kvfree(g2d_userptr->pages); 541 542err_free: 543 kfree(g2d_userptr); 544 545 return ERR_PTR(ret); 546} 547 548static void g2d_userptr_free_all(struct g2d_data *g2d, struct drm_file *filp) 549{ 550 struct drm_exynos_file_private *file_priv = filp->driver_priv; 551 struct g2d_cmdlist_userptr *g2d_userptr, *n; 552 553 list_for_each_entry_safe(g2d_userptr, n, &file_priv->userptr_list, list) 554 if (g2d_userptr->in_pool) 555 g2d_userptr_put_dma_addr(g2d, g2d_userptr, true); 556 557 g2d->current_pool = 0; 558} 559 560static enum g2d_reg_type g2d_get_reg_type(struct g2d_data *g2d, int reg_offset) 561{ 562 enum g2d_reg_type reg_type; 563 564 switch (reg_offset) { 565 case G2D_SRC_BASE_ADDR: 566 case G2D_SRC_STRIDE: 567 case G2D_SRC_COLOR_MODE: 568 case G2D_SRC_LEFT_TOP: 569 case G2D_SRC_RIGHT_BOTTOM: 570 reg_type = REG_TYPE_SRC; 571 break; 572 case G2D_SRC_PLANE2_BASE_ADDR: 573 reg_type = REG_TYPE_SRC_PLANE2; 574 break; 575 case G2D_DST_BASE_ADDR: 576 case G2D_DST_STRIDE: 577 case G2D_DST_COLOR_MODE: 578 case G2D_DST_LEFT_TOP: 579 case G2D_DST_RIGHT_BOTTOM: 580 reg_type = REG_TYPE_DST; 581 break; 582 case G2D_DST_PLANE2_BASE_ADDR: 583 reg_type = REG_TYPE_DST_PLANE2; 584 break; 585 case G2D_PAT_BASE_ADDR: 586 reg_type = REG_TYPE_PAT; 587 break; 588 case G2D_MSK_BASE_ADDR: 589 reg_type = REG_TYPE_MSK; 590 break; 591 default: 592 reg_type = REG_TYPE_NONE; 593 DRM_DEV_ERROR(g2d->dev, "Unknown register offset![%d]\n", 594 reg_offset); 595 break; 596 } 597 598 return reg_type; 599} 600 601static unsigned long g2d_get_buf_bpp(unsigned int format) 602{ 603 unsigned long bpp; 604 605 switch (format) { 606 case G2D_FMT_XRGB8888: 607 case G2D_FMT_ARGB8888: 608 bpp = 4; 609 break; 610 case G2D_FMT_RGB565: 611 case G2D_FMT_XRGB1555: 612 case G2D_FMT_ARGB1555: 613 case G2D_FMT_XRGB4444: 614 case G2D_FMT_ARGB4444: 615 bpp = 2; 616 break; 617 case G2D_FMT_PACKED_RGB888: 618 bpp = 3; 619 break; 620 default: 621 bpp = 1; 622 break; 623 } 624 625 return bpp; 626} 627 628static bool g2d_check_buf_desc_is_valid(struct g2d_data *g2d, 629 struct g2d_buf_desc *buf_desc, 630 enum g2d_reg_type reg_type, 631 unsigned long size) 632{ 633 int width, height; 634 unsigned long bpp, last_pos; 635 636 /* 637 * check source and destination buffers only. 638 * so the others are always valid. 639 */ 640 if (reg_type != REG_TYPE_SRC && reg_type != REG_TYPE_DST) 641 return true; 642 643 /* This check also makes sure that right_x > left_x. */ 644 width = (int)buf_desc->right_x - (int)buf_desc->left_x; 645 if (width < G2D_LEN_MIN || width > G2D_LEN_MAX) { 646 DRM_DEV_ERROR(g2d->dev, "width[%d] is out of range!\n", width); 647 return false; 648 } 649 650 /* This check also makes sure that bottom_y > top_y. */ 651 height = (int)buf_desc->bottom_y - (int)buf_desc->top_y; 652 if (height < G2D_LEN_MIN || height > G2D_LEN_MAX) { 653 DRM_DEV_ERROR(g2d->dev, 654 "height[%d] is out of range!\n", height); 655 return false; 656 } 657 658 bpp = g2d_get_buf_bpp(buf_desc->format); 659 660 /* Compute the position of the last byte that the engine accesses. */ 661 last_pos = ((unsigned long)buf_desc->bottom_y - 1) * 662 (unsigned long)buf_desc->stride + 663 (unsigned long)buf_desc->right_x * bpp - 1; 664 665 /* 666 * Since right_x > left_x and bottom_y > top_y we already know 667 * that the first_pos < last_pos (first_pos being the position 668 * of the first byte the engine accesses), it just remains to 669 * check if last_pos is smaller then the buffer size. 670 */ 671 672 if (last_pos >= size) { 673 DRM_DEV_ERROR(g2d->dev, "last engine access position [%lu] " 674 "is out of range [%lu]!\n", last_pos, size); 675 return false; 676 } 677 678 return true; 679} 680 681static int g2d_map_cmdlist_gem(struct g2d_data *g2d, 682 struct g2d_cmdlist_node *node, 683 struct drm_device *drm_dev, 684 struct drm_file *file) 685{ 686 struct g2d_cmdlist *cmdlist = node->cmdlist; 687 struct g2d_buf_info *buf_info = &node->buf_info; 688 int offset; 689 int ret; 690 int i; 691 692 for (i = 0; i < buf_info->map_nr; i++) { 693 struct g2d_buf_desc *buf_desc; 694 enum g2d_reg_type reg_type; 695 int reg_pos; 696 unsigned long handle; 697 dma_addr_t *addr; 698 699 reg_pos = cmdlist->last - 2 * (i + 1); 700 701 offset = cmdlist->data[reg_pos]; 702 handle = cmdlist->data[reg_pos + 1]; 703 704 reg_type = g2d_get_reg_type(g2d, offset); 705 if (reg_type == REG_TYPE_NONE) { 706 ret = -EFAULT; 707 goto err; 708 } 709 710 buf_desc = &buf_info->descs[reg_type]; 711 712 if (buf_info->types[reg_type] == BUF_TYPE_GEM) { 713 struct exynos_drm_gem *exynos_gem; 714 715 exynos_gem = exynos_drm_gem_get(file, handle); 716 if (!exynos_gem) { 717 ret = -EFAULT; 718 goto err; 719 } 720 721 if (!g2d_check_buf_desc_is_valid(g2d, buf_desc, 722 reg_type, exynos_gem->size)) { 723 exynos_drm_gem_put(exynos_gem); 724 ret = -EFAULT; 725 goto err; 726 } 727 728 addr = &exynos_gem->dma_addr; 729 buf_info->obj[reg_type] = exynos_gem; 730 } else { 731 struct drm_exynos_g2d_userptr g2d_userptr; 732 733 if (copy_from_user(&g2d_userptr, (void __user *)handle, 734 sizeof(struct drm_exynos_g2d_userptr))) { 735 ret = -EFAULT; 736 goto err; 737 } 738 739 if (!g2d_check_buf_desc_is_valid(g2d, buf_desc, 740 reg_type, 741 g2d_userptr.size)) { 742 ret = -EFAULT; 743 goto err; 744 } 745 746 addr = g2d_userptr_get_dma_addr(g2d, 747 g2d_userptr.userptr, 748 g2d_userptr.size, 749 file, 750 &buf_info->obj[reg_type]); 751 if (IS_ERR(addr)) { 752 ret = -EFAULT; 753 goto err; 754 } 755 } 756 757 cmdlist->data[reg_pos + 1] = *addr; 758 buf_info->reg_types[i] = reg_type; 759 } 760 761 return 0; 762 763err: 764 buf_info->map_nr = i; 765 return ret; 766} 767 768static void g2d_unmap_cmdlist_gem(struct g2d_data *g2d, 769 struct g2d_cmdlist_node *node, 770 struct drm_file *filp) 771{ 772 struct g2d_buf_info *buf_info = &node->buf_info; 773 int i; 774 775 for (i = 0; i < buf_info->map_nr; i++) { 776 struct g2d_buf_desc *buf_desc; 777 enum g2d_reg_type reg_type; 778 void *obj; 779 780 reg_type = buf_info->reg_types[i]; 781 782 buf_desc = &buf_info->descs[reg_type]; 783 obj = buf_info->obj[reg_type]; 784 785 if (buf_info->types[reg_type] == BUF_TYPE_GEM) 786 exynos_drm_gem_put(obj); 787 else 788 g2d_userptr_put_dma_addr(g2d, obj, false); 789 790 buf_info->reg_types[i] = REG_TYPE_NONE; 791 buf_info->obj[reg_type] = NULL; 792 buf_info->types[reg_type] = 0; 793 memset(buf_desc, 0x00, sizeof(*buf_desc)); 794 } 795 796 buf_info->map_nr = 0; 797} 798 799static void g2d_dma_start(struct g2d_data *g2d, 800 struct g2d_runqueue_node *runqueue_node) 801{ 802 struct g2d_cmdlist_node *node = 803 list_first_entry(&runqueue_node->run_cmdlist, 804 struct g2d_cmdlist_node, list); 805 806 set_bit(G2D_BIT_ENGINE_BUSY, &g2d->flags); 807 writel_relaxed(node->dma_addr, g2d->regs + G2D_DMA_SFR_BASE_ADDR); 808 writel_relaxed(G2D_DMA_START, g2d->regs + G2D_DMA_COMMAND); 809} 810 811static struct g2d_runqueue_node *g2d_get_runqueue_node(struct g2d_data *g2d) 812{ 813 struct g2d_runqueue_node *runqueue_node; 814 815 if (list_empty(&g2d->runqueue)) 816 return NULL; 817 818 runqueue_node = list_first_entry(&g2d->runqueue, 819 struct g2d_runqueue_node, list); 820 list_del_init(&runqueue_node->list); 821 return runqueue_node; 822} 823 824static void g2d_free_runqueue_node(struct g2d_data *g2d, 825 struct g2d_runqueue_node *runqueue_node) 826{ 827 struct g2d_cmdlist_node *node; 828 829 mutex_lock(&g2d->cmdlist_mutex); 830 /* 831 * commands in run_cmdlist have been completed so unmap all gem 832 * objects in each command node so that they are unreferenced. 833 */ 834 list_for_each_entry(node, &runqueue_node->run_cmdlist, list) 835 g2d_unmap_cmdlist_gem(g2d, node, runqueue_node->filp); 836 list_splice_tail_init(&runqueue_node->run_cmdlist, &g2d->free_cmdlist); 837 mutex_unlock(&g2d->cmdlist_mutex); 838 839 kmem_cache_free(g2d->runqueue_slab, runqueue_node); 840} 841 842/** 843 * g2d_remove_runqueue_nodes - remove items from the list of runqueue nodes 844 * @g2d: G2D state object 845 * @file: if not zero, only remove items with this DRM file 846 * 847 * Has to be called under runqueue lock. 848 */ 849static void g2d_remove_runqueue_nodes(struct g2d_data *g2d, struct drm_file *file) 850{ 851 struct g2d_runqueue_node *node, *n; 852 853 if (list_empty(&g2d->runqueue)) 854 return; 855 856 list_for_each_entry_safe(node, n, &g2d->runqueue, list) { 857 if (file && node->filp != file) 858 continue; 859 860 list_del_init(&node->list); 861 g2d_free_runqueue_node(g2d, node); 862 } 863} 864 865static void g2d_runqueue_worker(struct work_struct *work) 866{ 867 struct g2d_data *g2d = container_of(work, struct g2d_data, 868 runqueue_work); 869 struct g2d_runqueue_node *runqueue_node; 870 871 /* 872 * The engine is busy and the completion of the current node is going 873 * to poke the runqueue worker, so nothing to do here. 874 */ 875 if (test_bit(G2D_BIT_ENGINE_BUSY, &g2d->flags)) 876 return; 877 878 mutex_lock(&g2d->runqueue_mutex); 879 880 runqueue_node = g2d->runqueue_node; 881 g2d->runqueue_node = NULL; 882 883 if (runqueue_node) { 884 pm_runtime_mark_last_busy(g2d->dev); 885 pm_runtime_put_autosuspend(g2d->dev); 886 887 complete(&runqueue_node->complete); 888 if (runqueue_node->async) 889 g2d_free_runqueue_node(g2d, runqueue_node); 890 } 891 892 if (!test_bit(G2D_BIT_SUSPEND_RUNQUEUE, &g2d->flags)) { 893 g2d->runqueue_node = g2d_get_runqueue_node(g2d); 894 895 if (g2d->runqueue_node) { 896 int ret; 897 898 ret = pm_runtime_resume_and_get(g2d->dev); 899 if (ret < 0) { 900 dev_err(g2d->dev, "failed to enable G2D device.\n"); 901 goto out; 902 } 903 904 g2d_dma_start(g2d, g2d->runqueue_node); 905 } 906 } 907 908out: 909 mutex_unlock(&g2d->runqueue_mutex); 910} 911 912static void g2d_finish_event(struct g2d_data *g2d, u32 cmdlist_no) 913{ 914 struct drm_device *drm_dev = g2d->drm_dev; 915 struct g2d_runqueue_node *runqueue_node = g2d->runqueue_node; 916 struct drm_exynos_pending_g2d_event *e; 917 struct timespec64 now; 918 919 if (list_empty(&runqueue_node->event_list)) 920 return; 921 922 e = list_first_entry(&runqueue_node->event_list, 923 struct drm_exynos_pending_g2d_event, base.link); 924 925 ktime_get_ts64(&now); 926 e->event.tv_sec = now.tv_sec; 927 e->event.tv_usec = now.tv_nsec / NSEC_PER_USEC; 928 e->event.cmdlist_no = cmdlist_no; 929 930 drm_send_event(drm_dev, &e->base); 931} 932 933static irqreturn_t g2d_irq_handler(int irq, void *dev_id) 934{ 935 struct g2d_data *g2d = dev_id; 936 u32 pending; 937 938 pending = readl_relaxed(g2d->regs + G2D_INTC_PEND); 939 if (pending) 940 writel_relaxed(pending, g2d->regs + G2D_INTC_PEND); 941 942 if (pending & G2D_INTP_GCMD_FIN) { 943 u32 cmdlist_no = readl_relaxed(g2d->regs + G2D_DMA_STATUS); 944 945 cmdlist_no = (cmdlist_no & G2D_DMA_LIST_DONE_COUNT) >> 946 G2D_DMA_LIST_DONE_COUNT_OFFSET; 947 948 g2d_finish_event(g2d, cmdlist_no); 949 950 writel_relaxed(0, g2d->regs + G2D_DMA_HOLD_CMD); 951 if (!(pending & G2D_INTP_ACMD_FIN)) { 952 writel_relaxed(G2D_DMA_CONTINUE, 953 g2d->regs + G2D_DMA_COMMAND); 954 } 955 } 956 957 if (pending & G2D_INTP_ACMD_FIN) { 958 clear_bit(G2D_BIT_ENGINE_BUSY, &g2d->flags); 959 queue_work(g2d->g2d_workq, &g2d->runqueue_work); 960 } 961 962 return IRQ_HANDLED; 963} 964 965/** 966 * g2d_wait_finish - wait for the G2D engine to finish the current runqueue node 967 * @g2d: G2D state object 968 * @file: if not zero, only wait if the current runqueue node belongs 969 * to the DRM file 970 * 971 * Should the engine not become idle after a 100ms timeout, a hardware 972 * reset is issued. 973 */ 974static void g2d_wait_finish(struct g2d_data *g2d, struct drm_file *file) 975{ 976 struct device *dev = g2d->dev; 977 978 struct g2d_runqueue_node *runqueue_node = NULL; 979 unsigned int tries = 10; 980 981 mutex_lock(&g2d->runqueue_mutex); 982 983 /* If no node is currently processed, we have nothing to do. */ 984 if (!g2d->runqueue_node) 985 goto out; 986 987 runqueue_node = g2d->runqueue_node; 988 989 /* Check if the currently processed item belongs to us. */ 990 if (file && runqueue_node->filp != file) 991 goto out; 992 993 mutex_unlock(&g2d->runqueue_mutex); 994 995 /* Wait for the G2D engine to finish. */ 996 while (tries-- && (g2d->runqueue_node == runqueue_node)) 997 mdelay(10); 998 999 mutex_lock(&g2d->runqueue_mutex); 1000 1001 if (g2d->runqueue_node != runqueue_node) 1002 goto out; 1003 1004 dev_err(dev, "wait timed out, resetting engine...\n"); 1005 g2d_hw_reset(g2d); 1006 1007 /* 1008 * After the hardware reset of the engine we are going to loose 1009 * the IRQ which triggers the PM runtime put(). 1010 * So do this manually here. 1011 */ 1012 pm_runtime_mark_last_busy(dev); 1013 pm_runtime_put_autosuspend(dev); 1014 1015 complete(&runqueue_node->complete); 1016 if (runqueue_node->async) 1017 g2d_free_runqueue_node(g2d, runqueue_node); 1018 1019out: 1020 mutex_unlock(&g2d->runqueue_mutex); 1021} 1022 1023static int g2d_check_reg_offset(struct g2d_data *g2d, 1024 struct g2d_cmdlist_node *node, 1025 int nr, bool for_addr) 1026{ 1027 struct g2d_cmdlist *cmdlist = node->cmdlist; 1028 int reg_offset; 1029 int index; 1030 int i; 1031 1032 for (i = 0; i < nr; i++) { 1033 struct g2d_buf_info *buf_info = &node->buf_info; 1034 struct g2d_buf_desc *buf_desc; 1035 enum g2d_reg_type reg_type; 1036 unsigned long value; 1037 1038 index = cmdlist->last - 2 * (i + 1); 1039 1040 reg_offset = cmdlist->data[index] & ~0xfffff000; 1041 if (reg_offset < G2D_VALID_START || reg_offset > G2D_VALID_END) 1042 goto err; 1043 if (reg_offset % 4) 1044 goto err; 1045 1046 switch (reg_offset) { 1047 case G2D_SRC_BASE_ADDR: 1048 case G2D_SRC_PLANE2_BASE_ADDR: 1049 case G2D_DST_BASE_ADDR: 1050 case G2D_DST_PLANE2_BASE_ADDR: 1051 case G2D_PAT_BASE_ADDR: 1052 case G2D_MSK_BASE_ADDR: 1053 if (!for_addr) 1054 goto err; 1055 1056 reg_type = g2d_get_reg_type(g2d, reg_offset); 1057 1058 /* check userptr buffer type. */ 1059 if ((cmdlist->data[index] & ~0x7fffffff) >> 31) { 1060 buf_info->types[reg_type] = BUF_TYPE_USERPTR; 1061 cmdlist->data[index] &= ~G2D_BUF_USERPTR; 1062 } else 1063 buf_info->types[reg_type] = BUF_TYPE_GEM; 1064 break; 1065 case G2D_SRC_STRIDE: 1066 case G2D_DST_STRIDE: 1067 if (for_addr) 1068 goto err; 1069 1070 reg_type = g2d_get_reg_type(g2d, reg_offset); 1071 1072 buf_desc = &buf_info->descs[reg_type]; 1073 buf_desc->stride = cmdlist->data[index + 1]; 1074 break; 1075 case G2D_SRC_COLOR_MODE: 1076 case G2D_DST_COLOR_MODE: 1077 if (for_addr) 1078 goto err; 1079 1080 reg_type = g2d_get_reg_type(g2d, reg_offset); 1081 1082 buf_desc = &buf_info->descs[reg_type]; 1083 value = cmdlist->data[index + 1]; 1084 1085 buf_desc->format = value & 0xf; 1086 break; 1087 case G2D_SRC_LEFT_TOP: 1088 case G2D_DST_LEFT_TOP: 1089 if (for_addr) 1090 goto err; 1091 1092 reg_type = g2d_get_reg_type(g2d, reg_offset); 1093 1094 buf_desc = &buf_info->descs[reg_type]; 1095 value = cmdlist->data[index + 1]; 1096 1097 buf_desc->left_x = value & 0x1fff; 1098 buf_desc->top_y = (value & 0x1fff0000) >> 16; 1099 break; 1100 case G2D_SRC_RIGHT_BOTTOM: 1101 case G2D_DST_RIGHT_BOTTOM: 1102 if (for_addr) 1103 goto err; 1104 1105 reg_type = g2d_get_reg_type(g2d, reg_offset); 1106 1107 buf_desc = &buf_info->descs[reg_type]; 1108 value = cmdlist->data[index + 1]; 1109 1110 buf_desc->right_x = value & 0x1fff; 1111 buf_desc->bottom_y = (value & 0x1fff0000) >> 16; 1112 break; 1113 default: 1114 if (for_addr) 1115 goto err; 1116 break; 1117 } 1118 } 1119 1120 return 0; 1121 1122err: 1123 dev_err(g2d->dev, "Bad register offset: 0x%lx\n", cmdlist->data[index]); 1124 return -EINVAL; 1125} 1126 1127/* ioctl functions */ 1128int exynos_g2d_get_ver_ioctl(struct drm_device *drm_dev, void *data, 1129 struct drm_file *file) 1130{ 1131 struct drm_exynos_g2d_get_ver *ver = data; 1132 1133 ver->major = G2D_HW_MAJOR_VER; 1134 ver->minor = G2D_HW_MINOR_VER; 1135 1136 return 0; 1137} 1138 1139int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data, 1140 struct drm_file *file) 1141{ 1142 struct drm_exynos_file_private *file_priv = file->driver_priv; 1143 struct exynos_drm_private *priv = drm_dev->dev_private; 1144 struct g2d_data *g2d = dev_get_drvdata(priv->g2d_dev); 1145 struct drm_exynos_g2d_set_cmdlist *req = data; 1146 struct drm_exynos_g2d_cmd *cmd; 1147 struct drm_exynos_pending_g2d_event *e; 1148 struct g2d_cmdlist_node *node; 1149 struct g2d_cmdlist *cmdlist; 1150 int size; 1151 int ret; 1152 1153 node = g2d_get_cmdlist(g2d); 1154 if (!node) 1155 return -ENOMEM; 1156 1157 /* 1158 * To avoid an integer overflow for the later size computations, we 1159 * enforce a maximum number of submitted commands here. This limit is 1160 * sufficient for all conceivable usage cases of the G2D. 1161 */ 1162 if (req->cmd_nr > G2D_CMDLIST_DATA_NUM || 1163 req->cmd_buf_nr > G2D_CMDLIST_DATA_NUM) { 1164 dev_err(g2d->dev, "number of submitted G2D commands exceeds limit\n"); 1165 return -EINVAL; 1166 } 1167 1168 node->event = NULL; 1169 1170 if (req->event_type != G2D_EVENT_NOT) { 1171 e = kzalloc(sizeof(*node->event), GFP_KERNEL); 1172 if (!e) { 1173 ret = -ENOMEM; 1174 goto err; 1175 } 1176 1177 e->event.base.type = DRM_EXYNOS_G2D_EVENT; 1178 e->event.base.length = sizeof(e->event); 1179 e->event.user_data = req->user_data; 1180 1181 ret = drm_event_reserve_init(drm_dev, file, &e->base, &e->event.base); 1182 if (ret) { 1183 kfree(e); 1184 goto err; 1185 } 1186 1187 node->event = e; 1188 } 1189 1190 cmdlist = node->cmdlist; 1191 1192 cmdlist->last = 0; 1193 1194 /* 1195 * If don't clear SFR registers, the cmdlist is affected by register 1196 * values of previous cmdlist. G2D hw executes SFR clear command and 1197 * a next command at the same time then the next command is ignored and 1198 * is executed rightly from next next command, so needs a dummy command 1199 * to next command of SFR clear command. 1200 */ 1201 cmdlist->data[cmdlist->last++] = G2D_SOFT_RESET; 1202 cmdlist->data[cmdlist->last++] = G2D_SFRCLEAR; 1203 cmdlist->data[cmdlist->last++] = G2D_SRC_BASE_ADDR; 1204 cmdlist->data[cmdlist->last++] = 0; 1205 1206 /* 1207 * 'LIST_HOLD' command should be set to the DMA_HOLD_CMD_REG 1208 * and GCF bit should be set to INTEN register if user wants 1209 * G2D interrupt event once current command list execution is 1210 * finished. 1211 * Otherwise only ACF bit should be set to INTEN register so 1212 * that one interrupt is occurred after all command lists 1213 * have been completed. 1214 */ 1215 if (node->event) { 1216 cmdlist->data[cmdlist->last++] = G2D_INTEN; 1217 cmdlist->data[cmdlist->last++] = G2D_INTEN_ACF | G2D_INTEN_GCF; 1218 cmdlist->data[cmdlist->last++] = G2D_DMA_HOLD_CMD; 1219 cmdlist->data[cmdlist->last++] = G2D_LIST_HOLD; 1220 } else { 1221 cmdlist->data[cmdlist->last++] = G2D_INTEN; 1222 cmdlist->data[cmdlist->last++] = G2D_INTEN_ACF; 1223 } 1224 1225 /* 1226 * Check the size of cmdlist. The 2 that is added last comes from 1227 * the implicit G2D_BITBLT_START that is appended once we have 1228 * checked all the submitted commands. 1229 */ 1230 size = cmdlist->last + req->cmd_nr * 2 + req->cmd_buf_nr * 2 + 2; 1231 if (size > G2D_CMDLIST_DATA_NUM) { 1232 dev_err(g2d->dev, "cmdlist size is too big\n"); 1233 ret = -EINVAL; 1234 goto err_free_event; 1235 } 1236 1237 cmd = (struct drm_exynos_g2d_cmd *)(unsigned long)req->cmd; 1238 1239 if (copy_from_user(cmdlist->data + cmdlist->last, 1240 (void __user *)cmd, 1241 sizeof(*cmd) * req->cmd_nr)) { 1242 ret = -EFAULT; 1243 goto err_free_event; 1244 } 1245 cmdlist->last += req->cmd_nr * 2; 1246 1247 ret = g2d_check_reg_offset(g2d, node, req->cmd_nr, false); 1248 if (ret < 0) 1249 goto err_free_event; 1250 1251 node->buf_info.map_nr = req->cmd_buf_nr; 1252 if (req->cmd_buf_nr) { 1253 struct drm_exynos_g2d_cmd *cmd_buf; 1254 1255 cmd_buf = (struct drm_exynos_g2d_cmd *) 1256 (unsigned long)req->cmd_buf; 1257 1258 if (copy_from_user(cmdlist->data + cmdlist->last, 1259 (void __user *)cmd_buf, 1260 sizeof(*cmd_buf) * req->cmd_buf_nr)) { 1261 ret = -EFAULT; 1262 goto err_free_event; 1263 } 1264 cmdlist->last += req->cmd_buf_nr * 2; 1265 1266 ret = g2d_check_reg_offset(g2d, node, req->cmd_buf_nr, true); 1267 if (ret < 0) 1268 goto err_free_event; 1269 1270 ret = g2d_map_cmdlist_gem(g2d, node, drm_dev, file); 1271 if (ret < 0) 1272 goto err_unmap; 1273 } 1274 1275 cmdlist->data[cmdlist->last++] = G2D_BITBLT_START; 1276 cmdlist->data[cmdlist->last++] = G2D_START_BITBLT; 1277 1278 /* head */ 1279 cmdlist->head = cmdlist->last / 2; 1280 1281 /* tail */ 1282 cmdlist->data[cmdlist->last] = 0; 1283 1284 g2d_add_cmdlist_to_inuse(file_priv, node); 1285 1286 return 0; 1287 1288err_unmap: 1289 g2d_unmap_cmdlist_gem(g2d, node, file); 1290err_free_event: 1291 if (node->event) 1292 drm_event_cancel_free(drm_dev, &node->event->base); 1293err: 1294 g2d_put_cmdlist(g2d, node); 1295 return ret; 1296} 1297 1298int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data, 1299 struct drm_file *file) 1300{ 1301 struct drm_exynos_file_private *file_priv = file->driver_priv; 1302 struct exynos_drm_private *priv = drm_dev->dev_private; 1303 struct g2d_data *g2d = dev_get_drvdata(priv->g2d_dev); 1304 struct drm_exynos_g2d_exec *req = data; 1305 struct g2d_runqueue_node *runqueue_node; 1306 struct list_head *run_cmdlist; 1307 struct list_head *event_list; 1308 1309 runqueue_node = kmem_cache_alloc(g2d->runqueue_slab, GFP_KERNEL); 1310 if (!runqueue_node) 1311 return -ENOMEM; 1312 1313 run_cmdlist = &runqueue_node->run_cmdlist; 1314 event_list = &runqueue_node->event_list; 1315 INIT_LIST_HEAD(run_cmdlist); 1316 INIT_LIST_HEAD(event_list); 1317 init_completion(&runqueue_node->complete); 1318 runqueue_node->async = req->async; 1319 1320 list_splice_init(&file_priv->inuse_cmdlist, run_cmdlist); 1321 list_splice_init(&file_priv->event_list, event_list); 1322 1323 if (list_empty(run_cmdlist)) { 1324 dev_err(g2d->dev, "there is no inuse cmdlist\n"); 1325 kmem_cache_free(g2d->runqueue_slab, runqueue_node); 1326 return -EPERM; 1327 } 1328 1329 mutex_lock(&g2d->runqueue_mutex); 1330 runqueue_node->pid = current->pid; 1331 runqueue_node->filp = file; 1332 list_add_tail(&runqueue_node->list, &g2d->runqueue); 1333 mutex_unlock(&g2d->runqueue_mutex); 1334 1335 /* Let the runqueue know that there is work to do. */ 1336 queue_work(g2d->g2d_workq, &g2d->runqueue_work); 1337 1338 if (runqueue_node->async) 1339 goto out; 1340 1341 wait_for_completion(&runqueue_node->complete); 1342 g2d_free_runqueue_node(g2d, runqueue_node); 1343 1344out: 1345 return 0; 1346} 1347 1348int g2d_open(struct drm_device *drm_dev, struct drm_file *file) 1349{ 1350 struct drm_exynos_file_private *file_priv = file->driver_priv; 1351 1352 INIT_LIST_HEAD(&file_priv->inuse_cmdlist); 1353 INIT_LIST_HEAD(&file_priv->event_list); 1354 INIT_LIST_HEAD(&file_priv->userptr_list); 1355 1356 return 0; 1357} 1358 1359void g2d_close(struct drm_device *drm_dev, struct drm_file *file) 1360{ 1361 struct drm_exynos_file_private *file_priv = file->driver_priv; 1362 struct exynos_drm_private *priv = drm_dev->dev_private; 1363 struct g2d_data *g2d; 1364 struct g2d_cmdlist_node *node, *n; 1365 1366 if (!priv->g2d_dev) 1367 return; 1368 1369 g2d = dev_get_drvdata(priv->g2d_dev); 1370 1371 /* Remove the runqueue nodes that belong to us. */ 1372 mutex_lock(&g2d->runqueue_mutex); 1373 g2d_remove_runqueue_nodes(g2d, file); 1374 mutex_unlock(&g2d->runqueue_mutex); 1375 1376 /* 1377 * Wait for the runqueue worker to finish its current node. 1378 * After this the engine should no longer be accessing any 1379 * memory belonging to us. 1380 */ 1381 g2d_wait_finish(g2d, file); 1382 1383 /* 1384 * Even after the engine is idle, there might still be stale cmdlists 1385 * (i.e. cmdlisst which we submitted but never executed) around, with 1386 * their corresponding GEM/userptr buffers. 1387 * Properly unmap these buffers here. 1388 */ 1389 mutex_lock(&g2d->cmdlist_mutex); 1390 list_for_each_entry_safe(node, n, &file_priv->inuse_cmdlist, list) { 1391 g2d_unmap_cmdlist_gem(g2d, node, file); 1392 list_move_tail(&node->list, &g2d->free_cmdlist); 1393 } 1394 mutex_unlock(&g2d->cmdlist_mutex); 1395 1396 /* release all g2d_userptr in pool. */ 1397 g2d_userptr_free_all(g2d, file); 1398} 1399 1400static int g2d_bind(struct device *dev, struct device *master, void *data) 1401{ 1402 struct g2d_data *g2d = dev_get_drvdata(dev); 1403 struct drm_device *drm_dev = data; 1404 struct exynos_drm_private *priv = drm_dev->dev_private; 1405 int ret; 1406 1407 g2d->drm_dev = drm_dev; 1408 1409 /* allocate dma-aware cmdlist buffer. */ 1410 ret = g2d_init_cmdlist(g2d); 1411 if (ret < 0) { 1412 dev_err(dev, "cmdlist init failed\n"); 1413 return ret; 1414 } 1415 1416 ret = exynos_drm_register_dma(drm_dev, dev, &g2d->dma_priv); 1417 if (ret < 0) { 1418 dev_err(dev, "failed to enable iommu.\n"); 1419 g2d_fini_cmdlist(g2d); 1420 return ret; 1421 } 1422 priv->g2d_dev = dev; 1423 1424 dev_info(dev, "The Exynos G2D (ver %d.%d) successfully registered.\n", 1425 G2D_HW_MAJOR_VER, G2D_HW_MINOR_VER); 1426 return 0; 1427} 1428 1429static void g2d_unbind(struct device *dev, struct device *master, void *data) 1430{ 1431 struct g2d_data *g2d = dev_get_drvdata(dev); 1432 struct drm_device *drm_dev = data; 1433 struct exynos_drm_private *priv = drm_dev->dev_private; 1434 1435 /* Suspend operation and wait for engine idle. */ 1436 set_bit(G2D_BIT_SUSPEND_RUNQUEUE, &g2d->flags); 1437 g2d_wait_finish(g2d, NULL); 1438 priv->g2d_dev = NULL; 1439 1440 cancel_work_sync(&g2d->runqueue_work); 1441 exynos_drm_unregister_dma(g2d->drm_dev, dev, &g2d->dma_priv); 1442} 1443 1444static const struct component_ops g2d_component_ops = { 1445 .bind = g2d_bind, 1446 .unbind = g2d_unbind, 1447}; 1448 1449static int g2d_probe(struct platform_device *pdev) 1450{ 1451 struct device *dev = &pdev->dev; 1452 struct g2d_data *g2d; 1453 int ret; 1454 1455 g2d = devm_kzalloc(dev, sizeof(*g2d), GFP_KERNEL); 1456 if (!g2d) 1457 return -ENOMEM; 1458 1459 g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab", 1460 sizeof(struct g2d_runqueue_node), 0, 0, NULL); 1461 if (!g2d->runqueue_slab) 1462 return -ENOMEM; 1463 1464 g2d->dev = dev; 1465 1466 g2d->g2d_workq = create_singlethread_workqueue("g2d"); 1467 if (!g2d->g2d_workq) { 1468 dev_err(dev, "failed to create workqueue\n"); 1469 ret = -EINVAL; 1470 goto err_destroy_slab; 1471 } 1472 1473 INIT_WORK(&g2d->runqueue_work, g2d_runqueue_worker); 1474 INIT_LIST_HEAD(&g2d->free_cmdlist); 1475 INIT_LIST_HEAD(&g2d->runqueue); 1476 1477 mutex_init(&g2d->cmdlist_mutex); 1478 mutex_init(&g2d->runqueue_mutex); 1479 1480 g2d->gate_clk = devm_clk_get(dev, "fimg2d"); 1481 if (IS_ERR(g2d->gate_clk)) { 1482 dev_err(dev, "failed to get gate clock\n"); 1483 ret = PTR_ERR(g2d->gate_clk); 1484 goto err_destroy_workqueue; 1485 } 1486 1487 pm_runtime_use_autosuspend(dev); 1488 pm_runtime_set_autosuspend_delay(dev, 2000); 1489 pm_runtime_enable(dev); 1490 clear_bit(G2D_BIT_SUSPEND_RUNQUEUE, &g2d->flags); 1491 clear_bit(G2D_BIT_ENGINE_BUSY, &g2d->flags); 1492 1493 g2d->regs = devm_platform_ioremap_resource(pdev, 0); 1494 if (IS_ERR(g2d->regs)) { 1495 ret = PTR_ERR(g2d->regs); 1496 goto err_put_clk; 1497 } 1498 1499 g2d->irq = platform_get_irq(pdev, 0); 1500 if (g2d->irq < 0) { 1501 ret = g2d->irq; 1502 goto err_put_clk; 1503 } 1504 1505 ret = devm_request_irq(dev, g2d->irq, g2d_irq_handler, 0, 1506 "drm_g2d", g2d); 1507 if (ret < 0) { 1508 dev_err(dev, "irq request failed\n"); 1509 goto err_put_clk; 1510 } 1511 1512 g2d->max_pool = MAX_POOL; 1513 1514 platform_set_drvdata(pdev, g2d); 1515 1516 ret = component_add(dev, &g2d_component_ops); 1517 if (ret < 0) { 1518 dev_err(dev, "failed to register drm g2d device\n"); 1519 goto err_put_clk; 1520 } 1521 1522 return 0; 1523 1524err_put_clk: 1525 pm_runtime_disable(dev); 1526err_destroy_workqueue: 1527 destroy_workqueue(g2d->g2d_workq); 1528err_destroy_slab: 1529 kmem_cache_destroy(g2d->runqueue_slab); 1530 return ret; 1531} 1532 1533static int g2d_remove(struct platform_device *pdev) 1534{ 1535 struct g2d_data *g2d = platform_get_drvdata(pdev); 1536 1537 component_del(&pdev->dev, &g2d_component_ops); 1538 1539 /* There should be no locking needed here. */ 1540 g2d_remove_runqueue_nodes(g2d, NULL); 1541 1542 pm_runtime_dont_use_autosuspend(&pdev->dev); 1543 pm_runtime_disable(&pdev->dev); 1544 1545 g2d_fini_cmdlist(g2d); 1546 destroy_workqueue(g2d->g2d_workq); 1547 kmem_cache_destroy(g2d->runqueue_slab); 1548 1549 return 0; 1550} 1551 1552#ifdef CONFIG_PM_SLEEP 1553static int g2d_suspend(struct device *dev) 1554{ 1555 struct g2d_data *g2d = dev_get_drvdata(dev); 1556 1557 /* 1558 * Suspend the runqueue worker operation and wait until the G2D 1559 * engine is idle. 1560 */ 1561 set_bit(G2D_BIT_SUSPEND_RUNQUEUE, &g2d->flags); 1562 g2d_wait_finish(g2d, NULL); 1563 flush_work(&g2d->runqueue_work); 1564 1565 return 0; 1566} 1567 1568static int g2d_resume(struct device *dev) 1569{ 1570 struct g2d_data *g2d = dev_get_drvdata(dev); 1571 1572 clear_bit(G2D_BIT_SUSPEND_RUNQUEUE, &g2d->flags); 1573 queue_work(g2d->g2d_workq, &g2d->runqueue_work); 1574 1575 return 0; 1576} 1577#endif 1578 1579#ifdef CONFIG_PM 1580static int g2d_runtime_suspend(struct device *dev) 1581{ 1582 struct g2d_data *g2d = dev_get_drvdata(dev); 1583 1584 clk_disable_unprepare(g2d->gate_clk); 1585 1586 return 0; 1587} 1588 1589static int g2d_runtime_resume(struct device *dev) 1590{ 1591 struct g2d_data *g2d = dev_get_drvdata(dev); 1592 int ret; 1593 1594 ret = clk_prepare_enable(g2d->gate_clk); 1595 if (ret < 0) 1596 dev_warn(dev, "failed to enable clock.\n"); 1597 1598 return ret; 1599} 1600#endif 1601 1602static const struct dev_pm_ops g2d_pm_ops = { 1603 SET_SYSTEM_SLEEP_PM_OPS(g2d_suspend, g2d_resume) 1604 SET_RUNTIME_PM_OPS(g2d_runtime_suspend, g2d_runtime_resume, NULL) 1605}; 1606 1607static const struct of_device_id exynos_g2d_match[] = { 1608 { .compatible = "samsung,exynos5250-g2d" }, 1609 { .compatible = "samsung,exynos4212-g2d" }, 1610 {}, 1611}; 1612MODULE_DEVICE_TABLE(of, exynos_g2d_match); 1613 1614struct platform_driver g2d_driver = { 1615 .probe = g2d_probe, 1616 .remove = g2d_remove, 1617 .driver = { 1618 .name = "exynos-drm-g2d", 1619 .owner = THIS_MODULE, 1620 .pm = &g2d_pm_ops, 1621 .of_match_table = exynos_g2d_match, 1622 }, 1623};