1 // SPDX-License-Identifier: GPL-2.0-or-later 2 3 #include <drm/drm_debugfs.h> 4 #include <drm/drm_device.h> 5 #include <drm/drm_drv.h> 6 #include <drm/drm_file.h> 7 #include <drm/drm_framebuffer.h> 8 #include <drm/drm_gem_ttm_helper.h> 9 #include <drm/drm_gem_vram_helper.h> 10 #include <drm/drm_mode.h> 11 #include <drm/drm_plane.h> 12 #include <drm/drm_prime.h> 13 #include <drm/drm_simple_kms_helper.h> 14 #include <drm/ttm/ttm_page_alloc.h> 15 16 static const struct drm_gem_object_funcs drm_gem_vram_object_funcs; 17 18 /** 19 * DOC: overview 20 * 21 * This library provides a GEM buffer object that is backed by video RAM 22 * (VRAM). It can be used for framebuffer devices with dedicated memory. 23 * 24 * The data structure &struct drm_vram_mm and its helpers implement a memory 25 * manager for simple framebuffer devices with dedicated video memory. Buffer 26 * objects are either placed in video RAM or evicted to system memory. The rsp. 27 * buffer object is provided by &struct drm_gem_vram_object. 28 */ 29 30 /* 31 * Buffer-objects helpers 32 */ 33 34 static void drm_gem_vram_cleanup(struct drm_gem_vram_object *gbo) 35 { 36 /* We got here via ttm_bo_put(), which means that the 37 * TTM buffer object in 'bo' has already been cleaned 38 * up; only release the GEM object. 39 */ 40 41 WARN_ON(gbo->kmap_use_count); 42 WARN_ON(gbo->kmap.virtual); 43 44 drm_gem_object_release(&gbo->bo.base); 45 } 46 47 static void drm_gem_vram_destroy(struct drm_gem_vram_object *gbo) 48 { 49 drm_gem_vram_cleanup(gbo); 50 kfree(gbo); 51 } 52 53 static void ttm_buffer_object_destroy(struct ttm_buffer_object *bo) 54 { 55 struct drm_gem_vram_object *gbo = drm_gem_vram_of_bo(bo); 56 57 drm_gem_vram_destroy(gbo); 58 } 59 60 static void drm_gem_vram_placement(struct drm_gem_vram_object *gbo, 61 unsigned long pl_flag) 62 { 63 unsigned int i; 64 unsigned int c = 0; 65 u32 invariant_flags = pl_flag & TTM_PL_FLAG_TOPDOWN; 66 67 gbo->placement.placement = gbo->placements; 68 gbo->placement.busy_placement = gbo->placements; 69 70 if (pl_flag & TTM_PL_FLAG_VRAM) 71 gbo->placements[c++].flags = TTM_PL_FLAG_WC | 72 TTM_PL_FLAG_UNCACHED | 73 TTM_PL_FLAG_VRAM | 74 invariant_flags; 75 76 if (pl_flag & TTM_PL_FLAG_SYSTEM) 77 gbo->placements[c++].flags = TTM_PL_MASK_CACHING | 78 TTM_PL_FLAG_SYSTEM | 79 invariant_flags; 80 81 if (!c) 82 gbo->placements[c++].flags = TTM_PL_MASK_CACHING | 83 TTM_PL_FLAG_SYSTEM | 84 invariant_flags; 85 86 gbo->placement.num_placement = c; 87 gbo->placement.num_busy_placement = c; 88 89 for (i = 0; i < c; ++i) { 90 gbo->placements[i].fpfn = 0; 91 gbo->placements[i].lpfn = 0; 92 } 93 } 94 95 static int drm_gem_vram_init(struct drm_device *dev, 96 struct drm_gem_vram_object *gbo, 97 size_t size, unsigned long pg_align) 98 { 99 struct drm_vram_mm *vmm = dev->vram_mm; 100 struct ttm_bo_device *bdev; 101 int ret; 102 size_t acc_size; 103 104 if (WARN_ONCE(!vmm, "VRAM MM not initialized")) 105 return -EINVAL; 106 bdev = &vmm->bdev; 107 108 gbo->bo.base.funcs = &drm_gem_vram_object_funcs; 109 110 ret = drm_gem_object_init(dev, &gbo->bo.base, size); 111 if (ret) 112 return ret; 113 114 acc_size = ttm_bo_dma_acc_size(bdev, size, sizeof(*gbo)); 115 116 gbo->bo.bdev = bdev; 117 drm_gem_vram_placement(gbo, TTM_PL_FLAG_VRAM | TTM_PL_FLAG_SYSTEM); 118 119 ret = ttm_bo_init(bdev, &gbo->bo, size, ttm_bo_type_device, 120 &gbo->placement, pg_align, false, acc_size, 121 NULL, NULL, ttm_buffer_object_destroy); 122 if (ret) 123 goto err_drm_gem_object_release; 124 125 return 0; 126 127 err_drm_gem_object_release: 128 drm_gem_object_release(&gbo->bo.base); 129 return ret; 130 } 131 132 /** 133 * drm_gem_vram_create() - Creates a VRAM-backed GEM object 134 * @dev: the DRM device 135 * @size: the buffer size in bytes 136 * @pg_align: the buffer's alignment in multiples of the page size 137 * 138 * Returns: 139 * A new instance of &struct drm_gem_vram_object on success, or 140 * an ERR_PTR()-encoded error code otherwise. 141 */ 142 struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev, 143 size_t size, 144 unsigned long pg_align) 145 { 146 struct drm_gem_vram_object *gbo; 147 int ret; 148 149 if (dev->driver->gem_create_object) { 150 struct drm_gem_object *gem = 151 dev->driver->gem_create_object(dev, size); 152 if (!gem) 153 return ERR_PTR(-ENOMEM); 154 gbo = drm_gem_vram_of_gem(gem); 155 } else { 156 gbo = kzalloc(sizeof(*gbo), GFP_KERNEL); 157 if (!gbo) 158 return ERR_PTR(-ENOMEM); 159 } 160 161 ret = drm_gem_vram_init(dev, gbo, size, pg_align); 162 if (ret < 0) 163 goto err_kfree; 164 165 return gbo; 166 167 err_kfree: 168 kfree(gbo); 169 return ERR_PTR(ret); 170 } 171 EXPORT_SYMBOL(drm_gem_vram_create); 172 173 /** 174 * drm_gem_vram_put() - Releases a reference to a VRAM-backed GEM object 175 * @gbo: the GEM VRAM object 176 * 177 * See ttm_bo_put() for more information. 178 */ 179 void drm_gem_vram_put(struct drm_gem_vram_object *gbo) 180 { 181 ttm_bo_put(&gbo->bo); 182 } 183 EXPORT_SYMBOL(drm_gem_vram_put); 184 185 /** 186 * drm_gem_vram_mmap_offset() - Returns a GEM VRAM object's mmap offset 187 * @gbo: the GEM VRAM object 188 * 189 * See drm_vma_node_offset_addr() for more information. 190 * 191 * Returns: 192 * The buffer object's offset for userspace mappings on success, or 193 * 0 if no offset is allocated. 194 */ 195 u64 drm_gem_vram_mmap_offset(struct drm_gem_vram_object *gbo) 196 { 197 return drm_vma_node_offset_addr(&gbo->bo.base.vma_node); 198 } 199 EXPORT_SYMBOL(drm_gem_vram_mmap_offset); 200 201 /** 202 * drm_gem_vram_offset() - \ 203 Returns a GEM VRAM object's offset in video memory 204 * @gbo: the GEM VRAM object 205 * 206 * This function returns the buffer object's offset in the device's video 207 * memory. The buffer object has to be pinned to %TTM_PL_VRAM. 208 * 209 * Returns: 210 * The buffer object's offset in video memory on success, or 211 * a negative errno code otherwise. 212 */ 213 s64 drm_gem_vram_offset(struct drm_gem_vram_object *gbo) 214 { 215 if (WARN_ON_ONCE(!gbo->pin_count)) 216 return (s64)-ENODEV; 217 return gbo->bo.offset; 218 } 219 EXPORT_SYMBOL(drm_gem_vram_offset); 220 221 static int drm_gem_vram_pin_locked(struct drm_gem_vram_object *gbo, 222 unsigned long pl_flag) 223 { 224 int i, ret; 225 struct ttm_operation_ctx ctx = { false, false }; 226 227 if (gbo->pin_count) 228 goto out; 229 230 if (pl_flag) 231 drm_gem_vram_placement(gbo, pl_flag); 232 233 for (i = 0; i < gbo->placement.num_placement; ++i) 234 gbo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT; 235 236 ret = ttm_bo_validate(&gbo->bo, &gbo->placement, &ctx); 237 if (ret < 0) 238 return ret; 239 240 out: 241 ++gbo->pin_count; 242 243 return 0; 244 } 245 246 /** 247 * drm_gem_vram_pin() - Pins a GEM VRAM object in a region. 248 * @gbo: the GEM VRAM object 249 * @pl_flag: a bitmask of possible memory regions 250 * 251 * Pinning a buffer object ensures that it is not evicted from 252 * a memory region. A pinned buffer object has to be unpinned before 253 * it can be pinned to another region. If the pl_flag argument is 0, 254 * the buffer is pinned at its current location (video RAM or system 255 * memory). 256 * 257 * Small buffer objects, such as cursor images, can lead to memory 258 * fragmentation if they are pinned in the middle of video RAM. This 259 * is especially a problem on devices with only a small amount of 260 * video RAM. Fragmentation can prevent the primary framebuffer from 261 * fitting in, even though there's enough memory overall. The modifier 262 * DRM_GEM_VRAM_PL_FLAG_TOPDOWN marks the buffer object to be pinned 263 * at the high end of the memory region to avoid fragmentation. 264 * 265 * Returns: 266 * 0 on success, or 267 * a negative error code otherwise. 268 */ 269 int drm_gem_vram_pin(struct drm_gem_vram_object *gbo, unsigned long pl_flag) 270 { 271 int ret; 272 273 ret = ttm_bo_reserve(&gbo->bo, true, false, NULL); 274 if (ret) 275 return ret; 276 ret = drm_gem_vram_pin_locked(gbo, pl_flag); 277 ttm_bo_unreserve(&gbo->bo); 278 279 return ret; 280 } 281 EXPORT_SYMBOL(drm_gem_vram_pin); 282 283 static int drm_gem_vram_unpin_locked(struct drm_gem_vram_object *gbo) 284 { 285 int i, ret; 286 struct ttm_operation_ctx ctx = { false, false }; 287 288 if (WARN_ON_ONCE(!gbo->pin_count)) 289 return 0; 290 291 --gbo->pin_count; 292 if (gbo->pin_count) 293 return 0; 294 295 for (i = 0; i < gbo->placement.num_placement ; ++i) 296 gbo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT; 297 298 ret = ttm_bo_validate(&gbo->bo, &gbo->placement, &ctx); 299 if (ret < 0) 300 return ret; 301 302 return 0; 303 } 304 305 /** 306 * drm_gem_vram_unpin() - Unpins a GEM VRAM object 307 * @gbo: the GEM VRAM object 308 * 309 * Returns: 310 * 0 on success, or 311 * a negative error code otherwise. 312 */ 313 int drm_gem_vram_unpin(struct drm_gem_vram_object *gbo) 314 { 315 int ret; 316 317 ret = ttm_bo_reserve(&gbo->bo, true, false, NULL); 318 if (ret) 319 return ret; 320 ret = drm_gem_vram_unpin_locked(gbo); 321 ttm_bo_unreserve(&gbo->bo); 322 323 return ret; 324 } 325 EXPORT_SYMBOL(drm_gem_vram_unpin); 326 327 static void *drm_gem_vram_kmap_locked(struct drm_gem_vram_object *gbo, 328 bool map, bool *is_iomem) 329 { 330 int ret; 331 struct ttm_bo_kmap_obj *kmap = &gbo->kmap; 332 333 if (gbo->kmap_use_count > 0) 334 goto out; 335 336 if (kmap->virtual || !map) 337 goto out; 338 339 ret = ttm_bo_kmap(&gbo->bo, 0, gbo->bo.num_pages, kmap); 340 if (ret) 341 return ERR_PTR(ret); 342 343 out: 344 if (!kmap->virtual) { 345 if (is_iomem) 346 *is_iomem = false; 347 return NULL; /* not mapped; don't increment ref */ 348 } 349 ++gbo->kmap_use_count; 350 if (is_iomem) 351 return ttm_kmap_obj_virtual(kmap, is_iomem); 352 return kmap->virtual; 353 } 354 355 /** 356 * drm_gem_vram_kmap() - Maps a GEM VRAM object into kernel address space 357 * @gbo: the GEM VRAM object 358 * @map: establish a mapping if necessary 359 * @is_iomem: returns true if the mapped memory is I/O memory, or false \ 360 otherwise; can be NULL 361 * 362 * This function maps the buffer object into the kernel's address space 363 * or returns the current mapping. If the parameter map is false, the 364 * function only queries the current mapping, but does not establish a 365 * new one. 366 * 367 * Returns: 368 * The buffers virtual address if mapped, or 369 * NULL if not mapped, or 370 * an ERR_PTR()-encoded error code otherwise. 371 */ 372 void *drm_gem_vram_kmap(struct drm_gem_vram_object *gbo, bool map, 373 bool *is_iomem) 374 { 375 int ret; 376 void *virtual; 377 378 ret = ttm_bo_reserve(&gbo->bo, true, false, NULL); 379 if (ret) 380 return ERR_PTR(ret); 381 virtual = drm_gem_vram_kmap_locked(gbo, map, is_iomem); 382 ttm_bo_unreserve(&gbo->bo); 383 384 return virtual; 385 } 386 EXPORT_SYMBOL(drm_gem_vram_kmap); 387 388 static void drm_gem_vram_kunmap_locked(struct drm_gem_vram_object *gbo) 389 { 390 if (WARN_ON_ONCE(!gbo->kmap_use_count)) 391 return; 392 if (--gbo->kmap_use_count > 0) 393 return; 394 395 /* 396 * Permanently mapping and unmapping buffers adds overhead from 397 * updating the page tables and creates debugging output. Therefore, 398 * we delay the actual unmap operation until the BO gets evicted 399 * from memory. See drm_gem_vram_bo_driver_move_notify(). 400 */ 401 } 402 403 /** 404 * drm_gem_vram_kunmap() - Unmaps a GEM VRAM object 405 * @gbo: the GEM VRAM object 406 */ 407 void drm_gem_vram_kunmap(struct drm_gem_vram_object *gbo) 408 { 409 int ret; 410 411 ret = ttm_bo_reserve(&gbo->bo, false, false, NULL); 412 if (WARN_ONCE(ret, "ttm_bo_reserve_failed(): ret=%d\n", ret)) 413 return; 414 drm_gem_vram_kunmap_locked(gbo); 415 ttm_bo_unreserve(&gbo->bo); 416 } 417 EXPORT_SYMBOL(drm_gem_vram_kunmap); 418 419 /** 420 * drm_gem_vram_vmap() - Pins and maps a GEM VRAM object into kernel address 421 * space 422 * @gbo: The GEM VRAM object to map 423 * 424 * The vmap function pins a GEM VRAM object to its current location, either 425 * system or video memory, and maps its buffer into kernel address space. 426 * As pinned object cannot be relocated, you should avoid pinning objects 427 * permanently. Call drm_gem_vram_vunmap() with the returned address to 428 * unmap and unpin the GEM VRAM object. 429 * 430 * If you have special requirements for the pinning or mapping operations, 431 * call drm_gem_vram_pin() and drm_gem_vram_kmap() directly. 432 * 433 * Returns: 434 * The buffer's virtual address on success, or 435 * an ERR_PTR()-encoded error code otherwise. 436 */ 437 void *drm_gem_vram_vmap(struct drm_gem_vram_object *gbo) 438 { 439 int ret; 440 void *base; 441 442 ret = ttm_bo_reserve(&gbo->bo, true, false, NULL); 443 if (ret) 444 return ERR_PTR(ret); 445 446 ret = drm_gem_vram_pin_locked(gbo, 0); 447 if (ret) 448 goto err_ttm_bo_unreserve; 449 base = drm_gem_vram_kmap_locked(gbo, true, NULL); 450 if (IS_ERR(base)) { 451 ret = PTR_ERR(base); 452 goto err_drm_gem_vram_unpin_locked; 453 } 454 455 ttm_bo_unreserve(&gbo->bo); 456 457 return base; 458 459 err_drm_gem_vram_unpin_locked: 460 drm_gem_vram_unpin_locked(gbo); 461 err_ttm_bo_unreserve: 462 ttm_bo_unreserve(&gbo->bo); 463 return ERR_PTR(ret); 464 } 465 EXPORT_SYMBOL(drm_gem_vram_vmap); 466 467 /** 468 * drm_gem_vram_vunmap() - Unmaps and unpins a GEM VRAM object 469 * @gbo: The GEM VRAM object to unmap 470 * @vaddr: The mapping's base address as returned by drm_gem_vram_vmap() 471 * 472 * A call to drm_gem_vram_vunmap() unmaps and unpins a GEM VRAM buffer. See 473 * the documentation for drm_gem_vram_vmap() for more information. 474 */ 475 void drm_gem_vram_vunmap(struct drm_gem_vram_object *gbo, void *vaddr) 476 { 477 int ret; 478 479 ret = ttm_bo_reserve(&gbo->bo, false, false, NULL); 480 if (WARN_ONCE(ret, "ttm_bo_reserve_failed(): ret=%d\n", ret)) 481 return; 482 483 drm_gem_vram_kunmap_locked(gbo); 484 drm_gem_vram_unpin_locked(gbo); 485 486 ttm_bo_unreserve(&gbo->bo); 487 } 488 EXPORT_SYMBOL(drm_gem_vram_vunmap); 489 490 /** 491 * drm_gem_vram_fill_create_dumb() - \ 492 Helper for implementing &struct drm_driver.dumb_create 493 * @file: the DRM file 494 * @dev: the DRM device 495 * @pg_align: the buffer's alignment in multiples of the page size 496 * @pitch_align: the scanline's alignment in powers of 2 497 * @args: the arguments as provided to \ 498 &struct drm_driver.dumb_create 499 * 500 * This helper function fills &struct drm_mode_create_dumb, which is used 501 * by &struct drm_driver.dumb_create. Implementations of this interface 502 * should forwards their arguments to this helper, plus the driver-specific 503 * parameters. 504 * 505 * Returns: 506 * 0 on success, or 507 * a negative error code otherwise. 508 */ 509 int drm_gem_vram_fill_create_dumb(struct drm_file *file, 510 struct drm_device *dev, 511 unsigned long pg_align, 512 unsigned long pitch_align, 513 struct drm_mode_create_dumb *args) 514 { 515 size_t pitch, size; 516 struct drm_gem_vram_object *gbo; 517 int ret; 518 u32 handle; 519 520 pitch = args->width * DIV_ROUND_UP(args->bpp, 8); 521 if (pitch_align) { 522 if (WARN_ON_ONCE(!is_power_of_2(pitch_align))) 523 return -EINVAL; 524 pitch = ALIGN(pitch, pitch_align); 525 } 526 size = pitch * args->height; 527 528 size = roundup(size, PAGE_SIZE); 529 if (!size) 530 return -EINVAL; 531 532 gbo = drm_gem_vram_create(dev, size, pg_align); 533 if (IS_ERR(gbo)) 534 return PTR_ERR(gbo); 535 536 ret = drm_gem_handle_create(file, &gbo->bo.base, &handle); 537 if (ret) 538 goto err_drm_gem_object_put_unlocked; 539 540 drm_gem_object_put_unlocked(&gbo->bo.base); 541 542 args->pitch = pitch; 543 args->size = size; 544 args->handle = handle; 545 546 return 0; 547 548 err_drm_gem_object_put_unlocked: 549 drm_gem_object_put_unlocked(&gbo->bo.base); 550 return ret; 551 } 552 EXPORT_SYMBOL(drm_gem_vram_fill_create_dumb); 553 554 /* 555 * Helpers for struct ttm_bo_driver 556 */ 557 558 static bool drm_is_gem_vram(struct ttm_buffer_object *bo) 559 { 560 return (bo->destroy == ttm_buffer_object_destroy); 561 } 562 563 static void drm_gem_vram_bo_driver_evict_flags(struct drm_gem_vram_object *gbo, 564 struct ttm_placement *pl) 565 { 566 drm_gem_vram_placement(gbo, TTM_PL_FLAG_SYSTEM); 567 *pl = gbo->placement; 568 } 569 570 static void drm_gem_vram_bo_driver_move_notify(struct drm_gem_vram_object *gbo, 571 bool evict, 572 struct ttm_mem_reg *new_mem) 573 { 574 struct ttm_bo_kmap_obj *kmap = &gbo->kmap; 575 576 if (WARN_ON_ONCE(gbo->kmap_use_count)) 577 return; 578 579 if (!kmap->virtual) 580 return; 581 ttm_bo_kunmap(kmap); 582 kmap->virtual = NULL; 583 } 584 585 /* 586 * Helpers for struct drm_gem_object_funcs 587 */ 588 589 /** 590 * drm_gem_vram_object_free() - \ 591 Implements &struct drm_gem_object_funcs.free 592 * @gem: GEM object. Refers to &struct drm_gem_vram_object.gem 593 */ 594 static void drm_gem_vram_object_free(struct drm_gem_object *gem) 595 { 596 struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem); 597 598 drm_gem_vram_put(gbo); 599 } 600 601 /* 602 * Helpers for dump buffers 603 */ 604 605 /** 606 * drm_gem_vram_driver_create_dumb() - \ 607 Implements &struct drm_driver.dumb_create 608 * @file: the DRM file 609 * @dev: the DRM device 610 * @args: the arguments as provided to \ 611 &struct drm_driver.dumb_create 612 * 613 * This function requires the driver to use @drm_device.vram_mm for its 614 * instance of VRAM MM. 615 * 616 * Returns: 617 * 0 on success, or 618 * a negative error code otherwise. 619 */ 620 int drm_gem_vram_driver_dumb_create(struct drm_file *file, 621 struct drm_device *dev, 622 struct drm_mode_create_dumb *args) 623 { 624 if (WARN_ONCE(!dev->vram_mm, "VRAM MM not initialized")) 625 return -EINVAL; 626 627 return drm_gem_vram_fill_create_dumb(file, dev, 0, 0, args); 628 } 629 EXPORT_SYMBOL(drm_gem_vram_driver_dumb_create); 630 631 /** 632 * drm_gem_vram_driver_dumb_mmap_offset() - \ 633 Implements &struct drm_driver.dumb_mmap_offset 634 * @file: DRM file pointer. 635 * @dev: DRM device. 636 * @handle: GEM handle 637 * @offset: Returns the mapping's memory offset on success 638 * 639 * Returns: 640 * 0 on success, or 641 * a negative errno code otherwise. 642 */ 643 int drm_gem_vram_driver_dumb_mmap_offset(struct drm_file *file, 644 struct drm_device *dev, 645 uint32_t handle, uint64_t *offset) 646 { 647 struct drm_gem_object *gem; 648 struct drm_gem_vram_object *gbo; 649 650 gem = drm_gem_object_lookup(file, handle); 651 if (!gem) 652 return -ENOENT; 653 654 gbo = drm_gem_vram_of_gem(gem); 655 *offset = drm_gem_vram_mmap_offset(gbo); 656 657 drm_gem_object_put_unlocked(gem); 658 659 return 0; 660 } 661 EXPORT_SYMBOL(drm_gem_vram_driver_dumb_mmap_offset); 662 663 /* 664 * Helpers for struct drm_plane_helper_funcs 665 */ 666 667 /** 668 * drm_gem_vram_plane_helper_prepare_fb() - \ 669 * Implements &struct drm_plane_helper_funcs.prepare_fb 670 * @plane: a DRM plane 671 * @new_state: the plane's new state 672 * 673 * During plane updates, this function pins the GEM VRAM 674 * objects of the plane's new framebuffer to VRAM. Call 675 * drm_gem_vram_plane_helper_cleanup_fb() to unpin them. 676 * 677 * Returns: 678 * 0 on success, or 679 * a negative errno code otherwise. 680 */ 681 int 682 drm_gem_vram_plane_helper_prepare_fb(struct drm_plane *plane, 683 struct drm_plane_state *new_state) 684 { 685 size_t i; 686 struct drm_gem_vram_object *gbo; 687 int ret; 688 689 if (!new_state->fb) 690 return 0; 691 692 for (i = 0; i < ARRAY_SIZE(new_state->fb->obj); ++i) { 693 if (!new_state->fb->obj[i]) 694 continue; 695 gbo = drm_gem_vram_of_gem(new_state->fb->obj[i]); 696 ret = drm_gem_vram_pin(gbo, DRM_GEM_VRAM_PL_FLAG_VRAM); 697 if (ret) 698 goto err_drm_gem_vram_unpin; 699 } 700 701 return 0; 702 703 err_drm_gem_vram_unpin: 704 while (i) { 705 --i; 706 gbo = drm_gem_vram_of_gem(new_state->fb->obj[i]); 707 drm_gem_vram_unpin(gbo); 708 } 709 return ret; 710 } 711 EXPORT_SYMBOL(drm_gem_vram_plane_helper_prepare_fb); 712 713 /** 714 * drm_gem_vram_plane_helper_cleanup_fb() - \ 715 * Implements &struct drm_plane_helper_funcs.cleanup_fb 716 * @plane: a DRM plane 717 * @old_state: the plane's old state 718 * 719 * During plane updates, this function unpins the GEM VRAM 720 * objects of the plane's old framebuffer from VRAM. Complements 721 * drm_gem_vram_plane_helper_prepare_fb(). 722 */ 723 void 724 drm_gem_vram_plane_helper_cleanup_fb(struct drm_plane *plane, 725 struct drm_plane_state *old_state) 726 { 727 size_t i; 728 struct drm_gem_vram_object *gbo; 729 730 if (!old_state->fb) 731 return; 732 733 for (i = 0; i < ARRAY_SIZE(old_state->fb->obj); ++i) { 734 if (!old_state->fb->obj[i]) 735 continue; 736 gbo = drm_gem_vram_of_gem(old_state->fb->obj[i]); 737 drm_gem_vram_unpin(gbo); 738 } 739 } 740 EXPORT_SYMBOL(drm_gem_vram_plane_helper_cleanup_fb); 741 742 /* 743 * Helpers for struct drm_simple_display_pipe_funcs 744 */ 745 746 /** 747 * drm_gem_vram_simple_display_pipe_prepare_fb() - \ 748 * Implements &struct drm_simple_display_pipe_funcs.prepare_fb 749 * @pipe: a simple display pipe 750 * @new_state: the plane's new state 751 * 752 * During plane updates, this function pins the GEM VRAM 753 * objects of the plane's new framebuffer to VRAM. Call 754 * drm_gem_vram_simple_display_pipe_cleanup_fb() to unpin them. 755 * 756 * Returns: 757 * 0 on success, or 758 * a negative errno code otherwise. 759 */ 760 int drm_gem_vram_simple_display_pipe_prepare_fb( 761 struct drm_simple_display_pipe *pipe, 762 struct drm_plane_state *new_state) 763 { 764 return drm_gem_vram_plane_helper_prepare_fb(&pipe->plane, new_state); 765 } 766 EXPORT_SYMBOL(drm_gem_vram_simple_display_pipe_prepare_fb); 767 768 /** 769 * drm_gem_vram_simple_display_pipe_cleanup_fb() - \ 770 * Implements &struct drm_simple_display_pipe_funcs.cleanup_fb 771 * @pipe: a simple display pipe 772 * @old_state: the plane's old state 773 * 774 * During plane updates, this function unpins the GEM VRAM 775 * objects of the plane's old framebuffer from VRAM. Complements 776 * drm_gem_vram_simple_display_pipe_prepare_fb(). 777 */ 778 void drm_gem_vram_simple_display_pipe_cleanup_fb( 779 struct drm_simple_display_pipe *pipe, 780 struct drm_plane_state *old_state) 781 { 782 drm_gem_vram_plane_helper_cleanup_fb(&pipe->plane, old_state); 783 } 784 EXPORT_SYMBOL(drm_gem_vram_simple_display_pipe_cleanup_fb); 785 786 /* 787 * PRIME helpers 788 */ 789 790 /** 791 * drm_gem_vram_object_pin() - \ 792 Implements &struct drm_gem_object_funcs.pin 793 * @gem: The GEM object to pin 794 * 795 * Returns: 796 * 0 on success, or 797 * a negative errno code otherwise. 798 */ 799 static int drm_gem_vram_object_pin(struct drm_gem_object *gem) 800 { 801 struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem); 802 803 /* Fbdev console emulation is the use case of these PRIME 804 * helpers. This may involve updating a hardware buffer from 805 * a shadow FB. We pin the buffer to it's current location 806 * (either video RAM or system memory) to prevent it from 807 * being relocated during the update operation. If you require 808 * the buffer to be pinned to VRAM, implement a callback that 809 * sets the flags accordingly. 810 */ 811 return drm_gem_vram_pin(gbo, 0); 812 } 813 814 /** 815 * drm_gem_vram_object_unpin() - \ 816 Implements &struct drm_gem_object_funcs.unpin 817 * @gem: The GEM object to unpin 818 */ 819 static void drm_gem_vram_object_unpin(struct drm_gem_object *gem) 820 { 821 struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem); 822 823 drm_gem_vram_unpin(gbo); 824 } 825 826 /** 827 * drm_gem_vram_object_vmap() - \ 828 Implements &struct drm_gem_object_funcs.vmap 829 * @gem: The GEM object to map 830 * 831 * Returns: 832 * The buffers virtual address on success, or 833 * NULL otherwise. 834 */ 835 static void *drm_gem_vram_object_vmap(struct drm_gem_object *gem) 836 { 837 struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem); 838 void *base; 839 840 base = drm_gem_vram_vmap(gbo); 841 if (IS_ERR(base)) 842 return NULL; 843 return base; 844 } 845 846 /** 847 * drm_gem_vram_object_vunmap() - \ 848 Implements &struct drm_gem_object_funcs.vunmap 849 * @gem: The GEM object to unmap 850 * @vaddr: The mapping's base address 851 */ 852 static void drm_gem_vram_object_vunmap(struct drm_gem_object *gem, 853 void *vaddr) 854 { 855 struct drm_gem_vram_object *gbo = drm_gem_vram_of_gem(gem); 856 857 drm_gem_vram_vunmap(gbo, vaddr); 858 } 859 860 /* 861 * GEM object funcs 862 */ 863 864 static const struct drm_gem_object_funcs drm_gem_vram_object_funcs = { 865 .free = drm_gem_vram_object_free, 866 .pin = drm_gem_vram_object_pin, 867 .unpin = drm_gem_vram_object_unpin, 868 .vmap = drm_gem_vram_object_vmap, 869 .vunmap = drm_gem_vram_object_vunmap, 870 .mmap = drm_gem_ttm_mmap, 871 .print_info = drm_gem_ttm_print_info, 872 }; 873 874 /* 875 * VRAM memory manager 876 */ 877 878 /* 879 * TTM TT 880 */ 881 882 static void backend_func_destroy(struct ttm_tt *tt) 883 { 884 ttm_tt_fini(tt); 885 kfree(tt); 886 } 887 888 static struct ttm_backend_func backend_func = { 889 .destroy = backend_func_destroy 890 }; 891 892 /* 893 * TTM BO device 894 */ 895 896 static struct ttm_tt *bo_driver_ttm_tt_create(struct ttm_buffer_object *bo, 897 uint32_t page_flags) 898 { 899 struct ttm_tt *tt; 900 int ret; 901 902 tt = kzalloc(sizeof(*tt), GFP_KERNEL); 903 if (!tt) 904 return NULL; 905 906 tt->func = &backend_func; 907 908 ret = ttm_tt_init(tt, bo, page_flags); 909 if (ret < 0) 910 goto err_ttm_tt_init; 911 912 return tt; 913 914 err_ttm_tt_init: 915 kfree(tt); 916 return NULL; 917 } 918 919 static int bo_driver_init_mem_type(struct ttm_bo_device *bdev, uint32_t type, 920 struct ttm_mem_type_manager *man) 921 { 922 switch (type) { 923 case TTM_PL_SYSTEM: 924 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE; 925 man->available_caching = TTM_PL_MASK_CACHING; 926 man->default_caching = TTM_PL_FLAG_CACHED; 927 break; 928 case TTM_PL_VRAM: 929 man->func = &ttm_bo_manager_func; 930 man->flags = TTM_MEMTYPE_FLAG_FIXED | 931 TTM_MEMTYPE_FLAG_MAPPABLE; 932 man->available_caching = TTM_PL_FLAG_UNCACHED | 933 TTM_PL_FLAG_WC; 934 man->default_caching = TTM_PL_FLAG_WC; 935 break; 936 default: 937 return -EINVAL; 938 } 939 return 0; 940 } 941 942 static void bo_driver_evict_flags(struct ttm_buffer_object *bo, 943 struct ttm_placement *placement) 944 { 945 struct drm_gem_vram_object *gbo; 946 947 /* TTM may pass BOs that are not GEM VRAM BOs. */ 948 if (!drm_is_gem_vram(bo)) 949 return; 950 951 gbo = drm_gem_vram_of_bo(bo); 952 953 drm_gem_vram_bo_driver_evict_flags(gbo, placement); 954 } 955 956 static void bo_driver_move_notify(struct ttm_buffer_object *bo, 957 bool evict, 958 struct ttm_mem_reg *new_mem) 959 { 960 struct drm_gem_vram_object *gbo; 961 962 /* TTM may pass BOs that are not GEM VRAM BOs. */ 963 if (!drm_is_gem_vram(bo)) 964 return; 965 966 gbo = drm_gem_vram_of_bo(bo); 967 968 drm_gem_vram_bo_driver_move_notify(gbo, evict, new_mem); 969 } 970 971 static int bo_driver_io_mem_reserve(struct ttm_bo_device *bdev, 972 struct ttm_mem_reg *mem) 973 { 974 struct ttm_mem_type_manager *man = bdev->man + mem->mem_type; 975 struct drm_vram_mm *vmm = drm_vram_mm_of_bdev(bdev); 976 977 if (!(man->flags & TTM_MEMTYPE_FLAG_MAPPABLE)) 978 return -EINVAL; 979 980 mem->bus.addr = NULL; 981 mem->bus.size = mem->num_pages << PAGE_SHIFT; 982 983 switch (mem->mem_type) { 984 case TTM_PL_SYSTEM: /* nothing to do */ 985 mem->bus.offset = 0; 986 mem->bus.base = 0; 987 mem->bus.is_iomem = false; 988 break; 989 case TTM_PL_VRAM: 990 mem->bus.offset = mem->start << PAGE_SHIFT; 991 mem->bus.base = vmm->vram_base; 992 mem->bus.is_iomem = true; 993 break; 994 default: 995 return -EINVAL; 996 } 997 998 return 0; 999 } 1000 1001 static void bo_driver_io_mem_free(struct ttm_bo_device *bdev, 1002 struct ttm_mem_reg *mem) 1003 { } 1004 1005 static struct ttm_bo_driver bo_driver = { 1006 .ttm_tt_create = bo_driver_ttm_tt_create, 1007 .ttm_tt_populate = ttm_pool_populate, 1008 .ttm_tt_unpopulate = ttm_pool_unpopulate, 1009 .init_mem_type = bo_driver_init_mem_type, 1010 .eviction_valuable = ttm_bo_eviction_valuable, 1011 .evict_flags = bo_driver_evict_flags, 1012 .move_notify = bo_driver_move_notify, 1013 .io_mem_reserve = bo_driver_io_mem_reserve, 1014 .io_mem_free = bo_driver_io_mem_free, 1015 }; 1016 1017 /* 1018 * struct drm_vram_mm 1019 */ 1020 1021 #if defined(CONFIG_DEBUG_FS) 1022 static int drm_vram_mm_debugfs(struct seq_file *m, void *data) 1023 { 1024 struct drm_info_node *node = (struct drm_info_node *) m->private; 1025 struct drm_vram_mm *vmm = node->minor->dev->vram_mm; 1026 struct drm_mm *mm = vmm->bdev.man[TTM_PL_VRAM].priv; 1027 struct drm_printer p = drm_seq_file_printer(m); 1028 1029 spin_lock(&ttm_bo_glob.lru_lock); 1030 drm_mm_print(mm, &p); 1031 spin_unlock(&ttm_bo_glob.lru_lock); 1032 return 0; 1033 } 1034 1035 static const struct drm_info_list drm_vram_mm_debugfs_list[] = { 1036 { "vram-mm", drm_vram_mm_debugfs, 0, NULL }, 1037 }; 1038 #endif 1039 1040 /** 1041 * drm_vram_mm_debugfs_init() - Register VRAM MM debugfs file. 1042 * 1043 * @minor: drm minor device. 1044 * 1045 * Returns: 1046 * 0 on success, or 1047 * a negative error code otherwise. 1048 */ 1049 int drm_vram_mm_debugfs_init(struct drm_minor *minor) 1050 { 1051 int ret = 0; 1052 1053 #if defined(CONFIG_DEBUG_FS) 1054 ret = drm_debugfs_create_files(drm_vram_mm_debugfs_list, 1055 ARRAY_SIZE(drm_vram_mm_debugfs_list), 1056 minor->debugfs_root, minor); 1057 #endif 1058 return ret; 1059 } 1060 EXPORT_SYMBOL(drm_vram_mm_debugfs_init); 1061 1062 static int drm_vram_mm_init(struct drm_vram_mm *vmm, struct drm_device *dev, 1063 uint64_t vram_base, size_t vram_size) 1064 { 1065 int ret; 1066 1067 vmm->vram_base = vram_base; 1068 vmm->vram_size = vram_size; 1069 1070 ret = ttm_bo_device_init(&vmm->bdev, &bo_driver, 1071 dev->anon_inode->i_mapping, 1072 dev->vma_offset_manager, 1073 true); 1074 if (ret) 1075 return ret; 1076 1077 ret = ttm_bo_init_mm(&vmm->bdev, TTM_PL_VRAM, vram_size >> PAGE_SHIFT); 1078 if (ret) 1079 return ret; 1080 1081 return 0; 1082 } 1083 1084 static void drm_vram_mm_cleanup(struct drm_vram_mm *vmm) 1085 { 1086 ttm_bo_device_release(&vmm->bdev); 1087 } 1088 1089 /* 1090 * Helpers for integration with struct drm_device 1091 */ 1092 1093 /** 1094 * drm_vram_helper_alloc_mm - Allocates a device's instance of \ 1095 &struct drm_vram_mm 1096 * @dev: the DRM device 1097 * @vram_base: the base address of the video memory 1098 * @vram_size: the size of the video memory in bytes 1099 * 1100 * Returns: 1101 * The new instance of &struct drm_vram_mm on success, or 1102 * an ERR_PTR()-encoded errno code otherwise. 1103 */ 1104 struct drm_vram_mm *drm_vram_helper_alloc_mm( 1105 struct drm_device *dev, uint64_t vram_base, size_t vram_size) 1106 { 1107 int ret; 1108 1109 if (WARN_ON(dev->vram_mm)) 1110 return dev->vram_mm; 1111 1112 dev->vram_mm = kzalloc(sizeof(*dev->vram_mm), GFP_KERNEL); 1113 if (!dev->vram_mm) 1114 return ERR_PTR(-ENOMEM); 1115 1116 ret = drm_vram_mm_init(dev->vram_mm, dev, vram_base, vram_size); 1117 if (ret) 1118 goto err_kfree; 1119 1120 return dev->vram_mm; 1121 1122 err_kfree: 1123 kfree(dev->vram_mm); 1124 dev->vram_mm = NULL; 1125 return ERR_PTR(ret); 1126 } 1127 EXPORT_SYMBOL(drm_vram_helper_alloc_mm); 1128 1129 /** 1130 * drm_vram_helper_release_mm - Releases a device's instance of \ 1131 &struct drm_vram_mm 1132 * @dev: the DRM device 1133 */ 1134 void drm_vram_helper_release_mm(struct drm_device *dev) 1135 { 1136 if (!dev->vram_mm) 1137 return; 1138 1139 drm_vram_mm_cleanup(dev->vram_mm); 1140 kfree(dev->vram_mm); 1141 dev->vram_mm = NULL; 1142 } 1143 EXPORT_SYMBOL(drm_vram_helper_release_mm); 1144