1 /* 2 * drivers/gpu/drm/omapdrm/omap_gem.c 3 * 4 * Copyright (C) 2011 Texas Instruments 5 * Author: Rob Clark <rob.clark@linaro.org> 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License version 2 as published by 9 * the Free Software Foundation. 10 * 11 * This program is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14 * more details. 15 * 16 * You should have received a copy of the GNU General Public License along with 17 * this program. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #include <linux/seq_file.h> 21 #include <linux/shmem_fs.h> 22 #include <linux/spinlock.h> 23 #include <linux/pfn_t.h> 24 25 #include <drm/drm_vma_manager.h> 26 27 #include "omap_drv.h" 28 #include "omap_dmm_tiler.h" 29 30 /* 31 * GEM buffer object implementation. 32 */ 33 34 /* note: we use upper 8 bits of flags for driver-internal flags: */ 35 #define OMAP_BO_MEM_DMA_API 0x01000000 /* memory allocated with the dma_alloc_* API */ 36 #define OMAP_BO_MEM_SHMEM 0x02000000 /* memory allocated through shmem backing */ 37 #define OMAP_BO_MEM_DMABUF 0x08000000 /* memory imported from a dmabuf */ 38 39 struct omap_gem_object { 40 struct drm_gem_object base; 41 42 struct list_head mm_list; 43 44 uint32_t flags; 45 46 /** width/height for tiled formats (rounded up to slot boundaries) */ 47 uint16_t width, height; 48 49 /** roll applied when mapping to DMM */ 50 uint32_t roll; 51 52 /** 53 * paddr contains the buffer DMA address. It is valid for 54 * 55 * - buffers allocated through the DMA mapping API (with the 56 * OMAP_BO_MEM_DMA_API flag set) 57 * 58 * - buffers imported from dmabuf (with the OMAP_BO_MEM_DMABUF flag set) 59 * if they are physically contiguous (when sgt->orig_nents == 1) 60 * 61 * - buffers mapped through the TILER when paddr_cnt is not zero, in 62 * which case the DMA address points to the TILER aperture 63 * 64 * Physically contiguous buffers have their DMA address equal to the 65 * physical address as we don't remap those buffers through the TILER. 66 * 67 * Buffers mapped to the TILER have their DMA address pointing to the 68 * TILER aperture. As TILER mappings are refcounted (through paddr_cnt) 69 * the DMA address must be accessed through omap_get_get_paddr() to 70 * ensure that the mapping won't disappear unexpectedly. References must 71 * be released with omap_gem_put_paddr(). 72 */ 73 dma_addr_t paddr; 74 75 /** 76 * # of users of paddr 77 */ 78 uint32_t paddr_cnt; 79 80 /** 81 * If the buffer has been imported from a dmabuf the OMAP_DB_DMABUF flag 82 * is set and the sgt field is valid. 83 */ 84 struct sg_table *sgt; 85 86 /** 87 * tiler block used when buffer is remapped in DMM/TILER. 88 */ 89 struct tiler_block *block; 90 91 /** 92 * Array of backing pages, if allocated. Note that pages are never 93 * allocated for buffers originally allocated from contiguous memory 94 */ 95 struct page **pages; 96 97 /** addresses corresponding to pages in above array */ 98 dma_addr_t *addrs; 99 100 /** 101 * Virtual address, if mapped. 102 */ 103 void *vaddr; 104 105 /** 106 * sync-object allocated on demand (if needed) 107 * 108 * Per-buffer sync-object for tracking pending and completed hw/dma 109 * read and write operations. 110 */ 111 struct { 112 uint32_t write_pending; 113 uint32_t write_complete; 114 uint32_t read_pending; 115 uint32_t read_complete; 116 } *sync; 117 }; 118 119 #define to_omap_bo(x) container_of(x, struct omap_gem_object, base) 120 121 /* To deal with userspace mmap'ings of 2d tiled buffers, which (a) are 122 * not necessarily pinned in TILER all the time, and (b) when they are 123 * they are not necessarily page aligned, we reserve one or more small 124 * regions in each of the 2d containers to use as a user-GART where we 125 * can create a second page-aligned mapping of parts of the buffer 126 * being accessed from userspace. 127 * 128 * Note that we could optimize slightly when we know that multiple 129 * tiler containers are backed by the same PAT.. but I'll leave that 130 * for later.. 131 */ 132 #define NUM_USERGART_ENTRIES 2 133 struct omap_drm_usergart_entry { 134 struct tiler_block *block; /* the reserved tiler block */ 135 dma_addr_t paddr; 136 struct drm_gem_object *obj; /* the current pinned obj */ 137 pgoff_t obj_pgoff; /* page offset of obj currently 138 mapped in */ 139 }; 140 141 struct omap_drm_usergart { 142 struct omap_drm_usergart_entry entry[NUM_USERGART_ENTRIES]; 143 int height; /* height in rows */ 144 int height_shift; /* ilog2(height in rows) */ 145 int slot_shift; /* ilog2(width per slot) */ 146 int stride_pfn; /* stride in pages */ 147 int last; /* index of last used entry */ 148 }; 149 150 /* ----------------------------------------------------------------------------- 151 * Helpers 152 */ 153 154 /** get mmap offset */ 155 static uint64_t mmap_offset(struct drm_gem_object *obj) 156 { 157 struct drm_device *dev = obj->dev; 158 int ret; 159 size_t size; 160 161 WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 162 163 /* Make it mmapable */ 164 size = omap_gem_mmap_size(obj); 165 ret = drm_gem_create_mmap_offset_size(obj, size); 166 if (ret) { 167 dev_err(dev->dev, "could not allocate mmap offset\n"); 168 return 0; 169 } 170 171 return drm_vma_node_offset_addr(&obj->vma_node); 172 } 173 174 static bool is_contiguous(struct omap_gem_object *omap_obj) 175 { 176 if (omap_obj->flags & OMAP_BO_MEM_DMA_API) 177 return true; 178 179 if ((omap_obj->flags & OMAP_BO_MEM_DMABUF) && omap_obj->sgt->nents == 1) 180 return true; 181 182 return false; 183 } 184 185 /* ----------------------------------------------------------------------------- 186 * Eviction 187 */ 188 189 static void evict_entry(struct drm_gem_object *obj, 190 enum tiler_fmt fmt, struct omap_drm_usergart_entry *entry) 191 { 192 struct omap_gem_object *omap_obj = to_omap_bo(obj); 193 struct omap_drm_private *priv = obj->dev->dev_private; 194 int n = priv->usergart[fmt].height; 195 size_t size = PAGE_SIZE * n; 196 loff_t off = mmap_offset(obj) + 197 (entry->obj_pgoff << PAGE_SHIFT); 198 const int m = 1 + ((omap_obj->width << fmt) / PAGE_SIZE); 199 200 if (m > 1) { 201 int i; 202 /* if stride > than PAGE_SIZE then sparse mapping: */ 203 for (i = n; i > 0; i--) { 204 unmap_mapping_range(obj->dev->anon_inode->i_mapping, 205 off, PAGE_SIZE, 1); 206 off += PAGE_SIZE * m; 207 } 208 } else { 209 unmap_mapping_range(obj->dev->anon_inode->i_mapping, 210 off, size, 1); 211 } 212 213 entry->obj = NULL; 214 } 215 216 /* Evict a buffer from usergart, if it is mapped there */ 217 static void evict(struct drm_gem_object *obj) 218 { 219 struct omap_gem_object *omap_obj = to_omap_bo(obj); 220 struct omap_drm_private *priv = obj->dev->dev_private; 221 222 if (omap_obj->flags & OMAP_BO_TILED) { 223 enum tiler_fmt fmt = gem2fmt(omap_obj->flags); 224 int i; 225 226 for (i = 0; i < NUM_USERGART_ENTRIES; i++) { 227 struct omap_drm_usergart_entry *entry = 228 &priv->usergart[fmt].entry[i]; 229 230 if (entry->obj == obj) 231 evict_entry(obj, fmt, entry); 232 } 233 } 234 } 235 236 /* ----------------------------------------------------------------------------- 237 * Page Management 238 */ 239 240 /** ensure backing pages are allocated */ 241 static int omap_gem_attach_pages(struct drm_gem_object *obj) 242 { 243 struct drm_device *dev = obj->dev; 244 struct omap_gem_object *omap_obj = to_omap_bo(obj); 245 struct page **pages; 246 int npages = obj->size >> PAGE_SHIFT; 247 int i, ret; 248 dma_addr_t *addrs; 249 250 WARN_ON(omap_obj->pages); 251 252 pages = drm_gem_get_pages(obj); 253 if (IS_ERR(pages)) { 254 dev_err(obj->dev->dev, "could not get pages: %ld\n", PTR_ERR(pages)); 255 return PTR_ERR(pages); 256 } 257 258 /* for non-cached buffers, ensure the new pages are clean because 259 * DSS, GPU, etc. are not cache coherent: 260 */ 261 if (omap_obj->flags & (OMAP_BO_WC|OMAP_BO_UNCACHED)) { 262 addrs = kmalloc(npages * sizeof(*addrs), GFP_KERNEL); 263 if (!addrs) { 264 ret = -ENOMEM; 265 goto free_pages; 266 } 267 268 for (i = 0; i < npages; i++) { 269 addrs[i] = dma_map_page(dev->dev, pages[i], 270 0, PAGE_SIZE, DMA_BIDIRECTIONAL); 271 272 if (dma_mapping_error(dev->dev, addrs[i])) { 273 dev_warn(dev->dev, 274 "%s: failed to map page\n", __func__); 275 276 for (i = i - 1; i >= 0; --i) { 277 dma_unmap_page(dev->dev, addrs[i], 278 PAGE_SIZE, DMA_BIDIRECTIONAL); 279 } 280 281 ret = -ENOMEM; 282 goto free_addrs; 283 } 284 } 285 } else { 286 addrs = kzalloc(npages * sizeof(*addrs), GFP_KERNEL); 287 if (!addrs) { 288 ret = -ENOMEM; 289 goto free_pages; 290 } 291 } 292 293 omap_obj->addrs = addrs; 294 omap_obj->pages = pages; 295 296 return 0; 297 298 free_addrs: 299 kfree(addrs); 300 free_pages: 301 drm_gem_put_pages(obj, pages, true, false); 302 303 return ret; 304 } 305 306 /* acquire pages when needed (for example, for DMA where physically 307 * contiguous buffer is not required 308 */ 309 static int get_pages(struct drm_gem_object *obj, struct page ***pages) 310 { 311 struct omap_gem_object *omap_obj = to_omap_bo(obj); 312 int ret = 0; 313 314 if ((omap_obj->flags & OMAP_BO_MEM_SHMEM) && !omap_obj->pages) { 315 ret = omap_gem_attach_pages(obj); 316 if (ret) { 317 dev_err(obj->dev->dev, "could not attach pages\n"); 318 return ret; 319 } 320 } 321 322 /* TODO: even phys-contig.. we should have a list of pages? */ 323 *pages = omap_obj->pages; 324 325 return 0; 326 } 327 328 /** release backing pages */ 329 static void omap_gem_detach_pages(struct drm_gem_object *obj) 330 { 331 struct omap_gem_object *omap_obj = to_omap_bo(obj); 332 333 /* for non-cached buffers, ensure the new pages are clean because 334 * DSS, GPU, etc. are not cache coherent: 335 */ 336 if (omap_obj->flags & (OMAP_BO_WC|OMAP_BO_UNCACHED)) { 337 int i, npages = obj->size >> PAGE_SHIFT; 338 for (i = 0; i < npages; i++) { 339 if (omap_obj->addrs[i]) 340 dma_unmap_page(obj->dev->dev, 341 omap_obj->addrs[i], 342 PAGE_SIZE, DMA_BIDIRECTIONAL); 343 } 344 } 345 346 kfree(omap_obj->addrs); 347 omap_obj->addrs = NULL; 348 349 drm_gem_put_pages(obj, omap_obj->pages, true, false); 350 omap_obj->pages = NULL; 351 } 352 353 /* get buffer flags */ 354 uint32_t omap_gem_flags(struct drm_gem_object *obj) 355 { 356 return to_omap_bo(obj)->flags; 357 } 358 359 uint64_t omap_gem_mmap_offset(struct drm_gem_object *obj) 360 { 361 uint64_t offset; 362 mutex_lock(&obj->dev->struct_mutex); 363 offset = mmap_offset(obj); 364 mutex_unlock(&obj->dev->struct_mutex); 365 return offset; 366 } 367 368 /** get mmap size */ 369 size_t omap_gem_mmap_size(struct drm_gem_object *obj) 370 { 371 struct omap_gem_object *omap_obj = to_omap_bo(obj); 372 size_t size = obj->size; 373 374 if (omap_obj->flags & OMAP_BO_TILED) { 375 /* for tiled buffers, the virtual size has stride rounded up 376 * to 4kb.. (to hide the fact that row n+1 might start 16kb or 377 * 32kb later!). But we don't back the entire buffer with 378 * pages, only the valid picture part.. so need to adjust for 379 * this in the size used to mmap and generate mmap offset 380 */ 381 size = tiler_vsize(gem2fmt(omap_obj->flags), 382 omap_obj->width, omap_obj->height); 383 } 384 385 return size; 386 } 387 388 /* ----------------------------------------------------------------------------- 389 * Fault Handling 390 */ 391 392 /* Normal handling for the case of faulting in non-tiled buffers */ 393 static int fault_1d(struct drm_gem_object *obj, 394 struct vm_area_struct *vma, struct vm_fault *vmf) 395 { 396 struct omap_gem_object *omap_obj = to_omap_bo(obj); 397 unsigned long pfn; 398 pgoff_t pgoff; 399 400 /* We don't use vmf->pgoff since that has the fake offset: */ 401 pgoff = ((unsigned long)vmf->virtual_address - 402 vma->vm_start) >> PAGE_SHIFT; 403 404 if (omap_obj->pages) { 405 omap_gem_cpu_sync(obj, pgoff); 406 pfn = page_to_pfn(omap_obj->pages[pgoff]); 407 } else { 408 BUG_ON(!is_contiguous(omap_obj)); 409 pfn = (omap_obj->paddr >> PAGE_SHIFT) + pgoff; 410 } 411 412 VERB("Inserting %p pfn %lx, pa %lx", vmf->virtual_address, 413 pfn, pfn << PAGE_SHIFT); 414 415 return vm_insert_mixed(vma, (unsigned long)vmf->virtual_address, 416 __pfn_to_pfn_t(pfn, PFN_DEV)); 417 } 418 419 /* Special handling for the case of faulting in 2d tiled buffers */ 420 static int fault_2d(struct drm_gem_object *obj, 421 struct vm_area_struct *vma, struct vm_fault *vmf) 422 { 423 struct omap_gem_object *omap_obj = to_omap_bo(obj); 424 struct omap_drm_private *priv = obj->dev->dev_private; 425 struct omap_drm_usergart_entry *entry; 426 enum tiler_fmt fmt = gem2fmt(omap_obj->flags); 427 struct page *pages[64]; /* XXX is this too much to have on stack? */ 428 unsigned long pfn; 429 pgoff_t pgoff, base_pgoff; 430 void __user *vaddr; 431 int i, ret, slots; 432 433 /* 434 * Note the height of the slot is also equal to the number of pages 435 * that need to be mapped in to fill 4kb wide CPU page. If the slot 436 * height is 64, then 64 pages fill a 4kb wide by 64 row region. 437 */ 438 const int n = priv->usergart[fmt].height; 439 const int n_shift = priv->usergart[fmt].height_shift; 440 441 /* 442 * If buffer width in bytes > PAGE_SIZE then the virtual stride is 443 * rounded up to next multiple of PAGE_SIZE.. this need to be taken 444 * into account in some of the math, so figure out virtual stride 445 * in pages 446 */ 447 const int m = 1 + ((omap_obj->width << fmt) / PAGE_SIZE); 448 449 /* We don't use vmf->pgoff since that has the fake offset: */ 450 pgoff = ((unsigned long)vmf->virtual_address - 451 vma->vm_start) >> PAGE_SHIFT; 452 453 /* 454 * Actual address we start mapping at is rounded down to previous slot 455 * boundary in the y direction: 456 */ 457 base_pgoff = round_down(pgoff, m << n_shift); 458 459 /* figure out buffer width in slots */ 460 slots = omap_obj->width >> priv->usergart[fmt].slot_shift; 461 462 vaddr = vmf->virtual_address - ((pgoff - base_pgoff) << PAGE_SHIFT); 463 464 entry = &priv->usergart[fmt].entry[priv->usergart[fmt].last]; 465 466 /* evict previous buffer using this usergart entry, if any: */ 467 if (entry->obj) 468 evict_entry(entry->obj, fmt, entry); 469 470 entry->obj = obj; 471 entry->obj_pgoff = base_pgoff; 472 473 /* now convert base_pgoff to phys offset from virt offset: */ 474 base_pgoff = (base_pgoff >> n_shift) * slots; 475 476 /* for wider-than 4k.. figure out which part of the slot-row we want: */ 477 if (m > 1) { 478 int off = pgoff % m; 479 entry->obj_pgoff += off; 480 base_pgoff /= m; 481 slots = min(slots - (off << n_shift), n); 482 base_pgoff += off << n_shift; 483 vaddr += off << PAGE_SHIFT; 484 } 485 486 /* 487 * Map in pages. Beyond the valid pixel part of the buffer, we set 488 * pages[i] to NULL to get a dummy page mapped in.. if someone 489 * reads/writes it they will get random/undefined content, but at 490 * least it won't be corrupting whatever other random page used to 491 * be mapped in, or other undefined behavior. 492 */ 493 memcpy(pages, &omap_obj->pages[base_pgoff], 494 sizeof(struct page *) * slots); 495 memset(pages + slots, 0, 496 sizeof(struct page *) * (n - slots)); 497 498 ret = tiler_pin(entry->block, pages, ARRAY_SIZE(pages), 0, true); 499 if (ret) { 500 dev_err(obj->dev->dev, "failed to pin: %d\n", ret); 501 return ret; 502 } 503 504 pfn = entry->paddr >> PAGE_SHIFT; 505 506 VERB("Inserting %p pfn %lx, pa %lx", vmf->virtual_address, 507 pfn, pfn << PAGE_SHIFT); 508 509 for (i = n; i > 0; i--) { 510 vm_insert_mixed(vma, (unsigned long)vaddr, 511 __pfn_to_pfn_t(pfn, PFN_DEV)); 512 pfn += priv->usergart[fmt].stride_pfn; 513 vaddr += PAGE_SIZE * m; 514 } 515 516 /* simple round-robin: */ 517 priv->usergart[fmt].last = (priv->usergart[fmt].last + 1) 518 % NUM_USERGART_ENTRIES; 519 520 return 0; 521 } 522 523 /** 524 * omap_gem_fault - pagefault handler for GEM objects 525 * @vma: the VMA of the GEM object 526 * @vmf: fault detail 527 * 528 * Invoked when a fault occurs on an mmap of a GEM managed area. GEM 529 * does most of the work for us including the actual map/unmap calls 530 * but we need to do the actual page work. 531 * 532 * The VMA was set up by GEM. In doing so it also ensured that the 533 * vma->vm_private_data points to the GEM object that is backing this 534 * mapping. 535 */ 536 int omap_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 537 { 538 struct drm_gem_object *obj = vma->vm_private_data; 539 struct omap_gem_object *omap_obj = to_omap_bo(obj); 540 struct drm_device *dev = obj->dev; 541 struct page **pages; 542 int ret; 543 544 /* Make sure we don't parallel update on a fault, nor move or remove 545 * something from beneath our feet 546 */ 547 mutex_lock(&dev->struct_mutex); 548 549 /* if a shmem backed object, make sure we have pages attached now */ 550 ret = get_pages(obj, &pages); 551 if (ret) 552 goto fail; 553 554 /* where should we do corresponding put_pages().. we are mapping 555 * the original page, rather than thru a GART, so we can't rely 556 * on eviction to trigger this. But munmap() or all mappings should 557 * probably trigger put_pages()? 558 */ 559 560 if (omap_obj->flags & OMAP_BO_TILED) 561 ret = fault_2d(obj, vma, vmf); 562 else 563 ret = fault_1d(obj, vma, vmf); 564 565 566 fail: 567 mutex_unlock(&dev->struct_mutex); 568 switch (ret) { 569 case 0: 570 case -ERESTARTSYS: 571 case -EINTR: 572 case -EBUSY: 573 /* 574 * EBUSY is ok: this just means that another thread 575 * already did the job. 576 */ 577 return VM_FAULT_NOPAGE; 578 case -ENOMEM: 579 return VM_FAULT_OOM; 580 default: 581 return VM_FAULT_SIGBUS; 582 } 583 } 584 585 /** We override mainly to fix up some of the vm mapping flags.. */ 586 int omap_gem_mmap(struct file *filp, struct vm_area_struct *vma) 587 { 588 int ret; 589 590 ret = drm_gem_mmap(filp, vma); 591 if (ret) { 592 DBG("mmap failed: %d", ret); 593 return ret; 594 } 595 596 return omap_gem_mmap_obj(vma->vm_private_data, vma); 597 } 598 599 int omap_gem_mmap_obj(struct drm_gem_object *obj, 600 struct vm_area_struct *vma) 601 { 602 struct omap_gem_object *omap_obj = to_omap_bo(obj); 603 604 vma->vm_flags &= ~VM_PFNMAP; 605 vma->vm_flags |= VM_MIXEDMAP; 606 607 if (omap_obj->flags & OMAP_BO_WC) { 608 vma->vm_page_prot = pgprot_writecombine(vm_get_page_prot(vma->vm_flags)); 609 } else if (omap_obj->flags & OMAP_BO_UNCACHED) { 610 vma->vm_page_prot = pgprot_noncached(vm_get_page_prot(vma->vm_flags)); 611 } else { 612 /* 613 * We do have some private objects, at least for scanout buffers 614 * on hardware without DMM/TILER. But these are allocated write- 615 * combine 616 */ 617 if (WARN_ON(!obj->filp)) 618 return -EINVAL; 619 620 /* 621 * Shunt off cached objs to shmem file so they have their own 622 * address_space (so unmap_mapping_range does what we want, 623 * in particular in the case of mmap'd dmabufs) 624 */ 625 fput(vma->vm_file); 626 vma->vm_pgoff = 0; 627 vma->vm_file = get_file(obj->filp); 628 629 vma->vm_page_prot = vm_get_page_prot(vma->vm_flags); 630 } 631 632 return 0; 633 } 634 635 /* ----------------------------------------------------------------------------- 636 * Dumb Buffers 637 */ 638 639 /** 640 * omap_gem_dumb_create - create a dumb buffer 641 * @drm_file: our client file 642 * @dev: our device 643 * @args: the requested arguments copied from userspace 644 * 645 * Allocate a buffer suitable for use for a frame buffer of the 646 * form described by user space. Give userspace a handle by which 647 * to reference it. 648 */ 649 int omap_gem_dumb_create(struct drm_file *file, struct drm_device *dev, 650 struct drm_mode_create_dumb *args) 651 { 652 union omap_gem_size gsize; 653 654 args->pitch = DIV_ROUND_UP(args->width * args->bpp, 8); 655 656 args->size = PAGE_ALIGN(args->pitch * args->height); 657 658 gsize = (union omap_gem_size){ 659 .bytes = args->size, 660 }; 661 662 return omap_gem_new_handle(dev, file, gsize, 663 OMAP_BO_SCANOUT | OMAP_BO_WC, &args->handle); 664 } 665 666 /** 667 * omap_gem_dumb_map - buffer mapping for dumb interface 668 * @file: our drm client file 669 * @dev: drm device 670 * @handle: GEM handle to the object (from dumb_create) 671 * 672 * Do the necessary setup to allow the mapping of the frame buffer 673 * into user memory. We don't have to do much here at the moment. 674 */ 675 int omap_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, 676 uint32_t handle, uint64_t *offset) 677 { 678 struct drm_gem_object *obj; 679 int ret = 0; 680 681 /* GEM does all our handle to object mapping */ 682 obj = drm_gem_object_lookup(file, handle); 683 if (obj == NULL) { 684 ret = -ENOENT; 685 goto fail; 686 } 687 688 *offset = omap_gem_mmap_offset(obj); 689 690 drm_gem_object_unreference_unlocked(obj); 691 692 fail: 693 return ret; 694 } 695 696 #ifdef CONFIG_DRM_FBDEV_EMULATION 697 /* Set scrolling position. This allows us to implement fast scrolling 698 * for console. 699 * 700 * Call only from non-atomic contexts. 701 */ 702 int omap_gem_roll(struct drm_gem_object *obj, uint32_t roll) 703 { 704 struct omap_gem_object *omap_obj = to_omap_bo(obj); 705 uint32_t npages = obj->size >> PAGE_SHIFT; 706 int ret = 0; 707 708 if (roll > npages) { 709 dev_err(obj->dev->dev, "invalid roll: %d\n", roll); 710 return -EINVAL; 711 } 712 713 omap_obj->roll = roll; 714 715 mutex_lock(&obj->dev->struct_mutex); 716 717 /* if we aren't mapped yet, we don't need to do anything */ 718 if (omap_obj->block) { 719 struct page **pages; 720 ret = get_pages(obj, &pages); 721 if (ret) 722 goto fail; 723 ret = tiler_pin(omap_obj->block, pages, npages, roll, true); 724 if (ret) 725 dev_err(obj->dev->dev, "could not repin: %d\n", ret); 726 } 727 728 fail: 729 mutex_unlock(&obj->dev->struct_mutex); 730 731 return ret; 732 } 733 #endif 734 735 /* ----------------------------------------------------------------------------- 736 * Memory Management & DMA Sync 737 */ 738 739 /** 740 * shmem buffers that are mapped cached can simulate coherency via using 741 * page faulting to keep track of dirty pages 742 */ 743 static inline bool is_cached_coherent(struct drm_gem_object *obj) 744 { 745 struct omap_gem_object *omap_obj = to_omap_bo(obj); 746 747 return (omap_obj->flags & OMAP_BO_MEM_SHMEM) && 748 ((omap_obj->flags & OMAP_BO_CACHE_MASK) == OMAP_BO_CACHED); 749 } 750 751 /* Sync the buffer for CPU access.. note pages should already be 752 * attached, ie. omap_gem_get_pages() 753 */ 754 void omap_gem_cpu_sync(struct drm_gem_object *obj, int pgoff) 755 { 756 struct drm_device *dev = obj->dev; 757 struct omap_gem_object *omap_obj = to_omap_bo(obj); 758 759 if (is_cached_coherent(obj) && omap_obj->addrs[pgoff]) { 760 dma_unmap_page(dev->dev, omap_obj->addrs[pgoff], 761 PAGE_SIZE, DMA_BIDIRECTIONAL); 762 omap_obj->addrs[pgoff] = 0; 763 } 764 } 765 766 /* sync the buffer for DMA access */ 767 void omap_gem_dma_sync(struct drm_gem_object *obj, 768 enum dma_data_direction dir) 769 { 770 struct drm_device *dev = obj->dev; 771 struct omap_gem_object *omap_obj = to_omap_bo(obj); 772 773 if (is_cached_coherent(obj)) { 774 int i, npages = obj->size >> PAGE_SHIFT; 775 struct page **pages = omap_obj->pages; 776 bool dirty = false; 777 778 for (i = 0; i < npages; i++) { 779 if (!omap_obj->addrs[i]) { 780 dma_addr_t addr; 781 782 addr = dma_map_page(dev->dev, pages[i], 0, 783 PAGE_SIZE, DMA_BIDIRECTIONAL); 784 785 if (dma_mapping_error(dev->dev, addr)) { 786 dev_warn(dev->dev, 787 "%s: failed to map page\n", 788 __func__); 789 break; 790 } 791 792 dirty = true; 793 omap_obj->addrs[i] = addr; 794 } 795 } 796 797 if (dirty) { 798 unmap_mapping_range(obj->filp->f_mapping, 0, 799 omap_gem_mmap_size(obj), 1); 800 } 801 } 802 } 803 804 /* Get physical address for DMA.. if 'remap' is true, and the buffer is not 805 * already contiguous, remap it to pin in physically contiguous memory.. (ie. 806 * map in TILER) 807 */ 808 int omap_gem_get_paddr(struct drm_gem_object *obj, 809 dma_addr_t *paddr, bool remap) 810 { 811 struct omap_drm_private *priv = obj->dev->dev_private; 812 struct omap_gem_object *omap_obj = to_omap_bo(obj); 813 int ret = 0; 814 815 mutex_lock(&obj->dev->struct_mutex); 816 817 if (!is_contiguous(omap_obj) && remap && priv->has_dmm) { 818 if (omap_obj->paddr_cnt == 0) { 819 struct page **pages; 820 uint32_t npages = obj->size >> PAGE_SHIFT; 821 enum tiler_fmt fmt = gem2fmt(omap_obj->flags); 822 struct tiler_block *block; 823 824 BUG_ON(omap_obj->block); 825 826 ret = get_pages(obj, &pages); 827 if (ret) 828 goto fail; 829 830 if (omap_obj->flags & OMAP_BO_TILED) { 831 block = tiler_reserve_2d(fmt, 832 omap_obj->width, 833 omap_obj->height, 0); 834 } else { 835 block = tiler_reserve_1d(obj->size); 836 } 837 838 if (IS_ERR(block)) { 839 ret = PTR_ERR(block); 840 dev_err(obj->dev->dev, 841 "could not remap: %d (%d)\n", ret, fmt); 842 goto fail; 843 } 844 845 /* TODO: enable async refill.. */ 846 ret = tiler_pin(block, pages, npages, 847 omap_obj->roll, true); 848 if (ret) { 849 tiler_release(block); 850 dev_err(obj->dev->dev, 851 "could not pin: %d\n", ret); 852 goto fail; 853 } 854 855 omap_obj->paddr = tiler_ssptr(block); 856 omap_obj->block = block; 857 858 DBG("got paddr: %pad", &omap_obj->paddr); 859 } 860 861 omap_obj->paddr_cnt++; 862 863 *paddr = omap_obj->paddr; 864 } else if (is_contiguous(omap_obj)) { 865 *paddr = omap_obj->paddr; 866 } else { 867 ret = -EINVAL; 868 goto fail; 869 } 870 871 fail: 872 mutex_unlock(&obj->dev->struct_mutex); 873 874 return ret; 875 } 876 877 /* Release physical address, when DMA is no longer being performed.. this 878 * could potentially unpin and unmap buffers from TILER 879 */ 880 void omap_gem_put_paddr(struct drm_gem_object *obj) 881 { 882 struct omap_gem_object *omap_obj = to_omap_bo(obj); 883 int ret; 884 885 mutex_lock(&obj->dev->struct_mutex); 886 if (omap_obj->paddr_cnt > 0) { 887 omap_obj->paddr_cnt--; 888 if (omap_obj->paddr_cnt == 0) { 889 ret = tiler_unpin(omap_obj->block); 890 if (ret) { 891 dev_err(obj->dev->dev, 892 "could not unpin pages: %d\n", ret); 893 } 894 ret = tiler_release(omap_obj->block); 895 if (ret) { 896 dev_err(obj->dev->dev, 897 "could not release unmap: %d\n", ret); 898 } 899 omap_obj->paddr = 0; 900 omap_obj->block = NULL; 901 } 902 } 903 904 mutex_unlock(&obj->dev->struct_mutex); 905 } 906 907 /* Get rotated scanout address (only valid if already pinned), at the 908 * specified orientation and x,y offset from top-left corner of buffer 909 * (only valid for tiled 2d buffers) 910 */ 911 int omap_gem_rotated_paddr(struct drm_gem_object *obj, uint32_t orient, 912 int x, int y, dma_addr_t *paddr) 913 { 914 struct omap_gem_object *omap_obj = to_omap_bo(obj); 915 int ret = -EINVAL; 916 917 mutex_lock(&obj->dev->struct_mutex); 918 if ((omap_obj->paddr_cnt > 0) && omap_obj->block && 919 (omap_obj->flags & OMAP_BO_TILED)) { 920 *paddr = tiler_tsptr(omap_obj->block, orient, x, y); 921 ret = 0; 922 } 923 mutex_unlock(&obj->dev->struct_mutex); 924 return ret; 925 } 926 927 /* Get tiler stride for the buffer (only valid for 2d tiled buffers) */ 928 int omap_gem_tiled_stride(struct drm_gem_object *obj, uint32_t orient) 929 { 930 struct omap_gem_object *omap_obj = to_omap_bo(obj); 931 int ret = -EINVAL; 932 if (omap_obj->flags & OMAP_BO_TILED) 933 ret = tiler_stride(gem2fmt(omap_obj->flags), orient); 934 return ret; 935 } 936 937 /* if !remap, and we don't have pages backing, then fail, rather than 938 * increasing the pin count (which we don't really do yet anyways, 939 * because we don't support swapping pages back out). And 'remap' 940 * might not be quite the right name, but I wanted to keep it working 941 * similarly to omap_gem_get_paddr(). Note though that mutex is not 942 * aquired if !remap (because this can be called in atomic ctxt), 943 * but probably omap_gem_get_paddr() should be changed to work in the 944 * same way. If !remap, a matching omap_gem_put_pages() call is not 945 * required (and should not be made). 946 */ 947 int omap_gem_get_pages(struct drm_gem_object *obj, struct page ***pages, 948 bool remap) 949 { 950 int ret; 951 if (!remap) { 952 struct omap_gem_object *omap_obj = to_omap_bo(obj); 953 if (!omap_obj->pages) 954 return -ENOMEM; 955 *pages = omap_obj->pages; 956 return 0; 957 } 958 mutex_lock(&obj->dev->struct_mutex); 959 ret = get_pages(obj, pages); 960 mutex_unlock(&obj->dev->struct_mutex); 961 return ret; 962 } 963 964 /* release pages when DMA no longer being performed */ 965 int omap_gem_put_pages(struct drm_gem_object *obj) 966 { 967 /* do something here if we dynamically attach/detach pages.. at 968 * least they would no longer need to be pinned if everyone has 969 * released the pages.. 970 */ 971 return 0; 972 } 973 974 #ifdef CONFIG_DRM_FBDEV_EMULATION 975 /* Get kernel virtual address for CPU access.. this more or less only 976 * exists for omap_fbdev. This should be called with struct_mutex 977 * held. 978 */ 979 void *omap_gem_vaddr(struct drm_gem_object *obj) 980 { 981 struct omap_gem_object *omap_obj = to_omap_bo(obj); 982 WARN_ON(!mutex_is_locked(&obj->dev->struct_mutex)); 983 if (!omap_obj->vaddr) { 984 struct page **pages; 985 int ret = get_pages(obj, &pages); 986 if (ret) 987 return ERR_PTR(ret); 988 omap_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT, 989 VM_MAP, pgprot_writecombine(PAGE_KERNEL)); 990 } 991 return omap_obj->vaddr; 992 } 993 #endif 994 995 /* ----------------------------------------------------------------------------- 996 * Power Management 997 */ 998 999 #ifdef CONFIG_PM 1000 /* re-pin objects in DMM in resume path: */ 1001 int omap_gem_resume(struct device *dev) 1002 { 1003 struct drm_device *drm_dev = dev_get_drvdata(dev); 1004 struct omap_drm_private *priv = drm_dev->dev_private; 1005 struct omap_gem_object *omap_obj; 1006 int ret = 0; 1007 1008 list_for_each_entry(omap_obj, &priv->obj_list, mm_list) { 1009 if (omap_obj->block) { 1010 struct drm_gem_object *obj = &omap_obj->base; 1011 uint32_t npages = obj->size >> PAGE_SHIFT; 1012 WARN_ON(!omap_obj->pages); /* this can't happen */ 1013 ret = tiler_pin(omap_obj->block, 1014 omap_obj->pages, npages, 1015 omap_obj->roll, true); 1016 if (ret) { 1017 dev_err(dev, "could not repin: %d\n", ret); 1018 return ret; 1019 } 1020 } 1021 } 1022 1023 return 0; 1024 } 1025 #endif 1026 1027 /* ----------------------------------------------------------------------------- 1028 * DebugFS 1029 */ 1030 1031 #ifdef CONFIG_DEBUG_FS 1032 void omap_gem_describe(struct drm_gem_object *obj, struct seq_file *m) 1033 { 1034 struct omap_gem_object *omap_obj = to_omap_bo(obj); 1035 uint64_t off; 1036 1037 off = drm_vma_node_start(&obj->vma_node); 1038 1039 seq_printf(m, "%08x: %2d (%2d) %08llx %pad (%2d) %p %4d", 1040 omap_obj->flags, obj->name, obj->refcount.refcount.counter, 1041 off, &omap_obj->paddr, omap_obj->paddr_cnt, 1042 omap_obj->vaddr, omap_obj->roll); 1043 1044 if (omap_obj->flags & OMAP_BO_TILED) { 1045 seq_printf(m, " %dx%d", omap_obj->width, omap_obj->height); 1046 if (omap_obj->block) { 1047 struct tcm_area *area = &omap_obj->block->area; 1048 seq_printf(m, " (%dx%d, %dx%d)", 1049 area->p0.x, area->p0.y, 1050 area->p1.x, area->p1.y); 1051 } 1052 } else { 1053 seq_printf(m, " %d", obj->size); 1054 } 1055 1056 seq_printf(m, "\n"); 1057 } 1058 1059 void omap_gem_describe_objects(struct list_head *list, struct seq_file *m) 1060 { 1061 struct omap_gem_object *omap_obj; 1062 int count = 0; 1063 size_t size = 0; 1064 1065 list_for_each_entry(omap_obj, list, mm_list) { 1066 struct drm_gem_object *obj = &omap_obj->base; 1067 seq_printf(m, " "); 1068 omap_gem_describe(obj, m); 1069 count++; 1070 size += obj->size; 1071 } 1072 1073 seq_printf(m, "Total %d objects, %zu bytes\n", count, size); 1074 } 1075 #endif 1076 1077 /* ----------------------------------------------------------------------------- 1078 * Buffer Synchronization 1079 */ 1080 1081 static DEFINE_SPINLOCK(sync_lock); 1082 1083 struct omap_gem_sync_waiter { 1084 struct list_head list; 1085 struct omap_gem_object *omap_obj; 1086 enum omap_gem_op op; 1087 uint32_t read_target, write_target; 1088 /* notify called w/ sync_lock held */ 1089 void (*notify)(void *arg); 1090 void *arg; 1091 }; 1092 1093 /* list of omap_gem_sync_waiter.. the notify fxn gets called back when 1094 * the read and/or write target count is achieved which can call a user 1095 * callback (ex. to kick 3d and/or 2d), wakeup blocked task (prep for 1096 * cpu access), etc. 1097 */ 1098 static LIST_HEAD(waiters); 1099 1100 static inline bool is_waiting(struct omap_gem_sync_waiter *waiter) 1101 { 1102 struct omap_gem_object *omap_obj = waiter->omap_obj; 1103 if ((waiter->op & OMAP_GEM_READ) && 1104 (omap_obj->sync->write_complete < waiter->write_target)) 1105 return true; 1106 if ((waiter->op & OMAP_GEM_WRITE) && 1107 (omap_obj->sync->read_complete < waiter->read_target)) 1108 return true; 1109 return false; 1110 } 1111 1112 /* macro for sync debug.. */ 1113 #define SYNCDBG 0 1114 #define SYNC(fmt, ...) do { if (SYNCDBG) \ 1115 printk(KERN_ERR "%s:%d: "fmt"\n", \ 1116 __func__, __LINE__, ##__VA_ARGS__); \ 1117 } while (0) 1118 1119 1120 static void sync_op_update(void) 1121 { 1122 struct omap_gem_sync_waiter *waiter, *n; 1123 list_for_each_entry_safe(waiter, n, &waiters, list) { 1124 if (!is_waiting(waiter)) { 1125 list_del(&waiter->list); 1126 SYNC("notify: %p", waiter); 1127 waiter->notify(waiter->arg); 1128 kfree(waiter); 1129 } 1130 } 1131 } 1132 1133 static inline int sync_op(struct drm_gem_object *obj, 1134 enum omap_gem_op op, bool start) 1135 { 1136 struct omap_gem_object *omap_obj = to_omap_bo(obj); 1137 int ret = 0; 1138 1139 spin_lock(&sync_lock); 1140 1141 if (!omap_obj->sync) { 1142 omap_obj->sync = kzalloc(sizeof(*omap_obj->sync), GFP_ATOMIC); 1143 if (!omap_obj->sync) { 1144 ret = -ENOMEM; 1145 goto unlock; 1146 } 1147 } 1148 1149 if (start) { 1150 if (op & OMAP_GEM_READ) 1151 omap_obj->sync->read_pending++; 1152 if (op & OMAP_GEM_WRITE) 1153 omap_obj->sync->write_pending++; 1154 } else { 1155 if (op & OMAP_GEM_READ) 1156 omap_obj->sync->read_complete++; 1157 if (op & OMAP_GEM_WRITE) 1158 omap_obj->sync->write_complete++; 1159 sync_op_update(); 1160 } 1161 1162 unlock: 1163 spin_unlock(&sync_lock); 1164 1165 return ret; 1166 } 1167 1168 /* mark the start of read and/or write operation */ 1169 int omap_gem_op_start(struct drm_gem_object *obj, enum omap_gem_op op) 1170 { 1171 return sync_op(obj, op, true); 1172 } 1173 1174 int omap_gem_op_finish(struct drm_gem_object *obj, enum omap_gem_op op) 1175 { 1176 return sync_op(obj, op, false); 1177 } 1178 1179 static DECLARE_WAIT_QUEUE_HEAD(sync_event); 1180 1181 static void sync_notify(void *arg) 1182 { 1183 struct task_struct **waiter_task = arg; 1184 *waiter_task = NULL; 1185 wake_up_all(&sync_event); 1186 } 1187 1188 int omap_gem_op_sync(struct drm_gem_object *obj, enum omap_gem_op op) 1189 { 1190 struct omap_gem_object *omap_obj = to_omap_bo(obj); 1191 int ret = 0; 1192 if (omap_obj->sync) { 1193 struct task_struct *waiter_task = current; 1194 struct omap_gem_sync_waiter *waiter = 1195 kzalloc(sizeof(*waiter), GFP_KERNEL); 1196 1197 if (!waiter) 1198 return -ENOMEM; 1199 1200 waiter->omap_obj = omap_obj; 1201 waiter->op = op; 1202 waiter->read_target = omap_obj->sync->read_pending; 1203 waiter->write_target = omap_obj->sync->write_pending; 1204 waiter->notify = sync_notify; 1205 waiter->arg = &waiter_task; 1206 1207 spin_lock(&sync_lock); 1208 if (is_waiting(waiter)) { 1209 SYNC("waited: %p", waiter); 1210 list_add_tail(&waiter->list, &waiters); 1211 spin_unlock(&sync_lock); 1212 ret = wait_event_interruptible(sync_event, 1213 (waiter_task == NULL)); 1214 spin_lock(&sync_lock); 1215 if (waiter_task) { 1216 SYNC("interrupted: %p", waiter); 1217 /* we were interrupted */ 1218 list_del(&waiter->list); 1219 waiter_task = NULL; 1220 } else { 1221 /* freed in sync_op_update() */ 1222 waiter = NULL; 1223 } 1224 } 1225 spin_unlock(&sync_lock); 1226 kfree(waiter); 1227 } 1228 return ret; 1229 } 1230 1231 /* call fxn(arg), either synchronously or asynchronously if the op 1232 * is currently blocked.. fxn() can be called from any context 1233 * 1234 * (TODO for now fxn is called back from whichever context calls 1235 * omap_gem_op_finish().. but this could be better defined later 1236 * if needed) 1237 * 1238 * TODO more code in common w/ _sync().. 1239 */ 1240 int omap_gem_op_async(struct drm_gem_object *obj, enum omap_gem_op op, 1241 void (*fxn)(void *arg), void *arg) 1242 { 1243 struct omap_gem_object *omap_obj = to_omap_bo(obj); 1244 if (omap_obj->sync) { 1245 struct omap_gem_sync_waiter *waiter = 1246 kzalloc(sizeof(*waiter), GFP_ATOMIC); 1247 1248 if (!waiter) 1249 return -ENOMEM; 1250 1251 waiter->omap_obj = omap_obj; 1252 waiter->op = op; 1253 waiter->read_target = omap_obj->sync->read_pending; 1254 waiter->write_target = omap_obj->sync->write_pending; 1255 waiter->notify = fxn; 1256 waiter->arg = arg; 1257 1258 spin_lock(&sync_lock); 1259 if (is_waiting(waiter)) { 1260 SYNC("waited: %p", waiter); 1261 list_add_tail(&waiter->list, &waiters); 1262 spin_unlock(&sync_lock); 1263 return 0; 1264 } 1265 1266 spin_unlock(&sync_lock); 1267 1268 kfree(waiter); 1269 } 1270 1271 /* no waiting.. */ 1272 fxn(arg); 1273 1274 return 0; 1275 } 1276 1277 /* ----------------------------------------------------------------------------- 1278 * Constructor & Destructor 1279 */ 1280 1281 void omap_gem_free_object(struct drm_gem_object *obj) 1282 { 1283 struct drm_device *dev = obj->dev; 1284 struct omap_drm_private *priv = dev->dev_private; 1285 struct omap_gem_object *omap_obj = to_omap_bo(obj); 1286 1287 evict(obj); 1288 1289 WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 1290 1291 spin_lock(&priv->list_lock); 1292 list_del(&omap_obj->mm_list); 1293 spin_unlock(&priv->list_lock); 1294 1295 /* this means the object is still pinned.. which really should 1296 * not happen. I think.. 1297 */ 1298 WARN_ON(omap_obj->paddr_cnt > 0); 1299 1300 if (omap_obj->pages) { 1301 if (omap_obj->flags & OMAP_BO_MEM_DMABUF) 1302 kfree(omap_obj->pages); 1303 else 1304 omap_gem_detach_pages(obj); 1305 } 1306 1307 if (omap_obj->flags & OMAP_BO_MEM_DMA_API) { 1308 dma_free_wc(dev->dev, obj->size, omap_obj->vaddr, 1309 omap_obj->paddr); 1310 } else if (omap_obj->vaddr) { 1311 vunmap(omap_obj->vaddr); 1312 } else if (obj->import_attach) { 1313 drm_prime_gem_destroy(obj, omap_obj->sgt); 1314 } 1315 1316 kfree(omap_obj->sync); 1317 1318 drm_gem_object_release(obj); 1319 1320 kfree(omap_obj); 1321 } 1322 1323 /* GEM buffer object constructor */ 1324 struct drm_gem_object *omap_gem_new(struct drm_device *dev, 1325 union omap_gem_size gsize, uint32_t flags) 1326 { 1327 struct omap_drm_private *priv = dev->dev_private; 1328 struct omap_gem_object *omap_obj; 1329 struct drm_gem_object *obj; 1330 struct address_space *mapping; 1331 size_t size; 1332 int ret; 1333 1334 /* Validate the flags and compute the memory and cache flags. */ 1335 if (flags & OMAP_BO_TILED) { 1336 if (!priv->usergart) { 1337 dev_err(dev->dev, "Tiled buffers require DMM\n"); 1338 return NULL; 1339 } 1340 1341 /* 1342 * Tiled buffers are always shmem paged backed. When they are 1343 * scanned out, they are remapped into DMM/TILER. 1344 */ 1345 flags &= ~OMAP_BO_SCANOUT; 1346 flags |= OMAP_BO_MEM_SHMEM; 1347 1348 /* 1349 * Currently don't allow cached buffers. There is some caching 1350 * stuff that needs to be handled better. 1351 */ 1352 flags &= ~(OMAP_BO_CACHED|OMAP_BO_WC|OMAP_BO_UNCACHED); 1353 flags |= tiler_get_cpu_cache_flags(); 1354 } else if ((flags & OMAP_BO_SCANOUT) && !priv->has_dmm) { 1355 /* 1356 * OMAP_BO_SCANOUT hints that the buffer doesn't need to be 1357 * tiled. However, to lower the pressure on memory allocation, 1358 * use contiguous memory only if no TILER is available. 1359 */ 1360 flags |= OMAP_BO_MEM_DMA_API; 1361 } else if (!(flags & OMAP_BO_MEM_DMABUF)) { 1362 /* 1363 * All other buffers not backed by dma_buf are shmem-backed. 1364 */ 1365 flags |= OMAP_BO_MEM_SHMEM; 1366 } 1367 1368 /* Allocate the initialize the OMAP GEM object. */ 1369 omap_obj = kzalloc(sizeof(*omap_obj), GFP_KERNEL); 1370 if (!omap_obj) 1371 return NULL; 1372 1373 obj = &omap_obj->base; 1374 omap_obj->flags = flags; 1375 1376 if (flags & OMAP_BO_TILED) { 1377 /* 1378 * For tiled buffers align dimensions to slot boundaries and 1379 * calculate size based on aligned dimensions. 1380 */ 1381 tiler_align(gem2fmt(flags), &gsize.tiled.width, 1382 &gsize.tiled.height); 1383 1384 size = tiler_size(gem2fmt(flags), gsize.tiled.width, 1385 gsize.tiled.height); 1386 1387 omap_obj->width = gsize.tiled.width; 1388 omap_obj->height = gsize.tiled.height; 1389 } else { 1390 size = PAGE_ALIGN(gsize.bytes); 1391 } 1392 1393 /* Initialize the GEM object. */ 1394 if (!(flags & OMAP_BO_MEM_SHMEM)) { 1395 drm_gem_private_object_init(dev, obj, size); 1396 } else { 1397 ret = drm_gem_object_init(dev, obj, size); 1398 if (ret) 1399 goto err_free; 1400 1401 mapping = obj->filp->f_mapping; 1402 mapping_set_gfp_mask(mapping, GFP_USER | __GFP_DMA32); 1403 } 1404 1405 /* Allocate memory if needed. */ 1406 if (flags & OMAP_BO_MEM_DMA_API) { 1407 omap_obj->vaddr = dma_alloc_wc(dev->dev, size, 1408 &omap_obj->paddr, 1409 GFP_KERNEL); 1410 if (!omap_obj->vaddr) 1411 goto err_release; 1412 } 1413 1414 spin_lock(&priv->list_lock); 1415 list_add(&omap_obj->mm_list, &priv->obj_list); 1416 spin_unlock(&priv->list_lock); 1417 1418 return obj; 1419 1420 err_release: 1421 drm_gem_object_release(obj); 1422 err_free: 1423 kfree(omap_obj); 1424 return NULL; 1425 } 1426 1427 struct drm_gem_object *omap_gem_new_dmabuf(struct drm_device *dev, size_t size, 1428 struct sg_table *sgt) 1429 { 1430 struct omap_drm_private *priv = dev->dev_private; 1431 struct omap_gem_object *omap_obj; 1432 struct drm_gem_object *obj; 1433 union omap_gem_size gsize; 1434 1435 /* Without a DMM only physically contiguous buffers can be supported. */ 1436 if (sgt->orig_nents != 1 && !priv->has_dmm) 1437 return ERR_PTR(-EINVAL); 1438 1439 mutex_lock(&dev->struct_mutex); 1440 1441 gsize.bytes = PAGE_ALIGN(size); 1442 obj = omap_gem_new(dev, gsize, OMAP_BO_MEM_DMABUF | OMAP_BO_WC); 1443 if (!obj) { 1444 obj = ERR_PTR(-ENOMEM); 1445 goto done; 1446 } 1447 1448 omap_obj = to_omap_bo(obj); 1449 omap_obj->sgt = sgt; 1450 1451 if (sgt->orig_nents == 1) { 1452 omap_obj->paddr = sg_dma_address(sgt->sgl); 1453 } else { 1454 /* Create pages list from sgt */ 1455 struct sg_page_iter iter; 1456 struct page **pages; 1457 unsigned int npages; 1458 unsigned int i = 0; 1459 1460 npages = DIV_ROUND_UP(size, PAGE_SIZE); 1461 pages = kcalloc(npages, sizeof(*pages), GFP_KERNEL); 1462 if (!pages) { 1463 omap_gem_free_object(obj); 1464 obj = ERR_PTR(-ENOMEM); 1465 goto done; 1466 } 1467 1468 omap_obj->pages = pages; 1469 1470 for_each_sg_page(sgt->sgl, &iter, sgt->orig_nents, 0) { 1471 pages[i++] = sg_page_iter_page(&iter); 1472 if (i > npages) 1473 break; 1474 } 1475 1476 if (WARN_ON(i != npages)) { 1477 omap_gem_free_object(obj); 1478 obj = ERR_PTR(-ENOMEM); 1479 goto done; 1480 } 1481 } 1482 1483 done: 1484 mutex_unlock(&dev->struct_mutex); 1485 return obj; 1486 } 1487 1488 /* convenience method to construct a GEM buffer object, and userspace handle */ 1489 int omap_gem_new_handle(struct drm_device *dev, struct drm_file *file, 1490 union omap_gem_size gsize, uint32_t flags, uint32_t *handle) 1491 { 1492 struct drm_gem_object *obj; 1493 int ret; 1494 1495 obj = omap_gem_new(dev, gsize, flags); 1496 if (!obj) 1497 return -ENOMEM; 1498 1499 ret = drm_gem_handle_create(file, obj, handle); 1500 if (ret) { 1501 omap_gem_free_object(obj); 1502 return ret; 1503 } 1504 1505 /* drop reference from allocate - handle holds it now */ 1506 drm_gem_object_unreference_unlocked(obj); 1507 1508 return 0; 1509 } 1510 1511 /* ----------------------------------------------------------------------------- 1512 * Init & Cleanup 1513 */ 1514 1515 /* If DMM is used, we need to set some stuff up.. */ 1516 void omap_gem_init(struct drm_device *dev) 1517 { 1518 struct omap_drm_private *priv = dev->dev_private; 1519 struct omap_drm_usergart *usergart; 1520 const enum tiler_fmt fmts[] = { 1521 TILFMT_8BIT, TILFMT_16BIT, TILFMT_32BIT 1522 }; 1523 int i, j; 1524 1525 if (!dmm_is_available()) { 1526 /* DMM only supported on OMAP4 and later, so this isn't fatal */ 1527 dev_warn(dev->dev, "DMM not available, disable DMM support\n"); 1528 return; 1529 } 1530 1531 usergart = kcalloc(3, sizeof(*usergart), GFP_KERNEL); 1532 if (!usergart) 1533 return; 1534 1535 /* reserve 4k aligned/wide regions for userspace mappings: */ 1536 for (i = 0; i < ARRAY_SIZE(fmts); i++) { 1537 uint16_t h = 1, w = PAGE_SIZE >> i; 1538 tiler_align(fmts[i], &w, &h); 1539 /* note: since each region is 1 4kb page wide, and minimum 1540 * number of rows, the height ends up being the same as the 1541 * # of pages in the region 1542 */ 1543 usergart[i].height = h; 1544 usergart[i].height_shift = ilog2(h); 1545 usergart[i].stride_pfn = tiler_stride(fmts[i], 0) >> PAGE_SHIFT; 1546 usergart[i].slot_shift = ilog2((PAGE_SIZE / h) >> i); 1547 for (j = 0; j < NUM_USERGART_ENTRIES; j++) { 1548 struct omap_drm_usergart_entry *entry; 1549 struct tiler_block *block; 1550 1551 entry = &usergart[i].entry[j]; 1552 block = tiler_reserve_2d(fmts[i], w, h, PAGE_SIZE); 1553 if (IS_ERR(block)) { 1554 dev_err(dev->dev, 1555 "reserve failed: %d, %d, %ld\n", 1556 i, j, PTR_ERR(block)); 1557 return; 1558 } 1559 entry->paddr = tiler_ssptr(block); 1560 entry->block = block; 1561 1562 DBG("%d:%d: %dx%d: paddr=%pad stride=%d", i, j, w, h, 1563 &entry->paddr, 1564 usergart[i].stride_pfn << PAGE_SHIFT); 1565 } 1566 } 1567 1568 priv->usergart = usergart; 1569 priv->has_dmm = true; 1570 } 1571 1572 void omap_gem_deinit(struct drm_device *dev) 1573 { 1574 struct omap_drm_private *priv = dev->dev_private; 1575 1576 /* I believe we can rely on there being no more outstanding GEM 1577 * objects which could depend on usergart/dmm at this point. 1578 */ 1579 kfree(priv->usergart); 1580 } 1581