| .. | .. |
|---|
| 25 | 25 | * Alex Deucher |
|---|
| 26 | 26 | * Jerome Glisse |
|---|
| 27 | 27 | */ |
|---|
| 28 | | -#include <drm/drmP.h> |
|---|
| 28 | + |
|---|
| 29 | +#include <linux/pci.h> |
|---|
| 30 | + |
|---|
| 31 | +#include <drm/drm_debugfs.h> |
|---|
| 32 | +#include <drm/drm_device.h> |
|---|
| 33 | +#include <drm/drm_file.h> |
|---|
| 29 | 34 | #include <drm/radeon_drm.h> |
|---|
| 35 | + |
|---|
| 30 | 36 | #include "radeon.h" |
|---|
| 31 | 37 | |
|---|
| 32 | 38 | void radeon_gem_object_free(struct drm_gem_object *gobj) |
|---|
| .. | .. |
|---|
| 78 | 84 | } |
|---|
| 79 | 85 | return r; |
|---|
| 80 | 86 | } |
|---|
| 81 | | - *obj = &robj->gem_base; |
|---|
| 87 | + *obj = &robj->tbo.base; |
|---|
| 82 | 88 | robj->pid = task_pid_nr(current); |
|---|
| 83 | 89 | |
|---|
| 84 | 90 | mutex_lock(&rdev->gem.mutex); |
|---|
| .. | .. |
|---|
| 109 | 115 | } |
|---|
| 110 | 116 | if (domain == RADEON_GEM_DOMAIN_CPU) { |
|---|
| 111 | 117 | /* Asking for cpu access wait for object idle */ |
|---|
| 112 | | - r = reservation_object_wait_timeout_rcu(robj->tbo.resv, true, true, 30 * HZ); |
|---|
| 118 | + r = dma_resv_wait_timeout_rcu(robj->tbo.base.resv, true, true, 30 * HZ); |
|---|
| 113 | 119 | if (!r) |
|---|
| 114 | 120 | r = -EBUSY; |
|---|
| 115 | 121 | |
|---|
| .. | .. |
|---|
| 218 | 224 | { |
|---|
| 219 | 225 | struct radeon_device *rdev = dev->dev_private; |
|---|
| 220 | 226 | struct drm_radeon_gem_info *args = data; |
|---|
| 221 | | - struct ttm_mem_type_manager *man; |
|---|
| 227 | + struct ttm_resource_manager *man; |
|---|
| 222 | 228 | |
|---|
| 223 | | - man = &rdev->mman.bdev.man[TTM_PL_VRAM]; |
|---|
| 229 | + man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM); |
|---|
| 224 | 230 | |
|---|
| 225 | 231 | args->vram_size = (u64)man->size << PAGE_SHIFT; |
|---|
| 226 | 232 | args->vram_visible = rdev->mc.visible_vram_size; |
|---|
| .. | .. |
|---|
| 269 | 275 | } |
|---|
| 270 | 276 | r = drm_gem_handle_create(filp, gobj, &handle); |
|---|
| 271 | 277 | /* drop reference from allocate - handle holds it now */ |
|---|
| 272 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 278 | + drm_gem_object_put(gobj); |
|---|
| 273 | 279 | if (r) { |
|---|
| 274 | 280 | up_read(&rdev->exclusive_lock); |
|---|
| 275 | 281 | r = radeon_gem_handle_lockup(rdev, r); |
|---|
| .. | .. |
|---|
| 325 | 331 | goto handle_lockup; |
|---|
| 326 | 332 | |
|---|
| 327 | 333 | bo = gem_to_radeon_bo(gobj); |
|---|
| 328 | | - r = radeon_ttm_tt_set_userptr(bo->tbo.ttm, args->addr, args->flags); |
|---|
| 334 | + r = radeon_ttm_tt_set_userptr(rdev, bo->tbo.ttm, args->addr, args->flags); |
|---|
| 329 | 335 | if (r) |
|---|
| 330 | 336 | goto release_object; |
|---|
| 331 | 337 | |
|---|
| .. | .. |
|---|
| 336 | 342 | } |
|---|
| 337 | 343 | |
|---|
| 338 | 344 | if (args->flags & RADEON_GEM_USERPTR_VALIDATE) { |
|---|
| 339 | | - down_read(¤t->mm->mmap_sem); |
|---|
| 345 | + mmap_read_lock(current->mm); |
|---|
| 340 | 346 | r = radeon_bo_reserve(bo, true); |
|---|
| 341 | 347 | if (r) { |
|---|
| 342 | | - up_read(¤t->mm->mmap_sem); |
|---|
| 348 | + mmap_read_unlock(current->mm); |
|---|
| 343 | 349 | goto release_object; |
|---|
| 344 | 350 | } |
|---|
| 345 | 351 | |
|---|
| 346 | 352 | radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_GTT); |
|---|
| 347 | 353 | r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); |
|---|
| 348 | 354 | radeon_bo_unreserve(bo); |
|---|
| 349 | | - up_read(¤t->mm->mmap_sem); |
|---|
| 355 | + mmap_read_unlock(current->mm); |
|---|
| 350 | 356 | if (r) |
|---|
| 351 | 357 | goto release_object; |
|---|
| 352 | 358 | } |
|---|
| 353 | 359 | |
|---|
| 354 | 360 | r = drm_gem_handle_create(filp, gobj, &handle); |
|---|
| 355 | 361 | /* drop reference from allocate - handle holds it now */ |
|---|
| 356 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 362 | + drm_gem_object_put(gobj); |
|---|
| 357 | 363 | if (r) |
|---|
| 358 | 364 | goto handle_lockup; |
|---|
| 359 | 365 | |
|---|
| .. | .. |
|---|
| 362 | 368 | return 0; |
|---|
| 363 | 369 | |
|---|
| 364 | 370 | release_object: |
|---|
| 365 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 371 | + drm_gem_object_put(gobj); |
|---|
| 366 | 372 | |
|---|
| 367 | 373 | handle_lockup: |
|---|
| 368 | 374 | up_read(&rdev->exclusive_lock); |
|---|
| .. | .. |
|---|
| 396 | 402 | |
|---|
| 397 | 403 | r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain); |
|---|
| 398 | 404 | |
|---|
| 399 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 405 | + drm_gem_object_put(gobj); |
|---|
| 400 | 406 | up_read(&rdev->exclusive_lock); |
|---|
| 401 | 407 | r = radeon_gem_handle_lockup(robj->rdev, r); |
|---|
| 402 | 408 | return r; |
|---|
| .. | .. |
|---|
| 414 | 420 | return -ENOENT; |
|---|
| 415 | 421 | } |
|---|
| 416 | 422 | robj = gem_to_radeon_bo(gobj); |
|---|
| 417 | | - if (radeon_ttm_tt_has_userptr(robj->tbo.ttm)) { |
|---|
| 418 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 423 | + if (radeon_ttm_tt_has_userptr(robj->rdev, robj->tbo.ttm)) { |
|---|
| 424 | + drm_gem_object_put(gobj); |
|---|
| 419 | 425 | return -EPERM; |
|---|
| 420 | 426 | } |
|---|
| 421 | 427 | *offset_p = radeon_bo_mmap_offset(robj); |
|---|
| 422 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 428 | + drm_gem_object_put(gobj); |
|---|
| 423 | 429 | return 0; |
|---|
| 424 | 430 | } |
|---|
| 425 | 431 | |
|---|
| .. | .. |
|---|
| 446 | 452 | } |
|---|
| 447 | 453 | robj = gem_to_radeon_bo(gobj); |
|---|
| 448 | 454 | |
|---|
| 449 | | - r = reservation_object_test_signaled_rcu(robj->tbo.resv, true); |
|---|
| 455 | + r = dma_resv_test_signaled_rcu(robj->tbo.base.resv, true); |
|---|
| 450 | 456 | if (r == 0) |
|---|
| 451 | 457 | r = -EBUSY; |
|---|
| 452 | 458 | else |
|---|
| .. | .. |
|---|
| 454 | 460 | |
|---|
| 455 | 461 | cur_placement = READ_ONCE(robj->tbo.mem.mem_type); |
|---|
| 456 | 462 | args->domain = radeon_mem_type_to_domain(cur_placement); |
|---|
| 457 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 463 | + drm_gem_object_put(gobj); |
|---|
| 458 | 464 | return r; |
|---|
| 459 | 465 | } |
|---|
| 460 | 466 | |
|---|
| .. | .. |
|---|
| 475 | 481 | } |
|---|
| 476 | 482 | robj = gem_to_radeon_bo(gobj); |
|---|
| 477 | 483 | |
|---|
| 478 | | - ret = reservation_object_wait_timeout_rcu(robj->tbo.resv, true, true, 30 * HZ); |
|---|
| 484 | + ret = dma_resv_wait_timeout_rcu(robj->tbo.base.resv, true, true, 30 * HZ); |
|---|
| 479 | 485 | if (ret == 0) |
|---|
| 480 | 486 | r = -EBUSY; |
|---|
| 481 | 487 | else if (ret < 0) |
|---|
| .. | .. |
|---|
| 486 | 492 | if (rdev->asic->mmio_hdp_flush && |
|---|
| 487 | 493 | radeon_mem_type_to_domain(cur_placement) == RADEON_GEM_DOMAIN_VRAM) |
|---|
| 488 | 494 | robj->rdev->asic->mmio_hdp_flush(rdev); |
|---|
| 489 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 495 | + drm_gem_object_put(gobj); |
|---|
| 490 | 496 | r = radeon_gem_handle_lockup(rdev, r); |
|---|
| 491 | 497 | return r; |
|---|
| 492 | 498 | } |
|---|
| .. | .. |
|---|
| 505 | 511 | return -ENOENT; |
|---|
| 506 | 512 | robj = gem_to_radeon_bo(gobj); |
|---|
| 507 | 513 | r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch); |
|---|
| 508 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 514 | + drm_gem_object_put(gobj); |
|---|
| 509 | 515 | return r; |
|---|
| 510 | 516 | } |
|---|
| 511 | 517 | |
|---|
| .. | .. |
|---|
| 528 | 534 | radeon_bo_get_tiling_flags(rbo, &args->tiling_flags, &args->pitch); |
|---|
| 529 | 535 | radeon_bo_unreserve(rbo); |
|---|
| 530 | 536 | out: |
|---|
| 531 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 537 | + drm_gem_object_put(gobj); |
|---|
| 532 | 538 | return r; |
|---|
| 533 | 539 | } |
|---|
| 534 | 540 | |
|---|
| .. | .. |
|---|
| 554 | 560 | INIT_LIST_HEAD(&list); |
|---|
| 555 | 561 | |
|---|
| 556 | 562 | tv.bo = &bo_va->bo->tbo; |
|---|
| 557 | | - tv.shared = true; |
|---|
| 563 | + tv.num_shared = 1; |
|---|
| 558 | 564 | list_add(&tv.head, &list); |
|---|
| 559 | 565 | |
|---|
| 560 | 566 | vm_bos = radeon_vm_get_bos(rdev, bo_va->vm, &list); |
|---|
| .. | .. |
|---|
| 662 | 668 | r = radeon_bo_reserve(rbo, false); |
|---|
| 663 | 669 | if (r) { |
|---|
| 664 | 670 | args->operation = RADEON_VA_RESULT_ERROR; |
|---|
| 665 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 671 | + drm_gem_object_put(gobj); |
|---|
| 666 | 672 | return r; |
|---|
| 667 | 673 | } |
|---|
| 668 | 674 | bo_va = radeon_vm_bo_find(&fpriv->vm, rbo); |
|---|
| 669 | 675 | if (!bo_va) { |
|---|
| 670 | 676 | args->operation = RADEON_VA_RESULT_ERROR; |
|---|
| 671 | 677 | radeon_bo_unreserve(rbo); |
|---|
| 672 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 678 | + drm_gem_object_put(gobj); |
|---|
| 673 | 679 | return -ENOENT; |
|---|
| 674 | 680 | } |
|---|
| 675 | 681 | |
|---|
| .. | .. |
|---|
| 696 | 702 | args->operation = RADEON_VA_RESULT_ERROR; |
|---|
| 697 | 703 | } |
|---|
| 698 | 704 | out: |
|---|
| 699 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 705 | + drm_gem_object_put(gobj); |
|---|
| 700 | 706 | return r; |
|---|
| 701 | 707 | } |
|---|
| 702 | 708 | |
|---|
| .. | .. |
|---|
| 715 | 721 | robj = gem_to_radeon_bo(gobj); |
|---|
| 716 | 722 | |
|---|
| 717 | 723 | r = -EPERM; |
|---|
| 718 | | - if (radeon_ttm_tt_has_userptr(robj->tbo.ttm)) |
|---|
| 724 | + if (radeon_ttm_tt_has_userptr(robj->rdev, robj->tbo.ttm)) |
|---|
| 719 | 725 | goto out; |
|---|
| 720 | 726 | |
|---|
| 721 | 727 | r = radeon_bo_reserve(robj, false); |
|---|
| .. | .. |
|---|
| 737 | 743 | |
|---|
| 738 | 744 | radeon_bo_unreserve(robj); |
|---|
| 739 | 745 | out: |
|---|
| 740 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 746 | + drm_gem_object_put(gobj); |
|---|
| 741 | 747 | return r; |
|---|
| 742 | 748 | } |
|---|
| 743 | 749 | |
|---|
| .. | .. |
|---|
| 763 | 769 | |
|---|
| 764 | 770 | r = drm_gem_handle_create(file_priv, gobj, &handle); |
|---|
| 765 | 771 | /* drop reference from allocate - handle holds it now */ |
|---|
| 766 | | - drm_gem_object_put_unlocked(gobj); |
|---|
| 772 | + drm_gem_object_put(gobj); |
|---|
| 767 | 773 | if (r) { |
|---|
| 768 | 774 | return r; |
|---|
| 769 | 775 | } |
|---|