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