1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright © 2021 Intel Corporation 4 */ 5 6 #include "xe_vm.h" 7 8 #include <linux/dma-fence-array.h> 9 #include <linux/nospec.h> 10 11 #include <drm/drm_drv.h> 12 #include <drm/drm_exec.h> 13 #include <drm/drm_print.h> 14 #include <drm/ttm/ttm_tt.h> 15 #include <uapi/drm/xe_drm.h> 16 #include <linux/ascii85.h> 17 #include <linux/delay.h> 18 #include <linux/kthread.h> 19 #include <linux/mm.h> 20 #include <linux/swap.h> 21 22 #include <generated/xe_wa_oob.h> 23 24 #include "regs/xe_gtt_defs.h" 25 #include "xe_assert.h" 26 #include "xe_bo.h" 27 #include "xe_device.h" 28 #include "xe_drm_client.h" 29 #include "xe_exec_queue.h" 30 #include "xe_gt.h" 31 #include "xe_migrate.h" 32 #include "xe_pat.h" 33 #include "xe_pm.h" 34 #include "xe_preempt_fence.h" 35 #include "xe_pt.h" 36 #include "xe_pxp.h" 37 #include "xe_sriov_vf.h" 38 #include "xe_svm.h" 39 #include "xe_sync.h" 40 #include "xe_tile.h" 41 #include "xe_tlb_inval.h" 42 #include "xe_trace_bo.h" 43 #include "xe_vm_madvise.h" 44 #include "xe_wa.h" 45 46 static struct drm_gem_object *xe_vm_obj(struct xe_vm *vm) 47 { 48 return vm->gpuvm.r_obj; 49 } 50 51 /** 52 * xe_vm_drm_exec_lock() - Lock the vm's resv with a drm_exec transaction 53 * @vm: The vm whose resv is to be locked. 54 * @exec: The drm_exec transaction. 55 * 56 * Helper to lock the vm's resv as part of a drm_exec transaction. 57 * 58 * Return: %0 on success. See drm_exec_lock_obj() for error codes. 59 */ 60 int xe_vm_drm_exec_lock(struct xe_vm *vm, struct drm_exec *exec) 61 { 62 return drm_exec_lock_obj(exec, xe_vm_obj(vm)); 63 } 64 65 static bool preempt_fences_waiting(struct xe_vm *vm) 66 { 67 struct xe_exec_queue *q; 68 69 lockdep_assert_held(&vm->lock); 70 xe_vm_assert_held(vm); 71 72 list_for_each_entry(q, &vm->preempt.exec_queues, lr.link) { 73 if (!q->lr.pfence || 74 test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, 75 &q->lr.pfence->flags)) { 76 return true; 77 } 78 } 79 80 return false; 81 } 82 83 static void free_preempt_fences(struct list_head *list) 84 { 85 struct list_head *link, *next; 86 87 list_for_each_safe(link, next, list) 88 xe_preempt_fence_free(to_preempt_fence_from_link(link)); 89 } 90 91 static int alloc_preempt_fences(struct xe_vm *vm, struct list_head *list, 92 unsigned int *count) 93 { 94 lockdep_assert_held(&vm->lock); 95 xe_vm_assert_held(vm); 96 97 if (*count >= vm->preempt.num_exec_queues) 98 return 0; 99 100 for (; *count < vm->preempt.num_exec_queues; ++(*count)) { 101 struct xe_preempt_fence *pfence = xe_preempt_fence_alloc(); 102 103 if (IS_ERR(pfence)) 104 return PTR_ERR(pfence); 105 106 list_move_tail(xe_preempt_fence_link(pfence), list); 107 } 108 109 return 0; 110 } 111 112 static int wait_for_existing_preempt_fences(struct xe_vm *vm) 113 { 114 struct xe_exec_queue *q; 115 bool vf_migration = IS_SRIOV_VF(vm->xe) && 116 xe_sriov_vf_migration_supported(vm->xe); 117 signed long wait_time = vf_migration ? HZ / 5 : MAX_SCHEDULE_TIMEOUT; 118 119 xe_vm_assert_held(vm); 120 121 list_for_each_entry(q, &vm->preempt.exec_queues, lr.link) { 122 if (q->lr.pfence) { 123 long timeout; 124 125 timeout = dma_fence_wait_timeout(q->lr.pfence, false, 126 wait_time); 127 if (!timeout) { 128 xe_assert(vm->xe, vf_migration); 129 return -EAGAIN; 130 } 131 132 /* Only -ETIME on fence indicates VM needs to be killed */ 133 if (timeout < 0 || q->lr.pfence->error == -ETIME) 134 return -ETIME; 135 136 dma_fence_put(q->lr.pfence); 137 q->lr.pfence = NULL; 138 } 139 } 140 141 return 0; 142 } 143 144 static bool xe_vm_is_idle(struct xe_vm *vm) 145 { 146 struct xe_exec_queue *q; 147 148 xe_vm_assert_held(vm); 149 list_for_each_entry(q, &vm->preempt.exec_queues, lr.link) { 150 if (!xe_exec_queue_is_idle(q)) 151 return false; 152 } 153 154 return true; 155 } 156 157 static void arm_preempt_fences(struct xe_vm *vm, struct list_head *list) 158 { 159 struct list_head *link; 160 struct xe_exec_queue *q; 161 162 list_for_each_entry(q, &vm->preempt.exec_queues, lr.link) { 163 struct dma_fence *fence; 164 165 link = list->next; 166 xe_assert(vm->xe, link != list); 167 168 fence = xe_preempt_fence_arm(to_preempt_fence_from_link(link), 169 q, q->lr.context, 170 ++q->lr.seqno); 171 dma_fence_put(q->lr.pfence); 172 q->lr.pfence = fence; 173 } 174 } 175 176 static int add_preempt_fences(struct xe_vm *vm, struct xe_bo *bo) 177 { 178 struct xe_exec_queue *q; 179 int err; 180 181 xe_bo_assert_held(bo); 182 183 if (!vm->preempt.num_exec_queues) 184 return 0; 185 186 err = dma_resv_reserve_fences(bo->ttm.base.resv, vm->preempt.num_exec_queues); 187 if (err) 188 return err; 189 190 list_for_each_entry(q, &vm->preempt.exec_queues, lr.link) 191 if (q->lr.pfence) { 192 dma_resv_add_fence(bo->ttm.base.resv, 193 q->lr.pfence, 194 DMA_RESV_USAGE_BOOKKEEP); 195 } 196 197 return 0; 198 } 199 200 static void resume_and_reinstall_preempt_fences(struct xe_vm *vm, 201 struct drm_exec *exec) 202 { 203 struct xe_exec_queue *q; 204 205 lockdep_assert_held(&vm->lock); 206 xe_vm_assert_held(vm); 207 208 list_for_each_entry(q, &vm->preempt.exec_queues, lr.link) { 209 /* 210 * Only resume queues whose suspend() actually succeeded. A 211 * failed suspend() (e.g. killed/banned/wedged) leaves the queue 212 * un-suspended, so it must not be resumed. 213 * 214 * Also skip queues that have since been reset/killed/banned/ 215 * wedged: their suspend may not have completed (suspend_pending 216 * can still be set, e.g. a preempt fence signalled with -ENOENT 217 * without waiting), so resuming would trip the !suspend_pending 218 * assert in the backend. Such queues are being torn down anyway, 219 * so leave them marked suspended and let teardown resolve their 220 * state. 221 */ 222 if (READ_ONCE(q->lr.suspended) && !q->ops->reset_status(q)) { 223 WRITE_ONCE(q->lr.suspended, false); 224 q->ops->resume(q); 225 } 226 227 drm_gpuvm_resv_add_fence(&vm->gpuvm, exec, q->lr.pfence, 228 DMA_RESV_USAGE_BOOKKEEP, DMA_RESV_USAGE_BOOKKEEP); 229 } 230 } 231 232 int xe_vm_add_compute_exec_queue(struct xe_vm *vm, struct xe_exec_queue *q) 233 { 234 struct drm_gpuvm_exec vm_exec = { 235 .vm = &vm->gpuvm, 236 .flags = DRM_EXEC_INTERRUPTIBLE_WAIT, 237 .num_fences = 1, 238 }; 239 struct drm_exec *exec = &vm_exec.exec; 240 struct xe_validation_ctx ctx; 241 struct dma_fence *pfence; 242 int err; 243 bool wait; 244 245 xe_assert(vm->xe, xe_vm_in_preempt_fence_mode(vm)); 246 247 down_write(&vm->lock); 248 err = xe_validation_exec_lock(&ctx, &vm_exec, &vm->xe->val); 249 if (err) 250 goto out_up_write; 251 252 pfence = xe_preempt_fence_create(q, q->lr.context, 253 ++q->lr.seqno); 254 if (IS_ERR(pfence)) { 255 err = PTR_ERR(pfence); 256 goto out_fini; 257 } 258 259 list_add(&q->lr.link, &vm->preempt.exec_queues); 260 ++vm->preempt.num_exec_queues; 261 q->lr.pfence = pfence; 262 263 xe_svm_notifier_lock(vm); 264 265 drm_gpuvm_resv_add_fence(&vm->gpuvm, exec, pfence, 266 DMA_RESV_USAGE_BOOKKEEP, DMA_RESV_USAGE_BOOKKEEP); 267 268 /* 269 * Check to see if a preemption on VM is in flight or userptr 270 * invalidation, if so trigger this preempt fence to sync state with 271 * other preempt fences on the VM. 272 */ 273 wait = __xe_vm_userptr_needs_repin(vm) || preempt_fences_waiting(vm); 274 if (wait) 275 dma_fence_enable_signaling(pfence); 276 277 xe_svm_notifier_unlock(vm); 278 279 out_fini: 280 xe_validation_ctx_fini(&ctx); 281 out_up_write: 282 up_write(&vm->lock); 283 284 return err; 285 } 286 ALLOW_ERROR_INJECTION(xe_vm_add_compute_exec_queue, ERRNO); 287 288 /** 289 * xe_vm_remove_compute_exec_queue() - Remove compute exec queue from VM 290 * @vm: The VM. 291 * @q: The exec_queue 292 * 293 * Note that this function might be called multiple times on the same queue. 294 */ 295 void xe_vm_remove_compute_exec_queue(struct xe_vm *vm, struct xe_exec_queue *q) 296 { 297 if (!xe_vm_in_preempt_fence_mode(vm)) 298 return; 299 300 down_write(&vm->lock); 301 if (!list_empty(&q->lr.link)) { 302 list_del_init(&q->lr.link); 303 --vm->preempt.num_exec_queues; 304 } 305 if (q->lr.pfence) { 306 dma_fence_enable_signaling(q->lr.pfence); 307 dma_fence_put(q->lr.pfence); 308 q->lr.pfence = NULL; 309 } 310 up_write(&vm->lock); 311 } 312 313 #define XE_VM_REBIND_RETRY_TIMEOUT_MS 1000 314 315 /** 316 * xe_vm_kill() - VM Kill 317 * @vm: The VM. 318 * @unlocked: Flag indicates the VM's dma-resv is not held 319 * 320 * Kill the VM by setting banned flag indicated VM is no longer available for 321 * use. If in preempt fence mode, also kill all exec queue attached to the VM. 322 */ 323 void xe_vm_kill(struct xe_vm *vm, bool unlocked) 324 { 325 struct xe_exec_queue *q; 326 327 lockdep_assert_held(&vm->lock); 328 329 if (unlocked) 330 xe_vm_lock(vm, false); 331 332 vm->flags |= XE_VM_FLAG_BANNED; 333 trace_xe_vm_kill(vm); 334 335 list_for_each_entry(q, &vm->preempt.exec_queues, lr.link) 336 q->ops->kill(q); 337 338 if (unlocked) 339 xe_vm_unlock(vm); 340 341 /* TODO: Inform user the VM is banned */ 342 } 343 344 static int xe_gpuvm_validate(struct drm_gpuvm_bo *vm_bo, struct drm_exec *exec) 345 { 346 struct xe_vm *vm = gpuvm_to_vm(vm_bo->vm); 347 struct xe_bo *bo = gem_to_xe_bo(vm_bo->obj); 348 struct drm_gpuva *gpuva; 349 int ret; 350 351 lockdep_assert_held(&vm->lock); 352 drm_gpuvm_bo_for_each_va(gpuva, vm_bo) 353 list_move_tail(&gpuva_to_vma(gpuva)->combined_links.rebind, 354 &vm->rebind_list); 355 356 /* Skip re-populating purged BOs, rebind maps scratch pages. */ 357 if (xe_bo_is_purged(bo)) { 358 vm_bo->evicted = false; 359 return 0; 360 } 361 362 if (!try_wait_for_completion(&vm->xe->pm_block)) 363 return -EAGAIN; 364 365 ret = xe_bo_validate(bo, vm, false, exec); 366 if (ret) 367 return ret; 368 369 vm_bo->evicted = false; 370 return 0; 371 } 372 373 /** 374 * xe_vm_validate_rebind() - Validate buffer objects and rebind vmas 375 * @vm: The vm for which we are rebinding. 376 * @exec: The struct drm_exec with the locked GEM objects. 377 * @num_fences: The number of fences to reserve for the operation, not 378 * including rebinds and validations. 379 * 380 * Validates all evicted gem objects and rebinds their vmas. Note that 381 * rebindings may cause evictions and hence the validation-rebind 382 * sequence is rerun until there are no more objects to validate. 383 * 384 * Return: 0 on success, negative error code on error. In particular, 385 * may return -EINTR or -ERESTARTSYS if interrupted, and -EDEADLK if 386 * the drm_exec transaction needs to be restarted. 387 */ 388 int xe_vm_validate_rebind(struct xe_vm *vm, struct drm_exec *exec, 389 unsigned int num_fences) 390 { 391 struct drm_gem_object *obj; 392 int ret; 393 394 do { 395 ret = drm_gpuvm_validate(&vm->gpuvm, exec); 396 if (ret) 397 return ret; 398 399 ret = xe_vm_rebind(vm, false); 400 if (ret) 401 return ret; 402 } while (!list_empty(&vm->gpuvm.evict.list)); 403 404 drm_exec_for_each_locked_object(exec, obj) { 405 ret = dma_resv_reserve_fences(obj->resv, num_fences); 406 if (ret) 407 return ret; 408 } 409 410 return 0; 411 } 412 413 static int xe_preempt_work_begin(struct drm_exec *exec, struct xe_vm *vm, 414 bool *done) 415 { 416 int err; 417 418 err = drm_gpuvm_prepare_vm(&vm->gpuvm, exec, 0); 419 if (err) 420 return err; 421 422 if (xe_vm_is_idle(vm)) { 423 vm->preempt.rebind_deactivated = true; 424 *done = true; 425 return 0; 426 } 427 428 if (!preempt_fences_waiting(vm)) { 429 *done = true; 430 return 0; 431 } 432 433 err = drm_gpuvm_prepare_objects(&vm->gpuvm, exec, 0); 434 if (err) 435 return err; 436 437 err = wait_for_existing_preempt_fences(vm); 438 if (err) 439 return err; 440 441 /* 442 * Add validation and rebinding to the locking loop since both can 443 * cause evictions which may require blocing dma_resv locks. 444 * The fence reservation here is intended for the new preempt fences 445 * we attach at the end of the rebind work. 446 */ 447 return xe_vm_validate_rebind(vm, exec, vm->preempt.num_exec_queues); 448 } 449 450 static bool vm_suspend_rebind_worker(struct xe_vm *vm) 451 { 452 struct xe_device *xe = vm->xe; 453 bool ret = false; 454 455 mutex_lock(&xe->rebind_resume_lock); 456 if (!try_wait_for_completion(&vm->xe->pm_block)) { 457 ret = true; 458 list_move_tail(&vm->preempt.pm_activate_link, &xe->rebind_resume_list); 459 } 460 mutex_unlock(&xe->rebind_resume_lock); 461 462 return ret; 463 } 464 465 /** 466 * xe_vm_resume_rebind_worker() - Resume the rebind worker. 467 * @vm: The vm whose preempt worker to resume. 468 * 469 * Resume a preempt worker that was previously suspended by 470 * vm_suspend_rebind_worker(). 471 */ 472 void xe_vm_resume_rebind_worker(struct xe_vm *vm) 473 { 474 queue_work(vm->xe->ordered_wq, &vm->preempt.rebind_work); 475 } 476 477 static void preempt_rebind_work_func(struct work_struct *w) 478 { 479 struct xe_vm *vm = container_of(w, struct xe_vm, preempt.rebind_work); 480 struct xe_validation_ctx ctx; 481 struct drm_exec exec; 482 unsigned int fence_count = 0; 483 LIST_HEAD(preempt_fences); 484 int err = 0; 485 long wait; 486 int __maybe_unused tries = 0; 487 488 xe_assert(vm->xe, xe_vm_in_preempt_fence_mode(vm)); 489 trace_xe_vm_rebind_worker_enter(vm); 490 491 down_write(&vm->lock); 492 493 if (xe_vm_is_closed_or_banned(vm)) { 494 up_write(&vm->lock); 495 trace_xe_vm_rebind_worker_exit(vm); 496 return; 497 } 498 499 retry: 500 if (!try_wait_for_completion(&vm->xe->pm_block) && vm_suspend_rebind_worker(vm)) { 501 up_write(&vm->lock); 502 /* We don't actually block but don't make progress. */ 503 xe_pm_might_block_on_suspend(); 504 return; 505 } 506 507 if (xe_vm_userptr_check_repin(vm)) { 508 err = xe_vm_userptr_pin(vm); 509 if (err) 510 goto out_unlock_outer; 511 } 512 513 err = xe_validation_ctx_init(&ctx, &vm->xe->val, &exec, 514 (struct xe_val_flags) {.interruptible = true}); 515 if (err) 516 goto out_unlock_outer; 517 518 drm_exec_until_all_locked(&exec) { 519 bool done = false; 520 521 err = xe_preempt_work_begin(&exec, vm, &done); 522 drm_exec_retry_on_contention(&exec); 523 xe_validation_retry_on_oom(&ctx, &err); 524 if (err || done) { 525 xe_validation_ctx_fini(&ctx); 526 goto out_unlock_outer; 527 } 528 } 529 530 err = alloc_preempt_fences(vm, &preempt_fences, &fence_count); 531 if (err) 532 goto out_unlock; 533 534 xe_vm_set_validation_exec(vm, &exec); 535 err = xe_vm_rebind(vm, true); 536 xe_vm_set_validation_exec(vm, NULL); 537 if (err) 538 goto out_unlock; 539 540 /* Wait on rebinds and munmap style VM unbinds */ 541 wait = dma_resv_wait_timeout(xe_vm_resv(vm), 542 DMA_RESV_USAGE_KERNEL, 543 false, MAX_SCHEDULE_TIMEOUT); 544 if (wait <= 0) { 545 err = -ETIME; 546 goto out_unlock; 547 } 548 549 #define retry_required(__tries, __vm) \ 550 (IS_ENABLED(CONFIG_DRM_XE_USERPTR_INVAL_INJECT) ? \ 551 (!(__tries)++ || __xe_vm_userptr_needs_repin(__vm)) : \ 552 __xe_vm_userptr_needs_repin(__vm)) 553 554 xe_svm_notifier_lock(vm); 555 if (retry_required(tries, vm)) { 556 xe_svm_notifier_unlock(vm); 557 err = -EAGAIN; 558 goto out_unlock; 559 } 560 561 #undef retry_required 562 563 spin_lock(&vm->xe->ttm.lru_lock); 564 ttm_lru_bulk_move_tail(&vm->lru_bulk_move); 565 spin_unlock(&vm->xe->ttm.lru_lock); 566 567 /* Point of no return. */ 568 arm_preempt_fences(vm, &preempt_fences); 569 resume_and_reinstall_preempt_fences(vm, &exec); 570 xe_svm_notifier_unlock(vm); 571 572 out_unlock: 573 xe_validation_ctx_fini(&ctx); 574 out_unlock_outer: 575 if (err == -EAGAIN) { 576 trace_xe_vm_rebind_worker_retry(vm); 577 578 /* 579 * We can't block in workers on a VF which supports migration 580 * given this can block the VF post-migration workers from 581 * getting scheduled. 582 */ 583 if (IS_SRIOV_VF(vm->xe) && 584 xe_sriov_vf_migration_supported(vm->xe)) { 585 up_write(&vm->lock); 586 xe_vm_queue_rebind_worker(vm); 587 return; 588 } 589 590 goto retry; 591 } 592 593 if (err) { 594 drm_warn(&vm->xe->drm, "VM worker error: %d\n", err); 595 xe_vm_kill(vm, true); 596 } 597 up_write(&vm->lock); 598 599 free_preempt_fences(&preempt_fences); 600 601 trace_xe_vm_rebind_worker_exit(vm); 602 } 603 604 /** 605 * xe_vm_add_fault_entry_pf() - Add pagefault to vm fault list 606 * @vm: The VM. 607 * @pf: The pagefault. 608 * 609 * This function takes the data from the pagefault @pf and saves it to @vm->faults.list. 610 * 611 * The function exits silently if the list is full, and reports a warning if the pagefault 612 * could not be saved to the list. 613 */ 614 void xe_vm_add_fault_entry_pf(struct xe_vm *vm, struct xe_pagefault *pf) 615 { 616 struct xe_vm_fault_entry *e; 617 struct xe_hw_engine *hwe; 618 619 /* Do not report faults on reserved engines */ 620 hwe = xe_gt_hw_engine(pf->gt, pf->consumer.engine_class, 621 pf->consumer.engine_instance, false); 622 if (!hwe || xe_hw_engine_is_reserved(hwe)) 623 return; 624 625 e = kzalloc_obj(*e); 626 if (!e) { 627 drm_warn(&vm->xe->drm, 628 "Could not allocate memory for fault!\n"); 629 return; 630 } 631 632 guard(spinlock)(&vm->faults.lock); 633 634 /* 635 * Limit the number of faults in the fault list to prevent 636 * memory overuse. 637 */ 638 if (vm->faults.len >= MAX_FAULTS_SAVED_PER_VM) { 639 kfree(e); 640 return; 641 } 642 643 e->address = pf->consumer.page_addr; 644 /* 645 * TODO: 646 * Address precision is currently always SZ_4K, but this may change 647 * in the future. 648 */ 649 e->address_precision = SZ_4K; 650 e->access_type = pf->consumer.access_type; 651 e->fault_type = FIELD_GET(XE_PAGEFAULT_TYPE_MASK, 652 pf->consumer.fault_type_level); 653 e->fault_level = FIELD_GET(XE_PAGEFAULT_LEVEL_MASK, 654 pf->consumer.fault_type_level); 655 656 list_add_tail(&e->list, &vm->faults.list); 657 vm->faults.len++; 658 } 659 660 static void xe_vm_clear_fault_entries(struct xe_vm *vm) 661 { 662 struct xe_vm_fault_entry *e, *tmp; 663 664 guard(spinlock)(&vm->faults.lock); 665 list_for_each_entry_safe(e, tmp, &vm->faults.list, list) { 666 list_del(&e->list); 667 kfree(e); 668 } 669 vm->faults.len = 0; 670 } 671 672 static int xe_vma_ops_alloc(struct xe_vma_ops *vops, bool array_of_binds) 673 { 674 int i; 675 676 for (i = 0; i < XE_MAX_TILES_PER_DEVICE; ++i) { 677 if (!vops->pt_update_ops[i].num_ops) 678 continue; 679 680 vops->pt_update_ops[i].ops = 681 kmalloc_objs(*vops->pt_update_ops[i].ops, 682 vops->pt_update_ops[i].num_ops, 683 GFP_KERNEL | __GFP_RETRY_MAYFAIL | __GFP_NOWARN); 684 if (!vops->pt_update_ops[i].ops) 685 return array_of_binds ? -ENOBUFS : -ENOMEM; 686 } 687 688 return 0; 689 } 690 ALLOW_ERROR_INJECTION(xe_vma_ops_alloc, ERRNO); 691 692 static void xe_vma_svm_prefetch_op_fini(struct xe_vma_op *op) 693 { 694 struct xe_vma *vma; 695 696 vma = gpuva_to_vma(op->base.prefetch.va); 697 698 if (op->base.op == DRM_GPUVA_OP_PREFETCH && xe_vma_is_cpu_addr_mirror(vma)) 699 xa_destroy(&op->prefetch_range.range); 700 } 701 702 static void xe_vma_svm_prefetch_ops_fini(struct xe_vma_ops *vops) 703 { 704 struct xe_vma_op *op; 705 706 if (!(vops->flags & XE_VMA_OPS_FLAG_HAS_SVM_PREFETCH)) 707 return; 708 709 list_for_each_entry(op, &vops->list, link) 710 xe_vma_svm_prefetch_op_fini(op); 711 } 712 713 static void xe_vma_ops_fini(struct xe_vma_ops *vops) 714 { 715 int i; 716 717 xe_vma_svm_prefetch_ops_fini(vops); 718 719 for (i = 0; i < XE_MAX_TILES_PER_DEVICE; ++i) 720 kfree(vops->pt_update_ops[i].ops); 721 } 722 723 static void xe_vma_ops_incr_pt_update_ops(struct xe_vma_ops *vops, u8 tile_mask, int inc_val) 724 { 725 int i; 726 727 if (!inc_val) 728 return; 729 730 for (i = 0; i < XE_MAX_TILES_PER_DEVICE; ++i) 731 if (BIT(i) & tile_mask) 732 vops->pt_update_ops[i].num_ops += inc_val; 733 } 734 735 #define XE_VMA_CREATE_MASK ( \ 736 XE_VMA_READ_ONLY | \ 737 XE_VMA_DUMPABLE | \ 738 XE_VMA_SYSTEM_ALLOCATOR | \ 739 DRM_GPUVA_SPARSE | \ 740 XE_VMA_MADV_AUTORESET) 741 742 static void xe_vm_populate_rebind(struct xe_vma_op *op, struct xe_vma *vma, 743 u8 tile_mask) 744 { 745 INIT_LIST_HEAD(&op->link); 746 op->tile_mask = tile_mask; 747 op->base.op = DRM_GPUVA_OP_MAP; 748 op->base.map.va.addr = vma->gpuva.va.addr; 749 op->base.map.va.range = vma->gpuva.va.range; 750 op->base.map.gem.obj = vma->gpuva.gem.obj; 751 op->base.map.gem.offset = vma->gpuva.gem.offset; 752 op->map.vma = vma; 753 op->map.immediate = true; 754 op->map.vma_flags = vma->gpuva.flags & XE_VMA_CREATE_MASK; 755 } 756 757 static int xe_vm_ops_add_rebind(struct xe_vma_ops *vops, struct xe_vma *vma, 758 u8 tile_mask) 759 { 760 struct xe_vma_op *op; 761 762 op = kzalloc_obj(*op); 763 if (!op) 764 return -ENOMEM; 765 766 xe_vm_populate_rebind(op, vma, tile_mask); 767 list_add_tail(&op->link, &vops->list); 768 xe_vma_ops_incr_pt_update_ops(vops, tile_mask, 1); 769 770 return 0; 771 } 772 773 static struct dma_fence *ops_execute(struct xe_vm *vm, 774 struct xe_vma_ops *vops); 775 static void xe_vma_ops_init(struct xe_vma_ops *vops, struct xe_vm *vm, 776 struct xe_exec_queue *q, 777 struct xe_sync_entry *syncs, u32 num_syncs); 778 779 int xe_vm_rebind(struct xe_vm *vm, bool rebind_worker) 780 { 781 struct dma_fence *fence; 782 struct xe_vma *vma, *next; 783 struct xe_vma_ops vops; 784 struct xe_vma_op *op, *next_op; 785 int err, i; 786 787 lockdep_assert_held(&vm->lock); 788 if ((xe_vm_in_lr_mode(vm) && !rebind_worker) || 789 list_empty(&vm->rebind_list)) 790 return 0; 791 792 xe_vma_ops_init(&vops, vm, NULL, NULL, 0); 793 for (i = 0; i < XE_MAX_TILES_PER_DEVICE; ++i) 794 vops.pt_update_ops[i].wait_vm_bookkeep = true; 795 796 xe_vm_assert_held(vm); 797 list_for_each_entry(vma, &vm->rebind_list, combined_links.rebind) { 798 xe_assert(vm->xe, vma->tile_present); 799 800 if (rebind_worker) 801 trace_xe_vma_rebind_worker(vma); 802 else 803 trace_xe_vma_rebind_exec(vma); 804 805 err = xe_vm_ops_add_rebind(&vops, vma, 806 vma->tile_present); 807 if (err) 808 goto free_ops; 809 } 810 811 err = xe_vma_ops_alloc(&vops, false); 812 if (err) 813 goto free_ops; 814 815 fence = ops_execute(vm, &vops); 816 if (IS_ERR(fence)) { 817 err = PTR_ERR(fence); 818 } else { 819 dma_fence_put(fence); 820 list_for_each_entry_safe(vma, next, &vm->rebind_list, 821 combined_links.rebind) 822 list_del_init(&vma->combined_links.rebind); 823 } 824 free_ops: 825 list_for_each_entry_safe(op, next_op, &vops.list, link) { 826 list_del(&op->link); 827 kfree(op); 828 } 829 xe_vma_ops_fini(&vops); 830 831 return err; 832 } 833 834 struct dma_fence *xe_vma_rebind(struct xe_vm *vm, struct xe_vma *vma, u8 tile_mask) 835 { 836 struct dma_fence *fence = NULL; 837 struct xe_vma_ops vops; 838 struct xe_vma_op *op, *next_op; 839 struct xe_tile *tile; 840 u8 id; 841 int err; 842 843 lockdep_assert_held(&vm->lock); 844 xe_vm_assert_held(vm); 845 xe_assert(vm->xe, xe_vm_in_fault_mode(vm)); 846 847 xe_vma_ops_init(&vops, vm, NULL, NULL, 0); 848 vops.flags |= XE_VMA_OPS_FLAG_SKIP_TLB_WAIT; 849 for_each_tile(tile, vm->xe, id) { 850 vops.pt_update_ops[id].wait_vm_bookkeep = true; 851 vops.pt_update_ops[tile->id].q = 852 xe_migrate_exec_queue(tile->migrate); 853 } 854 855 err = xe_vm_ops_add_rebind(&vops, vma, tile_mask); 856 if (err) 857 return ERR_PTR(err); 858 859 err = xe_vma_ops_alloc(&vops, false); 860 if (err) { 861 fence = ERR_PTR(err); 862 goto free_ops; 863 } 864 865 fence = ops_execute(vm, &vops); 866 867 free_ops: 868 list_for_each_entry_safe(op, next_op, &vops.list, link) { 869 list_del(&op->link); 870 kfree(op); 871 } 872 xe_vma_ops_fini(&vops); 873 874 return fence; 875 } 876 877 static void xe_vm_populate_range_rebind(struct xe_vma_op *op, 878 struct xe_vma *vma, 879 struct xe_svm_range *range, 880 u8 tile_mask) 881 { 882 INIT_LIST_HEAD(&op->link); 883 op->tile_mask = tile_mask; 884 op->base.op = DRM_GPUVA_OP_DRIVER; 885 op->subop = XE_VMA_SUBOP_MAP_RANGE; 886 op->map_range.vma = vma; 887 op->map_range.range = range; 888 } 889 890 static int 891 xe_vm_ops_add_range_rebind(struct xe_vma_ops *vops, 892 struct xe_vma *vma, 893 struct xe_svm_range *range, 894 u8 tile_mask) 895 { 896 struct xe_vma_op *op; 897 898 op = kzalloc_obj(*op); 899 if (!op) 900 return -ENOMEM; 901 902 xe_vm_populate_range_rebind(op, vma, range, tile_mask); 903 list_add_tail(&op->link, &vops->list); 904 xe_vma_ops_incr_pt_update_ops(vops, tile_mask, 1); 905 906 return 0; 907 } 908 909 /** 910 * xe_vm_range_rebind() - VM range (re)bind 911 * @vm: The VM which the range belongs to. 912 * @vma: The VMA which the range belongs to. 913 * @range: SVM range to rebind. 914 * @tile_mask: Tile mask to bind the range to. 915 * 916 * (re)bind SVM range setting up GPU page tables for the range. 917 * 918 * Return: dma fence for rebind to signal completion on success, ERR_PTR on 919 * failure 920 */ 921 struct dma_fence *xe_vm_range_rebind(struct xe_vm *vm, 922 struct xe_vma *vma, 923 struct xe_svm_range *range, 924 u8 tile_mask) 925 { 926 struct dma_fence *fence = NULL; 927 struct xe_vma_ops vops; 928 struct xe_vma_op *op, *next_op; 929 struct xe_tile *tile; 930 u8 id; 931 int err; 932 933 lockdep_assert_held(&vm->lock); 934 xe_vm_assert_held(vm); 935 xe_assert(vm->xe, xe_vm_in_fault_mode(vm)); 936 xe_assert(vm->xe, xe_vma_is_cpu_addr_mirror(vma)); 937 938 xe_vma_ops_init(&vops, vm, NULL, NULL, 0); 939 vops.flags |= XE_VMA_OPS_FLAG_SKIP_TLB_WAIT; 940 for_each_tile(tile, vm->xe, id) { 941 vops.pt_update_ops[id].wait_vm_bookkeep = true; 942 vops.pt_update_ops[tile->id].q = 943 xe_migrate_exec_queue(tile->migrate); 944 } 945 946 err = xe_vm_ops_add_range_rebind(&vops, vma, range, tile_mask); 947 if (err) 948 return ERR_PTR(err); 949 950 err = xe_vma_ops_alloc(&vops, false); 951 if (err) { 952 fence = ERR_PTR(err); 953 goto free_ops; 954 } 955 956 fence = ops_execute(vm, &vops); 957 958 free_ops: 959 list_for_each_entry_safe(op, next_op, &vops.list, link) { 960 list_del(&op->link); 961 kfree(op); 962 } 963 xe_vma_ops_fini(&vops); 964 965 return fence; 966 } 967 968 static void xe_vm_populate_range_unbind(struct xe_vma_op *op, 969 struct xe_svm_range *range) 970 { 971 INIT_LIST_HEAD(&op->link); 972 op->tile_mask = range->tile_present; 973 op->base.op = DRM_GPUVA_OP_DRIVER; 974 op->subop = XE_VMA_SUBOP_UNMAP_RANGE; 975 op->unmap_range.range = range; 976 } 977 978 static int 979 xe_vm_ops_add_range_unbind(struct xe_vma_ops *vops, 980 struct xe_svm_range *range) 981 { 982 struct xe_vma_op *op; 983 984 op = kzalloc_obj(*op); 985 if (!op) 986 return -ENOMEM; 987 988 xe_vm_populate_range_unbind(op, range); 989 list_add_tail(&op->link, &vops->list); 990 xe_vma_ops_incr_pt_update_ops(vops, range->tile_present, 1); 991 992 return 0; 993 } 994 995 /** 996 * xe_vm_range_unbind() - VM range unbind 997 * @vm: The VM which the range belongs to. 998 * @range: SVM range to rebind. 999 * 1000 * Unbind SVM range removing the GPU page tables for the range. 1001 * 1002 * Return: dma fence for unbind to signal completion on success, ERR_PTR on 1003 * failure 1004 */ 1005 struct dma_fence *xe_vm_range_unbind(struct xe_vm *vm, 1006 struct xe_svm_range *range) 1007 { 1008 struct dma_fence *fence = NULL; 1009 struct xe_vma_ops vops; 1010 struct xe_vma_op *op, *next_op; 1011 struct xe_tile *tile; 1012 u8 id; 1013 int err; 1014 1015 lockdep_assert_held(&vm->lock); 1016 xe_vm_assert_held(vm); 1017 xe_assert(vm->xe, xe_vm_in_fault_mode(vm)); 1018 1019 if (!range->tile_present) 1020 return dma_fence_get_stub(); 1021 1022 xe_vma_ops_init(&vops, vm, NULL, NULL, 0); 1023 for_each_tile(tile, vm->xe, id) { 1024 vops.pt_update_ops[id].wait_vm_bookkeep = true; 1025 vops.pt_update_ops[tile->id].q = 1026 xe_migrate_exec_queue(tile->migrate); 1027 } 1028 1029 err = xe_vm_ops_add_range_unbind(&vops, range); 1030 if (err) 1031 return ERR_PTR(err); 1032 1033 err = xe_vma_ops_alloc(&vops, false); 1034 if (err) { 1035 fence = ERR_PTR(err); 1036 goto free_ops; 1037 } 1038 1039 fence = ops_execute(vm, &vops); 1040 1041 free_ops: 1042 list_for_each_entry_safe(op, next_op, &vops.list, link) { 1043 list_del(&op->link); 1044 kfree(op); 1045 } 1046 xe_vma_ops_fini(&vops); 1047 1048 return fence; 1049 } 1050 1051 static void xe_vma_mem_attr_fini(struct xe_vma_mem_attr *attr) 1052 { 1053 drm_pagemap_put(attr->preferred_loc.dpagemap); 1054 } 1055 1056 static void xe_vma_free(struct xe_vma *vma) 1057 { 1058 xe_vma_mem_attr_fini(&vma->attr); 1059 1060 if (xe_vma_is_userptr(vma)) 1061 kfree(to_userptr_vma(vma)); 1062 else 1063 kfree(vma); 1064 } 1065 1066 /** 1067 * xe_vma_mem_attr_copy() - copy an xe_vma_mem_attr structure. 1068 * @to: Destination. 1069 * @from: Source. 1070 * 1071 * Copies an xe_vma_mem_attr structure taking care to get reference 1072 * counting of individual members right. 1073 */ 1074 void xe_vma_mem_attr_copy(struct xe_vma_mem_attr *to, struct xe_vma_mem_attr *from) 1075 { 1076 xe_vma_mem_attr_fini(to); 1077 *to = *from; 1078 if (to->preferred_loc.dpagemap) 1079 drm_pagemap_get(to->preferred_loc.dpagemap); 1080 } 1081 1082 static struct xe_vma *xe_vma_create(struct xe_vm *vm, 1083 struct xe_bo *bo, 1084 u64 bo_offset_or_userptr, 1085 u64 start, u64 end, 1086 struct xe_vma_mem_attr *attr, 1087 unsigned int flags) 1088 { 1089 struct xe_vma *vma; 1090 struct xe_tile *tile; 1091 u8 id; 1092 bool is_null = (flags & DRM_GPUVA_SPARSE); 1093 bool is_cpu_addr_mirror = (flags & XE_VMA_SYSTEM_ALLOCATOR); 1094 1095 xe_assert(vm->xe, start < end); 1096 xe_assert(vm->xe, end < vm->size); 1097 1098 /* 1099 * Allocate and ensure that the xe_vma_is_userptr() return 1100 * matches what was allocated. 1101 */ 1102 if (!bo && !is_null && !is_cpu_addr_mirror) { 1103 struct xe_userptr_vma *uvma = kzalloc_obj(*uvma); 1104 1105 if (!uvma) 1106 return ERR_PTR(-ENOMEM); 1107 1108 vma = &uvma->vma; 1109 } else { 1110 vma = kzalloc_obj(*vma); 1111 if (!vma) 1112 return ERR_PTR(-ENOMEM); 1113 1114 if (bo) 1115 vma->gpuva.gem.obj = &bo->ttm.base; 1116 } 1117 1118 INIT_LIST_HEAD(&vma->combined_links.rebind); 1119 1120 INIT_LIST_HEAD(&vma->gpuva.gem.entry); 1121 vma->gpuva.vm = &vm->gpuvm; 1122 vma->gpuva.va.addr = start; 1123 vma->gpuva.va.range = end - start + 1; 1124 vma->gpuva.flags = flags; 1125 1126 for_each_tile(tile, vm->xe, id) 1127 vma->tile_mask |= 0x1 << id; 1128 1129 if (vm->xe->info.has_atomic_enable_pte_bit) 1130 vma->gpuva.flags |= XE_VMA_ATOMIC_PTE_BIT; 1131 1132 xe_vma_mem_attr_copy(&vma->attr, attr); 1133 if (bo) { 1134 struct drm_gpuvm_bo *vm_bo; 1135 1136 xe_bo_assert_held(bo); 1137 1138 /* 1139 * Reject only WILLNEED mappings on DONTNEED/PURGED BOs. This 1140 * gates new vm_bind ioctls (user supplies WILLNEED) while 1141 * still allowing partial-unbind / remap splits whose new VMAs 1142 * inherit the parent's DONTNEED attr. It must also run before 1143 * xe_bo_willneed_get_locked() below so a 0->1 holder bump 1144 * cannot silently promote DONTNEED back to WILLNEED. 1145 */ 1146 if (vma->attr.purgeable_state == XE_MADV_PURGEABLE_WILLNEED) { 1147 if (xe_bo_madv_is_dontneed(bo)) { 1148 xe_vma_free(vma); 1149 return ERR_PTR(-EBUSY); 1150 } 1151 if (xe_bo_is_purged(bo)) { 1152 xe_vma_free(vma); 1153 return ERR_PTR(-EINVAL); 1154 } 1155 } 1156 1157 vm_bo = drm_gpuvm_bo_obtain_locked(vma->gpuva.vm, &bo->ttm.base); 1158 if (IS_ERR(vm_bo)) { 1159 xe_vma_free(vma); 1160 return ERR_CAST(vm_bo); 1161 } 1162 1163 drm_gpuvm_bo_extobj_add(vm_bo); 1164 drm_gem_object_get(&bo->ttm.base); 1165 vma->gpuva.gem.offset = bo_offset_or_userptr; 1166 drm_gpuva_link(&vma->gpuva, vm_bo); 1167 drm_gpuvm_bo_put(vm_bo); 1168 1169 xe_bo_vma_count_inc_locked(bo); 1170 if (vma->attr.purgeable_state == XE_MADV_PURGEABLE_WILLNEED) 1171 xe_bo_willneed_get_locked(bo); 1172 } else /* userptr or null */ { 1173 if (!is_null && !is_cpu_addr_mirror) { 1174 struct xe_userptr_vma *uvma = to_userptr_vma(vma); 1175 u64 size = end - start + 1; 1176 int err; 1177 1178 vma->gpuva.gem.offset = bo_offset_or_userptr; 1179 1180 err = xe_userptr_setup(uvma, xe_vma_userptr(vma), size); 1181 if (err) { 1182 xe_vma_free(vma); 1183 return ERR_PTR(err); 1184 } 1185 } 1186 1187 xe_vm_get(vm); 1188 } 1189 1190 return vma; 1191 } 1192 1193 static void xe_vma_destroy_late(struct xe_vma *vma) 1194 { 1195 struct xe_vm *vm = xe_vma_vm(vma); 1196 struct xe_bo *bo = xe_vma_bo(vma); 1197 1198 if (vma->ufence) { 1199 xe_sync_ufence_put(vma->ufence); 1200 vma->ufence = NULL; 1201 } 1202 1203 if (xe_vma_is_userptr(vma)) { 1204 struct xe_userptr_vma *uvma = to_userptr_vma(vma); 1205 1206 xe_userptr_remove(uvma); 1207 xe_vm_put(vm); 1208 } else if (xe_vma_is_null(vma) || xe_vma_is_cpu_addr_mirror(vma)) { 1209 xe_vm_put(vm); 1210 } else { 1211 xe_bo_put(bo); 1212 } 1213 1214 xe_vma_free(vma); 1215 } 1216 1217 static void vma_destroy_work_func(struct work_struct *w) 1218 { 1219 struct xe_vma *vma = 1220 container_of(w, struct xe_vma, destroy_work); 1221 1222 xe_vma_destroy_late(vma); 1223 } 1224 1225 static void vma_destroy_cb(struct dma_fence *fence, 1226 struct dma_fence_cb *cb) 1227 { 1228 struct xe_vma *vma = container_of(cb, struct xe_vma, destroy_cb); 1229 1230 INIT_WORK(&vma->destroy_work, vma_destroy_work_func); 1231 queue_work(system_dfl_wq, &vma->destroy_work); 1232 } 1233 1234 static void xe_vma_destroy(struct xe_vma *vma, struct dma_fence *fence) 1235 { 1236 struct xe_vm *vm = xe_vma_vm(vma); 1237 struct xe_bo *bo = xe_vma_bo(vma); 1238 1239 lockdep_assert_held_write(&vm->lock); 1240 xe_assert(vm->xe, list_empty(&vma->combined_links.destroy)); 1241 1242 if (xe_vma_is_userptr(vma)) { 1243 xe_assert(vm->xe, vma->gpuva.flags & XE_VMA_DESTROYED); 1244 xe_userptr_destroy(to_userptr_vma(vma)); 1245 } else if (!xe_vma_is_null(vma) && !xe_vma_is_cpu_addr_mirror(vma)) { 1246 xe_bo_assert_held(bo); 1247 1248 drm_gpuva_unlink(&vma->gpuva); 1249 1250 xe_bo_vma_count_dec_locked(bo); 1251 if (vma->attr.purgeable_state == XE_MADV_PURGEABLE_WILLNEED) 1252 xe_bo_willneed_put_locked(bo); 1253 } 1254 1255 xe_vm_assert_held(vm); 1256 if (fence) { 1257 int ret = dma_fence_add_callback(fence, &vma->destroy_cb, 1258 vma_destroy_cb); 1259 1260 if (ret) { 1261 XE_WARN_ON(ret != -ENOENT); 1262 xe_vma_destroy_late(vma); 1263 } 1264 } else { 1265 xe_vma_destroy_late(vma); 1266 } 1267 } 1268 1269 /** 1270 * xe_vm_lock_vma() - drm_exec utility to lock a vma 1271 * @exec: The drm_exec object we're currently locking for. 1272 * @vma: The vma for witch we want to lock the vm resv and any attached 1273 * object's resv. 1274 * 1275 * Return: 0 on success, negative error code on error. In particular 1276 * may return -EDEADLK on WW transaction contention and -EINTR if 1277 * an interruptible wait is terminated by a signal. 1278 */ 1279 int xe_vm_lock_vma(struct drm_exec *exec, struct xe_vma *vma) 1280 { 1281 struct xe_vm *vm = xe_vma_vm(vma); 1282 struct xe_bo *bo = xe_vma_bo(vma); 1283 int err; 1284 1285 XE_WARN_ON(!vm); 1286 1287 err = drm_exec_lock_obj(exec, xe_vm_obj(vm)); 1288 if (!err && bo && !bo->vm) 1289 err = drm_exec_lock_obj(exec, &bo->ttm.base); 1290 1291 return err; 1292 } 1293 1294 static void xe_vma_destroy_unlocked(struct xe_vma *vma) 1295 { 1296 struct xe_device *xe = xe_vma_vm(vma)->xe; 1297 struct xe_validation_ctx ctx; 1298 struct drm_exec exec; 1299 int err = 0; 1300 1301 xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {}, err) { 1302 err = xe_vm_lock_vma(&exec, vma); 1303 drm_exec_retry_on_contention(&exec); 1304 if (XE_WARN_ON(err)) 1305 break; 1306 xe_vma_destroy(vma, NULL); 1307 } 1308 xe_assert(xe, !err); 1309 } 1310 1311 struct xe_vma * 1312 xe_vm_find_overlapping_vma(struct xe_vm *vm, u64 start, u64 range) 1313 { 1314 struct drm_gpuva *gpuva; 1315 1316 lockdep_assert_held(&vm->lock); 1317 1318 if (xe_vm_is_closed_or_banned(vm)) 1319 return NULL; 1320 1321 xe_assert(vm->xe, start + range <= vm->size); 1322 1323 gpuva = drm_gpuva_find_first(&vm->gpuvm, start, range); 1324 1325 return gpuva ? gpuva_to_vma(gpuva) : NULL; 1326 } 1327 1328 static int xe_vm_insert_vma(struct xe_vm *vm, struct xe_vma *vma) 1329 { 1330 int err; 1331 1332 xe_assert(vm->xe, xe_vma_vm(vma) == vm); 1333 lockdep_assert_held(&vm->lock); 1334 1335 mutex_lock(&vm->snap_mutex); 1336 err = drm_gpuva_insert(&vm->gpuvm, &vma->gpuva); 1337 mutex_unlock(&vm->snap_mutex); 1338 XE_WARN_ON(err); /* Shouldn't be possible */ 1339 1340 return err; 1341 } 1342 1343 static void xe_vm_remove_vma(struct xe_vm *vm, struct xe_vma *vma) 1344 { 1345 xe_assert(vm->xe, xe_vma_vm(vma) == vm); 1346 lockdep_assert_held(&vm->lock); 1347 1348 mutex_lock(&vm->snap_mutex); 1349 drm_gpuva_remove(&vma->gpuva); 1350 mutex_unlock(&vm->snap_mutex); 1351 if (vm->usm.last_fault_vma == vma) 1352 vm->usm.last_fault_vma = NULL; 1353 } 1354 1355 static struct drm_gpuva_op *xe_vm_op_alloc(void) 1356 { 1357 struct xe_vma_op *op; 1358 1359 op = kzalloc_obj(*op); 1360 1361 if (unlikely(!op)) 1362 return NULL; 1363 1364 return &op->base; 1365 } 1366 1367 static void xe_vm_free(struct drm_gpuvm *gpuvm); 1368 1369 static const struct drm_gpuvm_ops gpuvm_ops = { 1370 .op_alloc = xe_vm_op_alloc, 1371 .vm_bo_validate = xe_gpuvm_validate, 1372 .vm_free = xe_vm_free, 1373 }; 1374 1375 static u64 pde_encode_pat_index(u16 pat_index) 1376 { 1377 u64 pte = 0; 1378 1379 if (pat_index & BIT(0)) 1380 pte |= XE_PPGTT_PTE_PAT0; 1381 1382 if (pat_index & BIT(1)) 1383 pte |= XE_PPGTT_PTE_PAT1; 1384 1385 return pte; 1386 } 1387 1388 static u64 pte_encode_pat_index(u16 pat_index, u32 pt_level) 1389 { 1390 u64 pte = 0; 1391 1392 if (pat_index & BIT(0)) 1393 pte |= XE_PPGTT_PTE_PAT0; 1394 1395 if (pat_index & BIT(1)) 1396 pte |= XE_PPGTT_PTE_PAT1; 1397 1398 if (pat_index & BIT(2)) { 1399 if (pt_level) 1400 pte |= XE_PPGTT_PDE_PDPE_PAT2; 1401 else 1402 pte |= XE_PPGTT_PTE_PAT2; 1403 } 1404 1405 if (pat_index & BIT(3)) 1406 pte |= XELPG_PPGTT_PTE_PAT3; 1407 1408 if (pat_index & (BIT(4))) 1409 pte |= XE2_PPGTT_PTE_PAT4; 1410 1411 return pte; 1412 } 1413 1414 static u64 pte_encode_ps(u32 pt_level) 1415 { 1416 XE_WARN_ON(pt_level > MAX_HUGEPTE_LEVEL); 1417 1418 if (pt_level == 1) 1419 return XE_PDE_PS_2M; 1420 else if (pt_level == 2) 1421 return XE_PDPE_PS_1G; 1422 1423 return 0; 1424 } 1425 1426 static u16 pde_pat_index(struct xe_bo *bo) 1427 { 1428 struct xe_device *xe = xe_bo_device(bo); 1429 u16 pat_index; 1430 1431 /* 1432 * We only have two bits to encode the PAT index in non-leaf nodes, but 1433 * these only point to other paging structures so we only need a minimal 1434 * selection of options. The user PAT index is only for encoding leaf 1435 * nodes, where we have use of more bits to do the encoding. The 1436 * non-leaf nodes are instead under driver control so the chosen index 1437 * here should be distinct from the user PAT index. Also the 1438 * corresponding coherency of the PAT index should be tied to the 1439 * allocation type of the page table (or at least we should pick 1440 * something which is always safe). 1441 */ 1442 if (!xe_bo_is_vram(bo) && bo->ttm.ttm->caching == ttm_cached) 1443 pat_index = xe_cache_pat_idx(xe, XE_CACHE_WB); 1444 else 1445 pat_index = xe_cache_pat_idx(xe, XE_CACHE_NONE); 1446 1447 xe_assert(xe, pat_index <= 3); 1448 1449 return pat_index; 1450 } 1451 1452 static u64 xelp_pde_encode_bo(struct xe_bo *bo, u64 bo_offset) 1453 { 1454 u64 pde; 1455 1456 pde = xe_bo_addr(bo, bo_offset, XE_PAGE_SIZE); 1457 pde |= XE_PAGE_PRESENT | XE_PAGE_RW; 1458 pde |= pde_encode_pat_index(pde_pat_index(bo)); 1459 1460 return pde; 1461 } 1462 1463 static u64 xelp_pte_encode_bo(struct xe_bo *bo, u64 bo_offset, 1464 u16 pat_index, u32 pt_level) 1465 { 1466 u64 pte; 1467 1468 pte = xe_bo_addr(bo, bo_offset, XE_PAGE_SIZE); 1469 pte |= XE_PAGE_PRESENT | XE_PAGE_RW; 1470 pte |= pte_encode_pat_index(pat_index, pt_level); 1471 pte |= pte_encode_ps(pt_level); 1472 1473 if (xe_bo_is_vram(bo) || xe_bo_is_stolen_devmem(bo)) 1474 pte |= XE_PPGTT_PTE_DM; 1475 1476 return pte; 1477 } 1478 1479 static u64 xelp_pte_encode_vma(u64 pte, struct xe_vma *vma, 1480 u16 pat_index, u32 pt_level) 1481 { 1482 struct xe_bo *bo = xe_vma_bo(vma); 1483 struct xe_vm *vm = xe_vma_vm(vma); 1484 1485 pte |= XE_PAGE_PRESENT; 1486 1487 if (likely(!xe_vma_read_only(vma))) 1488 pte |= XE_PAGE_RW; 1489 1490 pte |= pte_encode_pat_index(pat_index, pt_level); 1491 pte |= pte_encode_ps(pt_level); 1492 1493 /* 1494 * NULL PTEs redirect to scratch page (return zeros on read). 1495 * Set for: 1) explicit null VMAs, 2) purged BOs on scratch VMs. 1496 * Never set NULL flag without scratch page - causes undefined behavior. 1497 */ 1498 if (unlikely(xe_vma_is_null(vma) || 1499 (bo && xe_bo_is_purged(bo) && xe_vm_has_scratch(vm)))) 1500 pte |= XE_PTE_NULL; 1501 1502 return pte; 1503 } 1504 1505 static u64 xelp_pte_encode_addr(struct xe_device *xe, u64 addr, 1506 u16 pat_index, 1507 u32 pt_level, bool devmem, u64 flags) 1508 { 1509 u64 pte; 1510 1511 /* Avoid passing random bits directly as flags */ 1512 xe_assert(xe, !(flags & ~XE_PTE_PS64)); 1513 1514 pte = addr; 1515 pte |= XE_PAGE_PRESENT | XE_PAGE_RW; 1516 pte |= pte_encode_pat_index(pat_index, pt_level); 1517 pte |= pte_encode_ps(pt_level); 1518 1519 if (devmem) 1520 pte |= XE_PPGTT_PTE_DM; 1521 1522 pte |= flags; 1523 1524 return pte; 1525 } 1526 1527 static const struct xe_pt_ops xelp_pt_ops = { 1528 .pte_encode_bo = xelp_pte_encode_bo, 1529 .pte_encode_vma = xelp_pte_encode_vma, 1530 .pte_encode_addr = xelp_pte_encode_addr, 1531 .pde_encode_bo = xelp_pde_encode_bo, 1532 }; 1533 1534 static void vm_destroy_work_func(struct work_struct *w); 1535 1536 /** 1537 * xe_vm_create_scratch() - Setup a scratch memory pagetable tree for the 1538 * given tile and vm. 1539 * @xe: xe device. 1540 * @tile: tile to set up for. 1541 * @vm: vm to set up for. 1542 * @exec: The struct drm_exec object used to lock the vm resv. 1543 * 1544 * Sets up a pagetable tree with one page-table per level and a single 1545 * leaf PTE. All pagetable entries point to the single page-table or, 1546 * for MAX_HUGEPTE_LEVEL, a NULL huge PTE returning 0 on read and 1547 * writes become NOPs. 1548 * 1549 * Return: 0 on success, negative error code on error. 1550 */ 1551 static int xe_vm_create_scratch(struct xe_device *xe, struct xe_tile *tile, 1552 struct xe_vm *vm, struct drm_exec *exec) 1553 { 1554 u8 id = tile->id; 1555 int i; 1556 1557 for (i = MAX_HUGEPTE_LEVEL; i < vm->pt_root[id]->level; i++) { 1558 vm->scratch_pt[id][i] = xe_pt_create(vm, tile, i, exec); 1559 if (IS_ERR(vm->scratch_pt[id][i])) { 1560 int err = PTR_ERR(vm->scratch_pt[id][i]); 1561 1562 vm->scratch_pt[id][i] = NULL; 1563 return err; 1564 } 1565 xe_pt_populate_empty(tile, vm, vm->scratch_pt[id][i]); 1566 } 1567 1568 return 0; 1569 } 1570 ALLOW_ERROR_INJECTION(xe_vm_create_scratch, ERRNO); 1571 1572 static void xe_vm_free_scratch(struct xe_vm *vm) 1573 { 1574 struct xe_tile *tile; 1575 u8 id; 1576 1577 if (!xe_vm_has_scratch(vm)) 1578 return; 1579 1580 for_each_tile(tile, vm->xe, id) { 1581 u32 i; 1582 1583 if (!vm->pt_root[id]) 1584 continue; 1585 1586 for (i = MAX_HUGEPTE_LEVEL; i < vm->pt_root[id]->level; ++i) 1587 if (vm->scratch_pt[id][i]) 1588 xe_pt_destroy(vm->scratch_pt[id][i], vm->flags, NULL); 1589 } 1590 } 1591 1592 static void xe_vm_pt_destroy(struct xe_vm *vm) 1593 { 1594 struct xe_tile *tile; 1595 u8 id; 1596 1597 xe_vm_assert_held(vm); 1598 1599 for_each_tile(tile, vm->xe, id) { 1600 if (vm->pt_root[id]) { 1601 xe_pt_destroy(vm->pt_root[id], vm->flags, NULL); 1602 vm->pt_root[id] = NULL; 1603 } 1604 } 1605 } 1606 1607 static void xe_vm_init_prove_locking(struct xe_device *xe, struct xe_vm *vm) 1608 { 1609 if (!IS_ENABLED(CONFIG_PROVE_LOCKING)) 1610 return; 1611 1612 fs_reclaim_acquire(GFP_KERNEL); 1613 might_lock(&vm->exec_queues.lock); 1614 fs_reclaim_release(GFP_KERNEL); 1615 1616 down_read(&vm->exec_queues.lock); 1617 might_lock(&xe_root_mmio_gt(xe)->uc.guc.ct.lock); 1618 up_read(&vm->exec_queues.lock); 1619 } 1620 1621 struct xe_vm *xe_vm_create(struct xe_device *xe, u32 flags, struct xe_file *xef) 1622 { 1623 struct drm_gem_object *vm_resv_obj; 1624 struct xe_validation_ctx ctx; 1625 struct drm_exec exec; 1626 struct xe_vm *vm; 1627 int err; 1628 struct xe_tile *tile; 1629 u8 id; 1630 1631 /* 1632 * Since the GSCCS is not user-accessible, we don't expect a GSC VM to 1633 * ever be in faulting mode. 1634 */ 1635 xe_assert(xe, !((flags & XE_VM_FLAG_GSC) && (flags & XE_VM_FLAG_FAULT_MODE))); 1636 1637 vm = kzalloc(sizeof(*vm), GFP_KERNEL); 1638 if (!vm) 1639 return ERR_PTR(-ENOMEM); 1640 1641 vm->xe = xe; 1642 1643 vm->size = 1ull << xe->info.va_bits; 1644 vm->flags = flags; 1645 1646 if (xef) 1647 vm->xef = xe_file_get(xef); 1648 /* 1649 * GSC VMs are kernel-owned, only used for PXP ops and can sometimes be 1650 * manipulated under the PXP mutex. However, the PXP mutex can be taken 1651 * under a user-VM lock when the PXP session is started at exec_queue 1652 * creation time. Those are different VMs and therefore there is no risk 1653 * of deadlock, but we need to tell lockdep that this is the case or it 1654 * will print a warning. 1655 */ 1656 if (flags & XE_VM_FLAG_GSC) { 1657 static struct lock_class_key gsc_vm_key; 1658 1659 __init_rwsem(&vm->lock, "gsc_vm", &gsc_vm_key); 1660 } else { 1661 init_rwsem(&vm->lock); 1662 } 1663 mutex_init(&vm->snap_mutex); 1664 1665 INIT_LIST_HEAD(&vm->rebind_list); 1666 1667 INIT_LIST_HEAD(&vm->userptr.repin_list); 1668 INIT_LIST_HEAD(&vm->userptr.invalidated); 1669 spin_lock_init(&vm->userptr.invalidated_lock); 1670 1671 INIT_LIST_HEAD(&vm->faults.list); 1672 spin_lock_init(&vm->faults.lock); 1673 1674 ttm_lru_bulk_move_init(&vm->lru_bulk_move); 1675 1676 INIT_WORK(&vm->destroy_work, vm_destroy_work_func); 1677 1678 INIT_LIST_HEAD(&vm->preempt.exec_queues); 1679 for (id = 0; id < XE_MAX_TILES_PER_DEVICE * XE_MAX_GT_PER_TILE; ++id) 1680 INIT_LIST_HEAD(&vm->exec_queues.list[id]); 1681 if (flags & XE_VM_FLAG_FAULT_MODE) 1682 vm->preempt.min_run_period_ms = xe->min_run_period_pf_ms; 1683 else 1684 vm->preempt.min_run_period_ms = xe->min_run_period_lr_ms; 1685 1686 init_rwsem(&vm->exec_queues.lock); 1687 xe_vm_init_prove_locking(xe, vm); 1688 1689 for_each_tile(tile, xe, id) 1690 xe_range_fence_tree_init(&vm->rftree[id]); 1691 1692 vm->pt_ops = &xelp_pt_ops; 1693 1694 /* 1695 * Long-running workloads are not protected by the scheduler references. 1696 * By design, run_job for long-running workloads returns NULL and the 1697 * scheduler drops all the references of it, hence protecting the VM 1698 * for this case is necessary. 1699 */ 1700 if (flags & XE_VM_FLAG_LR_MODE) { 1701 INIT_WORK(&vm->preempt.rebind_work, preempt_rebind_work_func); 1702 xe_pm_runtime_get_noresume(xe); 1703 INIT_LIST_HEAD(&vm->preempt.pm_activate_link); 1704 } 1705 1706 err = xe_svm_init(vm); 1707 if (err) 1708 goto err_no_resv; 1709 1710 vm_resv_obj = drm_gpuvm_resv_object_alloc(&xe->drm); 1711 if (!vm_resv_obj) { 1712 err = -ENOMEM; 1713 goto err_svm_fini; 1714 } 1715 1716 drm_gpuvm_init(&vm->gpuvm, "Xe VM", DRM_GPUVM_RESV_PROTECTED, &xe->drm, 1717 vm_resv_obj, 0, vm->size, 0, 0, &gpuvm_ops); 1718 1719 drm_gem_object_put(vm_resv_obj); 1720 1721 err = 0; 1722 xe_validation_guard(&ctx, &xe->val, &exec, (struct xe_val_flags) {.interruptible = true}, 1723 err) { 1724 err = xe_vm_drm_exec_lock(vm, &exec); 1725 drm_exec_retry_on_contention(&exec); 1726 1727 if (IS_DGFX(xe) && xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K) 1728 vm->flags |= XE_VM_FLAG_64K; 1729 1730 for_each_tile(tile, xe, id) { 1731 if (flags & XE_VM_FLAG_MIGRATION && 1732 tile->id != XE_VM_FLAG_TILE_ID(flags)) 1733 continue; 1734 1735 vm->pt_root[id] = xe_pt_create(vm, tile, xe->info.vm_max_level, 1736 &exec); 1737 if (IS_ERR(vm->pt_root[id])) { 1738 err = PTR_ERR(vm->pt_root[id]); 1739 vm->pt_root[id] = NULL; 1740 xe_vm_pt_destroy(vm); 1741 drm_exec_retry_on_contention(&exec); 1742 xe_validation_retry_on_oom(&ctx, &err); 1743 break; 1744 } 1745 } 1746 if (err) 1747 break; 1748 1749 if (xe_vm_has_scratch(vm)) { 1750 for_each_tile(tile, xe, id) { 1751 if (!vm->pt_root[id]) 1752 continue; 1753 1754 err = xe_vm_create_scratch(xe, tile, vm, &exec); 1755 if (err) { 1756 xe_vm_free_scratch(vm); 1757 xe_vm_pt_destroy(vm); 1758 drm_exec_retry_on_contention(&exec); 1759 xe_validation_retry_on_oom(&ctx, &err); 1760 break; 1761 } 1762 } 1763 if (err) 1764 break; 1765 vm->batch_invalidate_tlb = true; 1766 } 1767 1768 if (vm->flags & XE_VM_FLAG_LR_MODE) 1769 vm->batch_invalidate_tlb = false; 1770 1771 /* Fill pt_root after allocating scratch tables */ 1772 for_each_tile(tile, xe, id) { 1773 if (!vm->pt_root[id]) 1774 continue; 1775 1776 xe_pt_populate_empty(tile, vm, vm->pt_root[id]); 1777 } 1778 } 1779 if (err) 1780 goto err_close; 1781 1782 /* Kernel migration VM shouldn't have a circular loop.. */ 1783 if (!(flags & XE_VM_FLAG_MIGRATION)) { 1784 for_each_tile(tile, xe, id) { 1785 struct xe_exec_queue *q; 1786 u32 create_flags = EXEC_QUEUE_FLAG_VM; 1787 1788 if (!vm->pt_root[id]) 1789 continue; 1790 1791 if (!xef) /* Not from userspace */ 1792 create_flags |= EXEC_QUEUE_FLAG_KERNEL; 1793 1794 q = xe_exec_queue_create_bind(xe, tile, vm, create_flags, 0); 1795 if (IS_ERR(q)) { 1796 err = PTR_ERR(q); 1797 goto err_close; 1798 } 1799 vm->q[id] = q; 1800 } 1801 } 1802 1803 if (xef && xe->info.has_asid) { 1804 u32 asid; 1805 1806 down_write(&xe->usm.lock); 1807 err = xa_alloc_cyclic(&xe->usm.asid_to_vm, &asid, vm, 1808 XA_LIMIT(1, XE_MAX_ASID - 1), 1809 &xe->usm.next_asid, GFP_NOWAIT); 1810 up_write(&xe->usm.lock); 1811 if (err < 0) 1812 goto err_close; 1813 1814 vm->usm.asid = asid; 1815 } 1816 1817 trace_xe_vm_create(vm); 1818 1819 return vm; 1820 1821 err_close: 1822 xe_vm_close_and_put(vm); 1823 return ERR_PTR(err); 1824 1825 err_svm_fini: 1826 vm->size = 0; /* close the vm */ 1827 if (flags & XE_VM_FLAG_FAULT_MODE) 1828 xe_svm_close(vm); 1829 xe_svm_fini(vm); 1830 err_no_resv: 1831 mutex_destroy(&vm->snap_mutex); 1832 for_each_tile(tile, xe, id) 1833 xe_range_fence_tree_fini(&vm->rftree[id]); 1834 ttm_lru_bulk_move_fini(&xe->ttm, &vm->lru_bulk_move); 1835 if (vm->xef) 1836 xe_file_put(vm->xef); 1837 kfree(vm); 1838 if (flags & XE_VM_FLAG_LR_MODE) 1839 xe_pm_runtime_put(xe); 1840 return ERR_PTR(err); 1841 } 1842 1843 static void xe_vm_close(struct xe_vm *vm) 1844 { 1845 struct xe_device *xe = vm->xe; 1846 bool bound; 1847 int idx; 1848 1849 bound = drm_dev_enter(&xe->drm, &idx); 1850 1851 down_write(&vm->lock); 1852 if (xe_vm_in_fault_mode(vm)) 1853 xe_svm_notifier_lock(vm); 1854 1855 vm->size = 0; 1856 1857 if (!((vm->flags & XE_VM_FLAG_MIGRATION))) { 1858 struct xe_tile *tile; 1859 struct xe_gt *gt; 1860 u8 id; 1861 1862 /* Wait for pending binds */ 1863 dma_resv_wait_timeout(xe_vm_resv(vm), 1864 DMA_RESV_USAGE_BOOKKEEP, 1865 false, MAX_SCHEDULE_TIMEOUT); 1866 1867 if (bound) { 1868 for_each_tile(tile, xe, id) 1869 if (vm->pt_root[id]) 1870 xe_pt_clear(xe, vm->pt_root[id]); 1871 1872 for_each_gt(gt, xe, id) 1873 xe_tlb_inval_vm(>->tlb_inval, vm); 1874 } 1875 } 1876 1877 if (xe_vm_in_fault_mode(vm)) 1878 xe_svm_notifier_unlock(vm); 1879 up_write(&vm->lock); 1880 1881 if (bound) 1882 drm_dev_exit(idx); 1883 } 1884 1885 void xe_vm_close_and_put(struct xe_vm *vm) 1886 { 1887 LIST_HEAD(contested); 1888 struct xe_device *xe = vm->xe; 1889 struct xe_tile *tile; 1890 struct xe_vma *vma, *next_vma; 1891 struct drm_gpuva *gpuva, *next; 1892 u8 id; 1893 1894 xe_assert(xe, !vm->preempt.num_exec_queues); 1895 1896 xe_vm_close(vm); 1897 if (xe_vm_in_preempt_fence_mode(vm)) { 1898 mutex_lock(&xe->rebind_resume_lock); 1899 list_del_init(&vm->preempt.pm_activate_link); 1900 mutex_unlock(&xe->rebind_resume_lock); 1901 flush_work(&vm->preempt.rebind_work); 1902 } 1903 if (xe_vm_in_fault_mode(vm)) 1904 xe_svm_close(vm); 1905 1906 down_write(&vm->lock); 1907 for_each_tile(tile, xe, id) { 1908 if (vm->q[id]) { 1909 int i; 1910 1911 xe_exec_queue_last_fence_put(vm->q[id], vm); 1912 for_each_tlb_inval(i) 1913 xe_exec_queue_tlb_inval_last_fence_put(vm->q[id], vm, i); 1914 } 1915 } 1916 up_write(&vm->lock); 1917 1918 for_each_tile(tile, xe, id) { 1919 if (vm->q[id]) { 1920 xe_exec_queue_kill(vm->q[id]); 1921 xe_exec_queue_put(vm->q[id]); 1922 vm->q[id] = NULL; 1923 } 1924 } 1925 1926 down_write(&vm->lock); 1927 xe_vm_lock(vm, false); 1928 drm_gpuvm_for_each_va_safe(gpuva, next, &vm->gpuvm) { 1929 vma = gpuva_to_vma(gpuva); 1930 1931 if (xe_vma_has_no_bo(vma)) { 1932 xe_svm_notifier_lock(vm); 1933 vma->gpuva.flags |= XE_VMA_DESTROYED; 1934 xe_svm_notifier_unlock(vm); 1935 } 1936 1937 xe_vm_remove_vma(vm, vma); 1938 1939 /* easy case, remove from VMA? */ 1940 if (xe_vma_has_no_bo(vma) || xe_vma_bo(vma)->vm) { 1941 list_del_init(&vma->combined_links.rebind); 1942 xe_vma_destroy(vma, NULL); 1943 continue; 1944 } 1945 1946 list_move_tail(&vma->combined_links.destroy, &contested); 1947 vma->gpuva.flags |= XE_VMA_DESTROYED; 1948 } 1949 1950 xe_vm_unlock(vm); 1951 1952 /* 1953 * Unlink and destroy all contested external-BO VMAs before destroying 1954 * the page tables. Otherwise, concurrent eviction holding only bo->resv 1955 * can walk the BO's VMAs and attempt to invalidate/zap page tables that 1956 * have already been freed. 1957 */ 1958 list_for_each_entry_safe(vma, next_vma, &contested, 1959 combined_links.destroy) { 1960 list_del_init(&vma->combined_links.destroy); 1961 xe_vma_destroy_unlocked(vma); 1962 } 1963 1964 xe_vm_lock(vm, false); 1965 xe_vm_free_scratch(vm); 1966 xe_vm_pt_destroy(vm); 1967 xe_vm_unlock(vm); 1968 1969 xe_svm_fini(vm); 1970 1971 up_write(&vm->lock); 1972 1973 down_write(&xe->usm.lock); 1974 if (vm->usm.asid) { 1975 void *lookup; 1976 1977 xe_assert(xe, xe->info.has_asid); 1978 xe_assert(xe, !(vm->flags & XE_VM_FLAG_MIGRATION)); 1979 1980 lookup = xa_erase(&xe->usm.asid_to_vm, vm->usm.asid); 1981 xe_assert(xe, lookup == vm); 1982 } 1983 up_write(&xe->usm.lock); 1984 1985 xe_vm_clear_fault_entries(vm); 1986 1987 for_each_tile(tile, xe, id) 1988 xe_range_fence_tree_fini(&vm->rftree[id]); 1989 1990 xe_vm_put(vm); 1991 } 1992 1993 static void vm_destroy_work_func(struct work_struct *w) 1994 { 1995 struct xe_vm *vm = 1996 container_of(w, struct xe_vm, destroy_work); 1997 struct xe_device *xe = vm->xe; 1998 struct xe_tile *tile; 1999 u8 id; 2000 2001 /* xe_vm_close_and_put was not called? */ 2002 xe_assert(xe, !vm->size); 2003 2004 if (xe_vm_in_preempt_fence_mode(vm)) 2005 flush_work(&vm->preempt.rebind_work); 2006 2007 mutex_destroy(&vm->snap_mutex); 2008 2009 if (vm->flags & XE_VM_FLAG_LR_MODE) 2010 xe_pm_runtime_put(xe); 2011 2012 for_each_tile(tile, xe, id) 2013 XE_WARN_ON(vm->pt_root[id]); 2014 2015 trace_xe_vm_free(vm); 2016 2017 ttm_lru_bulk_move_fini(&xe->ttm, &vm->lru_bulk_move); 2018 2019 if (vm->xef) 2020 xe_file_put(vm->xef); 2021 2022 kfree(vm); 2023 } 2024 2025 static void xe_vm_free(struct drm_gpuvm *gpuvm) 2026 { 2027 struct xe_vm *vm = container_of(gpuvm, struct xe_vm, gpuvm); 2028 2029 /* To destroy the VM we need to be able to sleep */ 2030 queue_work(system_dfl_wq, &vm->destroy_work); 2031 } 2032 2033 struct xe_vm *xe_vm_lookup(struct xe_file *xef, u32 id) 2034 { 2035 struct xe_vm *vm; 2036 2037 mutex_lock(&xef->vm.lock); 2038 vm = xa_load(&xef->vm.xa, id); 2039 if (vm) 2040 xe_vm_get(vm); 2041 mutex_unlock(&xef->vm.lock); 2042 2043 return vm; 2044 } 2045 2046 u64 xe_vm_pdp4_descriptor(struct xe_vm *vm, struct xe_tile *tile) 2047 { 2048 return vm->pt_ops->pde_encode_bo(vm->pt_root[tile->id]->bo, 0); 2049 } 2050 2051 static struct xe_exec_queue * 2052 to_wait_exec_queue(struct xe_vm *vm, struct xe_exec_queue *q) 2053 { 2054 return q ? q : vm->q[0]; 2055 } 2056 2057 static struct xe_user_fence * 2058 find_ufence_get(struct xe_sync_entry *syncs, u32 num_syncs) 2059 { 2060 unsigned int i; 2061 2062 for (i = 0; i < num_syncs; i++) { 2063 struct xe_sync_entry *e = &syncs[i]; 2064 2065 if (xe_sync_is_ufence(e)) 2066 return xe_sync_ufence_get(e); 2067 } 2068 2069 return NULL; 2070 } 2071 2072 #define ALL_DRM_XE_VM_CREATE_FLAGS (DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE | \ 2073 DRM_XE_VM_CREATE_FLAG_LR_MODE | \ 2074 DRM_XE_VM_CREATE_FLAG_FAULT_MODE | \ 2075 DRM_XE_VM_CREATE_FLAG_NO_VM_OVERCOMMIT) 2076 2077 int xe_vm_create_ioctl(struct drm_device *dev, void *data, 2078 struct drm_file *file) 2079 { 2080 struct xe_device *xe = to_xe_device(dev); 2081 struct xe_file *xef = to_xe_file(file); 2082 struct drm_xe_vm_create *args = data; 2083 struct xe_gt *wa_gt = xe_root_mmio_gt(xe); 2084 struct xe_vm *vm; 2085 u32 id; 2086 int err; 2087 u32 flags = 0; 2088 2089 if (XE_IOCTL_DBG(xe, args->extensions)) 2090 return -EINVAL; 2091 2092 if (wa_gt && XE_GT_WA(wa_gt, 22014953428)) 2093 args->flags |= DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE; 2094 2095 if (XE_IOCTL_DBG(xe, args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE && 2096 !xe->info.has_usm)) 2097 return -EINVAL; 2098 2099 if (XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1])) 2100 return -EINVAL; 2101 2102 if (XE_IOCTL_DBG(xe, args->flags & ~ALL_DRM_XE_VM_CREATE_FLAGS)) 2103 return -EINVAL; 2104 2105 if (XE_IOCTL_DBG(xe, args->flags & DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE && 2106 args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE && 2107 !xe->info.needs_scratch)) 2108 return -EINVAL; 2109 2110 if (XE_IOCTL_DBG(xe, !(args->flags & DRM_XE_VM_CREATE_FLAG_LR_MODE) && 2111 args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE)) 2112 return -EINVAL; 2113 2114 if (XE_IOCTL_DBG(xe, !(args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE) && 2115 args->flags & DRM_XE_VM_CREATE_FLAG_NO_VM_OVERCOMMIT)) 2116 return -EINVAL; 2117 2118 if (args->flags & DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE) 2119 flags |= XE_VM_FLAG_SCRATCH_PAGE; 2120 if (args->flags & DRM_XE_VM_CREATE_FLAG_LR_MODE) 2121 flags |= XE_VM_FLAG_LR_MODE; 2122 if (args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE) 2123 flags |= XE_VM_FLAG_FAULT_MODE; 2124 if (args->flags & DRM_XE_VM_CREATE_FLAG_NO_VM_OVERCOMMIT) 2125 flags |= XE_VM_FLAG_NO_VM_OVERCOMMIT; 2126 2127 vm = xe_vm_create(xe, flags, xef); 2128 if (IS_ERR(vm)) 2129 return PTR_ERR(vm); 2130 2131 #if IS_ENABLED(CONFIG_DRM_XE_DEBUG_MEM) 2132 /* Warning: Security issue - never enable by default */ 2133 args->reserved[0] = xe_bo_main_addr(vm->pt_root[0]->bo, XE_PAGE_SIZE); 2134 #endif 2135 2136 /* user id alloc must always be last in ioctl to prevent UAF */ 2137 err = xa_alloc(&xef->vm.xa, &id, vm, xa_limit_32b, GFP_KERNEL); 2138 if (err) 2139 goto err_close_and_put; 2140 2141 args->vm_id = id; 2142 2143 return 0; 2144 2145 err_close_and_put: 2146 xe_vm_close_and_put(vm); 2147 2148 return err; 2149 } 2150 2151 int xe_vm_destroy_ioctl(struct drm_device *dev, void *data, 2152 struct drm_file *file) 2153 { 2154 struct xe_device *xe = to_xe_device(dev); 2155 struct xe_file *xef = to_xe_file(file); 2156 struct drm_xe_vm_destroy *args = data; 2157 struct xe_vm *vm; 2158 int err = 0; 2159 2160 if (XE_IOCTL_DBG(xe, args->pad) || 2161 XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1])) 2162 return -EINVAL; 2163 2164 mutex_lock(&xef->vm.lock); 2165 vm = xa_load(&xef->vm.xa, args->vm_id); 2166 if (XE_IOCTL_DBG(xe, !vm)) 2167 err = -ENOENT; 2168 else if (XE_IOCTL_DBG(xe, vm->preempt.num_exec_queues)) 2169 err = -EBUSY; 2170 else 2171 xa_erase(&xef->vm.xa, args->vm_id); 2172 mutex_unlock(&xef->vm.lock); 2173 2174 if (!err) 2175 xe_vm_close_and_put(vm); 2176 2177 return err; 2178 } 2179 2180 static int xe_vm_query_vmas(struct xe_vm *vm, u64 start, u64 end) 2181 { 2182 struct drm_gpuva *gpuva; 2183 u32 num_vmas = 0; 2184 2185 lockdep_assert_held(&vm->lock); 2186 drm_gpuvm_for_each_va_range(gpuva, &vm->gpuvm, start, end) 2187 num_vmas++; 2188 2189 return num_vmas; 2190 } 2191 2192 static int get_mem_attrs(struct xe_vm *vm, u32 *num_vmas, u64 start, 2193 u64 end, struct drm_xe_mem_range_attr *attrs) 2194 { 2195 struct drm_gpuva *gpuva; 2196 int i = 0; 2197 2198 lockdep_assert_held(&vm->lock); 2199 2200 drm_gpuvm_for_each_va_range(gpuva, &vm->gpuvm, start, end) { 2201 struct xe_vma *vma = gpuva_to_vma(gpuva); 2202 2203 if (i == *num_vmas) 2204 return -ENOSPC; 2205 2206 attrs[i].start = xe_vma_start(vma); 2207 attrs[i].end = xe_vma_end(vma); 2208 attrs[i].atomic.val = vma->attr.atomic_access; 2209 attrs[i].pat_index.val = vma->attr.pat_index; 2210 attrs[i].preferred_mem_loc.devmem_fd = vma->attr.preferred_loc.devmem_fd; 2211 attrs[i].preferred_mem_loc.migration_policy = 2212 vma->attr.preferred_loc.migration_policy; 2213 2214 i++; 2215 } 2216 2217 *num_vmas = i; 2218 return 0; 2219 } 2220 2221 int xe_vm_query_vmas_attrs_ioctl(struct drm_device *dev, void *data, struct drm_file *file) 2222 { 2223 struct xe_device *xe = to_xe_device(dev); 2224 struct xe_file *xef = to_xe_file(file); 2225 struct drm_xe_mem_range_attr *mem_attrs; 2226 struct drm_xe_vm_query_mem_range_attr *args = data; 2227 u64 __user *attrs_user = u64_to_user_ptr(args->vector_of_mem_attr); 2228 struct xe_vm *vm; 2229 int err = 0; 2230 2231 if (XE_IOCTL_DBG(xe, 2232 ((args->num_mem_ranges == 0 && 2233 (attrs_user || args->sizeof_mem_range_attr != 0)) || 2234 (args->num_mem_ranges > 0 && 2235 (!attrs_user || 2236 args->sizeof_mem_range_attr != 2237 sizeof(struct drm_xe_mem_range_attr)))))) 2238 return -EINVAL; 2239 2240 vm = xe_vm_lookup(xef, args->vm_id); 2241 if (XE_IOCTL_DBG(xe, !vm)) 2242 return -EINVAL; 2243 2244 err = down_read_interruptible(&vm->lock); 2245 if (err) 2246 goto put_vm; 2247 2248 attrs_user = u64_to_user_ptr(args->vector_of_mem_attr); 2249 2250 if (args->num_mem_ranges == 0 && !attrs_user) { 2251 args->num_mem_ranges = xe_vm_query_vmas(vm, args->start, args->start + args->range); 2252 args->sizeof_mem_range_attr = sizeof(struct drm_xe_mem_range_attr); 2253 goto unlock_vm; 2254 } 2255 2256 mem_attrs = kvmalloc_array(args->num_mem_ranges, args->sizeof_mem_range_attr, 2257 GFP_KERNEL | __GFP_ACCOUNT | 2258 __GFP_RETRY_MAYFAIL | __GFP_NOWARN); 2259 if (!mem_attrs) { 2260 err = args->num_mem_ranges > 1 ? -ENOBUFS : -ENOMEM; 2261 goto unlock_vm; 2262 } 2263 2264 memset(mem_attrs, 0, args->num_mem_ranges * args->sizeof_mem_range_attr); 2265 err = get_mem_attrs(vm, &args->num_mem_ranges, args->start, 2266 args->start + args->range, mem_attrs); 2267 if (err) 2268 goto free_mem_attrs; 2269 2270 err = copy_to_user(attrs_user, mem_attrs, 2271 args->sizeof_mem_range_attr * args->num_mem_ranges); 2272 if (err) 2273 err = -EFAULT; 2274 2275 free_mem_attrs: 2276 kvfree(mem_attrs); 2277 unlock_vm: 2278 up_read(&vm->lock); 2279 put_vm: 2280 xe_vm_put(vm); 2281 return err; 2282 } 2283 2284 static bool vma_matches(struct xe_vma *vma, u64 page_addr) 2285 { 2286 if (page_addr > xe_vma_end(vma) - 1 || 2287 page_addr + SZ_4K - 1 < xe_vma_start(vma)) 2288 return false; 2289 2290 return true; 2291 } 2292 2293 /** 2294 * xe_vm_find_vma_by_addr() - Find a VMA by its address 2295 * 2296 * @vm: the xe_vm the vma belongs to 2297 * @page_addr: address to look up 2298 */ 2299 struct xe_vma *xe_vm_find_vma_by_addr(struct xe_vm *vm, u64 page_addr) 2300 { 2301 struct xe_vma *vma = NULL; 2302 2303 if (vm->usm.last_fault_vma) { /* Fast lookup */ 2304 if (vma_matches(vm->usm.last_fault_vma, page_addr)) 2305 vma = vm->usm.last_fault_vma; 2306 } 2307 if (!vma) 2308 vma = xe_vm_find_overlapping_vma(vm, page_addr, SZ_4K); 2309 2310 return vma; 2311 } 2312 2313 static const u32 region_to_mem_type[] = { 2314 XE_PL_TT, 2315 XE_PL_VRAM0, 2316 XE_PL_VRAM1, 2317 }; 2318 2319 static void prep_vma_destroy(struct xe_vm *vm, struct xe_vma *vma, 2320 bool post_commit) 2321 { 2322 xe_svm_notifier_lock(vm); 2323 vma->gpuva.flags |= XE_VMA_DESTROYED; 2324 xe_svm_notifier_unlock(vm); 2325 if (post_commit) 2326 xe_vm_remove_vma(vm, vma); 2327 } 2328 2329 #undef ULL 2330 #define ULL unsigned long long 2331 2332 #if IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM) 2333 static void print_op(struct xe_device *xe, struct drm_gpuva_op *op) 2334 { 2335 struct xe_vma *vma; 2336 2337 switch (op->op) { 2338 case DRM_GPUVA_OP_MAP: 2339 vm_dbg(&xe->drm, "MAP: addr=0x%016llx, range=0x%016llx", 2340 (ULL)op->map.va.addr, (ULL)op->map.va.range); 2341 break; 2342 case DRM_GPUVA_OP_REMAP: 2343 vma = gpuva_to_vma(op->remap.unmap->va); 2344 vm_dbg(&xe->drm, "REMAP:UNMAP: addr=0x%016llx, range=0x%016llx, keep=%d", 2345 (ULL)xe_vma_start(vma), (ULL)xe_vma_size(vma), 2346 op->remap.unmap->keep ? 1 : 0); 2347 if (op->remap.prev) 2348 vm_dbg(&xe->drm, 2349 "REMAP:PREV: addr=0x%016llx, range=0x%016llx", 2350 (ULL)op->remap.prev->va.addr, 2351 (ULL)op->remap.prev->va.range); 2352 if (op->remap.next) 2353 vm_dbg(&xe->drm, 2354 "REMAP:NEXT: addr=0x%016llx, range=0x%016llx", 2355 (ULL)op->remap.next->va.addr, 2356 (ULL)op->remap.next->va.range); 2357 break; 2358 case DRM_GPUVA_OP_UNMAP: 2359 vma = gpuva_to_vma(op->unmap.va); 2360 vm_dbg(&xe->drm, "UNMAP: addr=0x%016llx, range=0x%016llx, keep=%d", 2361 (ULL)xe_vma_start(vma), (ULL)xe_vma_size(vma), 2362 op->unmap.keep ? 1 : 0); 2363 break; 2364 case DRM_GPUVA_OP_PREFETCH: 2365 vma = gpuva_to_vma(op->prefetch.va); 2366 vm_dbg(&xe->drm, "PREFETCH: addr=0x%016llx, range=0x%016llx", 2367 (ULL)xe_vma_start(vma), (ULL)xe_vma_size(vma)); 2368 break; 2369 default: 2370 drm_warn(&xe->drm, "NOT POSSIBLE\n"); 2371 } 2372 } 2373 #else 2374 static void print_op(struct xe_device *xe, struct drm_gpuva_op *op) 2375 { 2376 } 2377 #endif 2378 2379 static bool __xe_vm_needs_clear_scratch_pages(struct xe_vm *vm, u32 bind_flags) 2380 { 2381 if (!xe_vm_in_fault_mode(vm)) 2382 return false; 2383 2384 if (!xe_vm_has_scratch(vm)) 2385 return false; 2386 2387 if (bind_flags & DRM_XE_VM_BIND_FLAG_IMMEDIATE) 2388 return false; 2389 2390 return true; 2391 } 2392 2393 static void xe_svm_prefetch_gpuva_ops_fini(struct drm_gpuva_ops *ops) 2394 { 2395 struct drm_gpuva_op *__op; 2396 2397 drm_gpuva_for_each_op(__op, ops) { 2398 struct xe_vma_op *op = gpuva_op_to_vma_op(__op); 2399 2400 xe_vma_svm_prefetch_op_fini(op); 2401 } 2402 } 2403 2404 /* 2405 * Create operations list from IOCTL arguments, setup operations fields so parse 2406 * and commit steps are decoupled from IOCTL arguments. This step can fail. 2407 */ 2408 static struct drm_gpuva_ops * 2409 vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_vma_ops *vops, 2410 struct xe_bo *bo, u64 bo_offset_or_userptr, 2411 u64 addr, u64 range, 2412 u32 operation, u32 flags, 2413 u32 prefetch_region, u16 pat_index) 2414 { 2415 struct drm_gem_object *obj = bo ? &bo->ttm.base : NULL; 2416 struct drm_gpuva_ops *ops; 2417 struct drm_gpuva_op *__op; 2418 struct drm_gpuvm_bo *vm_bo; 2419 u64 range_start = addr; 2420 u64 range_end = addr + range; 2421 int err; 2422 2423 lockdep_assert_held_write(&vm->lock); 2424 2425 vm_dbg(&vm->xe->drm, 2426 "op=%d, addr=0x%016llx, range=0x%016llx, bo_offset_or_userptr=0x%016llx", 2427 operation, (ULL)addr, (ULL)range, 2428 (ULL)bo_offset_or_userptr); 2429 2430 switch (operation) { 2431 case DRM_XE_VM_BIND_OP_MAP: 2432 if (flags & DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR) { 2433 xe_vm_find_cpu_addr_mirror_vma_range(vm, &range_start, &range_end); 2434 vops->flags |= XE_VMA_OPS_FLAG_ALLOW_SVM_UNMAP; 2435 } 2436 2437 fallthrough; 2438 case DRM_XE_VM_BIND_OP_MAP_USERPTR: { 2439 struct drm_gpuvm_map_req map_req = { 2440 .map.va.addr = range_start, 2441 .map.va.range = range_end - range_start, 2442 .map.gem.obj = obj, 2443 .map.gem.offset = bo_offset_or_userptr, 2444 }; 2445 2446 ops = drm_gpuvm_sm_map_ops_create(&vm->gpuvm, &map_req); 2447 break; 2448 } 2449 case DRM_XE_VM_BIND_OP_UNMAP: 2450 ops = drm_gpuvm_sm_unmap_ops_create(&vm->gpuvm, addr, range); 2451 break; 2452 case DRM_XE_VM_BIND_OP_PREFETCH: 2453 ops = drm_gpuvm_prefetch_ops_create(&vm->gpuvm, addr, range); 2454 break; 2455 case DRM_XE_VM_BIND_OP_UNMAP_ALL: 2456 xe_assert(vm->xe, bo); 2457 2458 err = xe_bo_lock(bo, true); 2459 if (err) 2460 return ERR_PTR(err); 2461 2462 vm_bo = drm_gpuvm_bo_obtain_locked(&vm->gpuvm, obj); 2463 if (IS_ERR(vm_bo)) { 2464 xe_bo_unlock(bo); 2465 return ERR_CAST(vm_bo); 2466 } 2467 2468 ops = drm_gpuvm_bo_unmap_ops_create(vm_bo); 2469 drm_gpuvm_bo_put(vm_bo); 2470 xe_bo_unlock(bo); 2471 break; 2472 default: 2473 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n"); 2474 ops = ERR_PTR(-EINVAL); 2475 } 2476 if (IS_ERR(ops)) 2477 return ops; 2478 2479 drm_gpuva_for_each_op(__op, ops) { 2480 struct xe_vma_op *op = gpuva_op_to_vma_op(__op); 2481 2482 if (__op->op == DRM_GPUVA_OP_MAP) { 2483 op->map.immediate = 2484 flags & DRM_XE_VM_BIND_FLAG_IMMEDIATE; 2485 if (flags & DRM_XE_VM_BIND_FLAG_READONLY) 2486 op->map.vma_flags |= XE_VMA_READ_ONLY; 2487 if (flags & DRM_XE_VM_BIND_FLAG_NULL) 2488 op->map.vma_flags |= DRM_GPUVA_SPARSE; 2489 if (flags & DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR) 2490 op->map.vma_flags |= XE_VMA_SYSTEM_ALLOCATOR; 2491 if (flags & DRM_XE_VM_BIND_FLAG_DUMPABLE) 2492 op->map.vma_flags |= XE_VMA_DUMPABLE; 2493 if (flags & DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET) 2494 op->map.vma_flags |= XE_VMA_MADV_AUTORESET; 2495 op->map.request_decompress = flags & DRM_XE_VM_BIND_FLAG_DECOMPRESS; 2496 op->map.pat_index = pat_index; 2497 op->map.invalidate_on_bind = 2498 __xe_vm_needs_clear_scratch_pages(vm, flags); 2499 } else if (__op->op == DRM_GPUVA_OP_PREFETCH) { 2500 struct xe_vma *vma = gpuva_to_vma(op->base.prefetch.va); 2501 struct xe_tile *tile; 2502 struct xe_svm_range *svm_range; 2503 struct drm_gpusvm_ctx ctx = {}; 2504 struct drm_pagemap *dpagemap = NULL; 2505 u8 id, tile_mask = 0; 2506 u32 i; 2507 2508 if (!xe_vma_is_cpu_addr_mirror(vma)) { 2509 op->prefetch.region = prefetch_region; 2510 break; 2511 } 2512 2513 ctx.read_only = xe_vma_read_only(vma); 2514 ctx.devmem_possible = IS_DGFX(vm->xe) && 2515 IS_ENABLED(CONFIG_DRM_XE_PAGEMAP); 2516 2517 for_each_tile(tile, vm->xe, id) 2518 tile_mask |= 0x1 << id; 2519 2520 xa_init_flags(&op->prefetch_range.range, XA_FLAGS_ALLOC); 2521 op->prefetch_range.ranges_count = 0; 2522 2523 if (prefetch_region == DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC) { 2524 dpagemap = xe_vma_resolve_pagemap(vma, 2525 xe_device_get_root_tile(vm->xe)); 2526 } else if (prefetch_region) { 2527 tile = &vm->xe->tiles[region_to_mem_type[prefetch_region] - 2528 XE_PL_VRAM0]; 2529 dpagemap = xe_tile_local_pagemap(tile); 2530 } 2531 2532 op->prefetch_range.dpagemap = dpagemap; 2533 alloc_next_range: 2534 svm_range = xe_svm_range_find_or_insert(vm, addr, vma, &ctx); 2535 2536 if (PTR_ERR(svm_range) == -ENOENT) { 2537 u64 ret = xe_svm_find_vma_start(vm, addr, range_end, vma); 2538 2539 addr = ret == ULONG_MAX ? 0 : ret; 2540 if (addr) 2541 goto alloc_next_range; 2542 else 2543 goto print_op_label; 2544 } 2545 2546 if (IS_ERR(svm_range)) { 2547 err = PTR_ERR(svm_range); 2548 goto unwind_prefetch_ops; 2549 } 2550 2551 if (xe_svm_range_validate(vm, svm_range, tile_mask, dpagemap)) { 2552 xe_svm_range_debug(svm_range, "PREFETCH - RANGE IS VALID"); 2553 goto check_next_range; 2554 } 2555 2556 err = xa_alloc(&op->prefetch_range.range, 2557 &i, svm_range, xa_limit_32b, 2558 GFP_KERNEL); 2559 2560 if (err) 2561 goto unwind_prefetch_ops; 2562 2563 op->prefetch_range.ranges_count++; 2564 vops->flags |= XE_VMA_OPS_FLAG_HAS_SVM_PREFETCH; 2565 xe_svm_range_debug(svm_range, "PREFETCH - RANGE CREATED"); 2566 check_next_range: 2567 if (range_end > xe_svm_range_end(svm_range) && 2568 xe_svm_range_end(svm_range) < xe_vma_end(vma)) { 2569 addr = xe_svm_range_end(svm_range); 2570 goto alloc_next_range; 2571 } 2572 } 2573 print_op_label: 2574 print_op(vm->xe, __op); 2575 } 2576 2577 return ops; 2578 2579 unwind_prefetch_ops: 2580 xe_svm_prefetch_gpuva_ops_fini(ops); 2581 drm_gpuva_ops_free(&vm->gpuvm, ops); 2582 return ERR_PTR(err); 2583 } 2584 2585 ALLOW_ERROR_INJECTION(vm_bind_ioctl_ops_create, ERRNO); 2586 2587 static struct xe_vma *new_vma(struct xe_vm *vm, struct drm_gpuva_op_map *op, 2588 struct xe_vma_mem_attr *attr, unsigned int flags) 2589 { 2590 struct xe_bo *bo = op->gem.obj ? gem_to_xe_bo(op->gem.obj) : NULL; 2591 struct xe_validation_ctx ctx; 2592 struct drm_exec exec; 2593 struct xe_vma *vma; 2594 int err = 0; 2595 2596 lockdep_assert_held_write(&vm->lock); 2597 2598 if (bo) { 2599 err = 0; 2600 xe_validation_guard(&ctx, &vm->xe->val, &exec, 2601 (struct xe_val_flags) {.interruptible = true}, err) { 2602 if (!bo->vm) { 2603 err = drm_exec_lock_obj(&exec, xe_vm_obj(vm)); 2604 drm_exec_retry_on_contention(&exec); 2605 } 2606 if (!err) { 2607 err = drm_exec_lock_obj(&exec, &bo->ttm.base); 2608 drm_exec_retry_on_contention(&exec); 2609 } 2610 if (err) 2611 return ERR_PTR(err); 2612 2613 vma = xe_vma_create(vm, bo, op->gem.offset, 2614 op->va.addr, op->va.addr + 2615 op->va.range - 1, attr, flags); 2616 if (IS_ERR(vma)) 2617 return vma; 2618 2619 if (!bo->vm) { 2620 err = add_preempt_fences(vm, bo); 2621 if (err) { 2622 prep_vma_destroy(vm, vma, false); 2623 xe_vma_destroy(vma, NULL); 2624 } 2625 } 2626 } 2627 if (err) 2628 return ERR_PTR(err); 2629 } else { 2630 vma = xe_vma_create(vm, NULL, op->gem.offset, 2631 op->va.addr, op->va.addr + 2632 op->va.range - 1, attr, flags); 2633 if (IS_ERR(vma)) 2634 return vma; 2635 2636 if (xe_vma_is_userptr(vma)) { 2637 err = xe_vma_userptr_pin_pages(to_userptr_vma(vma)); 2638 /* 2639 * -EBUSY has dedicated meaning that a user fence 2640 * attached to the VMA is busy, in practice 2641 * xe_vma_userptr_pin_pages can only fail with -EBUSY if 2642 * we are low on memory so convert this to -ENOMEM. 2643 */ 2644 if (err == -EBUSY) 2645 err = -ENOMEM; 2646 } 2647 } 2648 if (err) { 2649 prep_vma_destroy(vm, vma, false); 2650 xe_vma_destroy_unlocked(vma); 2651 vma = ERR_PTR(err); 2652 } 2653 2654 return vma; 2655 } 2656 2657 static u64 xe_vma_max_pte_size(struct xe_vma *vma) 2658 { 2659 if (vma->gpuva.flags & XE_VMA_PTE_1G) 2660 return SZ_1G; 2661 else if (vma->gpuva.flags & (XE_VMA_PTE_2M | XE_VMA_PTE_COMPACT)) 2662 return SZ_2M; 2663 else if (vma->gpuva.flags & XE_VMA_PTE_64K) 2664 return SZ_64K; 2665 else if (vma->gpuva.flags & XE_VMA_PTE_4K) 2666 return SZ_4K; 2667 2668 return SZ_1G; /* Uninitialized, used max size */ 2669 } 2670 2671 static void xe_vma_set_pte_size(struct xe_vma *vma, u64 size) 2672 { 2673 switch (size) { 2674 case SZ_1G: 2675 vma->gpuva.flags |= XE_VMA_PTE_1G; 2676 break; 2677 case SZ_2M: 2678 vma->gpuva.flags |= XE_VMA_PTE_2M; 2679 break; 2680 case SZ_64K: 2681 vma->gpuva.flags |= XE_VMA_PTE_64K; 2682 break; 2683 case SZ_4K: 2684 vma->gpuva.flags |= XE_VMA_PTE_4K; 2685 break; 2686 } 2687 } 2688 2689 static int xe_vma_op_commit(struct xe_vm *vm, struct xe_vma_op *op) 2690 { 2691 int err = 0; 2692 2693 lockdep_assert_held_write(&vm->lock); 2694 2695 switch (op->base.op) { 2696 case DRM_GPUVA_OP_MAP: 2697 err |= xe_vm_insert_vma(vm, op->map.vma); 2698 if (!err) 2699 op->flags |= XE_VMA_OP_COMMITTED; 2700 break; 2701 case DRM_GPUVA_OP_REMAP: 2702 { 2703 u8 tile_present = 2704 gpuva_to_vma(op->base.remap.unmap->va)->tile_present; 2705 2706 prep_vma_destroy(vm, gpuva_to_vma(op->base.remap.unmap->va), 2707 true); 2708 op->flags |= XE_VMA_OP_COMMITTED; 2709 2710 if (op->remap.prev) { 2711 err |= xe_vm_insert_vma(vm, op->remap.prev); 2712 if (!err) 2713 op->flags |= XE_VMA_OP_PREV_COMMITTED; 2714 if (!err && op->remap.skip_prev) { 2715 op->remap.prev->tile_present = 2716 tile_present; 2717 } 2718 } 2719 if (op->remap.next) { 2720 err |= xe_vm_insert_vma(vm, op->remap.next); 2721 if (!err) 2722 op->flags |= XE_VMA_OP_NEXT_COMMITTED; 2723 if (!err && op->remap.skip_next) { 2724 op->remap.next->tile_present = 2725 tile_present; 2726 } 2727 } 2728 2729 /* 2730 * Adjust for partial unbind after removing VMA from VM. In case 2731 * of unwind we might need to undo this later. 2732 */ 2733 if (!err) { 2734 op->base.remap.unmap->va->va.addr = op->remap.start; 2735 op->base.remap.unmap->va->va.range = op->remap.range; 2736 } 2737 break; 2738 } 2739 case DRM_GPUVA_OP_UNMAP: 2740 prep_vma_destroy(vm, gpuva_to_vma(op->base.unmap.va), true); 2741 op->flags |= XE_VMA_OP_COMMITTED; 2742 break; 2743 case DRM_GPUVA_OP_PREFETCH: 2744 op->flags |= XE_VMA_OP_COMMITTED; 2745 break; 2746 default: 2747 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n"); 2748 } 2749 2750 return err; 2751 } 2752 2753 /** 2754 * xe_vma_has_default_mem_attrs - Check if a VMA has default memory attributes 2755 * @vma: Pointer to the xe_vma structure to check 2756 * 2757 * This function determines whether the given VMA (Virtual Memory Area) 2758 * has its memory attributes set to their default values. Specifically, 2759 * it checks the following conditions: 2760 * 2761 * - `atomic_access` is `DRM_XE_VMA_ATOMIC_UNDEFINED` 2762 * - `pat_index` is equal to `default_pat_index` 2763 * - `preferred_loc.devmem_fd` is `DRM_XE_PREFERRED_LOC_DEFAULT_DEVICE` 2764 * - `preferred_loc.migration_policy` is `DRM_XE_MIGRATE_ALL_PAGES` 2765 * 2766 * Return: true if all attributes are at their default values, false otherwise. 2767 */ 2768 bool xe_vma_has_default_mem_attrs(struct xe_vma *vma) 2769 { 2770 return (vma->attr.atomic_access == DRM_XE_ATOMIC_UNDEFINED && 2771 vma->attr.pat_index == vma->attr.default_pat_index && 2772 vma->attr.preferred_loc.devmem_fd == DRM_XE_PREFERRED_LOC_DEFAULT_DEVICE && 2773 vma->attr.preferred_loc.migration_policy == DRM_XE_MIGRATE_ALL_PAGES); 2774 } 2775 2776 static int vm_bind_ioctl_ops_parse(struct xe_vm *vm, struct drm_gpuva_ops *ops, 2777 struct xe_vma_ops *vops) 2778 { 2779 struct xe_device *xe = vm->xe; 2780 struct drm_gpuva_op *__op; 2781 struct xe_tile *tile; 2782 u8 id, tile_mask = 0; 2783 int err = 0; 2784 2785 lockdep_assert_held_write(&vm->lock); 2786 2787 for_each_tile(tile, vm->xe, id) 2788 tile_mask |= 0x1 << id; 2789 2790 drm_gpuva_for_each_op(__op, ops) { 2791 struct xe_vma_op *op = gpuva_op_to_vma_op(__op); 2792 struct xe_vma *vma; 2793 unsigned int flags = 0; 2794 2795 INIT_LIST_HEAD(&op->link); 2796 list_add_tail(&op->link, &vops->list); 2797 op->tile_mask = tile_mask; 2798 2799 switch (op->base.op) { 2800 case DRM_GPUVA_OP_MAP: 2801 { 2802 struct xe_vma_mem_attr default_attr = { 2803 .preferred_loc = { 2804 .devmem_fd = DRM_XE_PREFERRED_LOC_DEFAULT_DEVICE, 2805 .migration_policy = DRM_XE_MIGRATE_ALL_PAGES, 2806 }, 2807 .atomic_access = DRM_XE_ATOMIC_UNDEFINED, 2808 .default_pat_index = op->map.pat_index, 2809 .pat_index = op->map.pat_index, 2810 .purgeable_state = XE_MADV_PURGEABLE_WILLNEED, 2811 }; 2812 2813 flags |= op->map.vma_flags & XE_VMA_CREATE_MASK; 2814 2815 vma = new_vma(vm, &op->base.map, &default_attr, 2816 flags); 2817 if (IS_ERR(vma)) 2818 return PTR_ERR(vma); 2819 2820 op->map.vma = vma; 2821 if (((op->map.immediate || !xe_vm_in_fault_mode(vm)) && 2822 !(op->map.vma_flags & XE_VMA_SYSTEM_ALLOCATOR)) || 2823 op->map.invalidate_on_bind) 2824 xe_vma_ops_incr_pt_update_ops(vops, 2825 op->tile_mask, 1); 2826 break; 2827 } 2828 case DRM_GPUVA_OP_REMAP: 2829 { 2830 struct xe_vma *old = 2831 gpuva_to_vma(op->base.remap.unmap->va); 2832 bool skip = xe_vma_is_cpu_addr_mirror(old); 2833 u64 start = xe_vma_start(old), end = xe_vma_end(old); 2834 int num_remap_ops = 0; 2835 2836 if (op->base.remap.prev) 2837 start = op->base.remap.prev->va.addr + 2838 op->base.remap.prev->va.range; 2839 if (op->base.remap.next) 2840 end = op->base.remap.next->va.addr; 2841 2842 if (xe_vma_is_cpu_addr_mirror(old) && 2843 xe_svm_has_mapping(vm, start, end)) { 2844 if (vops->flags & XE_VMA_OPS_FLAG_MADVISE) 2845 xe_svm_unmap_address_range(vm, start, end); 2846 else 2847 return -EBUSY; 2848 } 2849 2850 op->remap.start = xe_vma_start(old); 2851 op->remap.range = xe_vma_size(old); 2852 op->remap.old_start = op->remap.start; 2853 op->remap.old_range = op->remap.range; 2854 2855 flags |= op->base.remap.unmap->va->flags & XE_VMA_CREATE_MASK; 2856 if (op->base.remap.prev) { 2857 vma = new_vma(vm, op->base.remap.prev, 2858 &old->attr, flags); 2859 if (IS_ERR(vma)) 2860 return PTR_ERR(vma); 2861 2862 op->remap.prev = vma; 2863 2864 /* 2865 * Userptr creates a new SG mapping so 2866 * we must also rebind. 2867 */ 2868 op->remap.skip_prev = skip || 2869 (!xe_vma_is_userptr(old) && 2870 IS_ALIGNED(xe_vma_end(vma), 2871 xe_vma_max_pte_size(old))); 2872 if (op->remap.skip_prev) { 2873 xe_vma_set_pte_size(vma, xe_vma_max_pte_size(old)); 2874 op->remap.range -= 2875 xe_vma_end(vma) - 2876 xe_vma_start(old); 2877 op->remap.start = xe_vma_end(vma); 2878 vm_dbg(&xe->drm, "REMAP:SKIP_PREV: addr=0x%016llx, range=0x%016llx", 2879 (ULL)op->remap.start, 2880 (ULL)op->remap.range); 2881 } else { 2882 num_remap_ops++; 2883 } 2884 } 2885 2886 if (op->base.remap.next) { 2887 vma = new_vma(vm, op->base.remap.next, 2888 &old->attr, flags); 2889 if (IS_ERR(vma)) 2890 return PTR_ERR(vma); 2891 2892 op->remap.next = vma; 2893 2894 /* 2895 * Userptr creates a new SG mapping so 2896 * we must also rebind. 2897 */ 2898 op->remap.skip_next = skip || 2899 (!xe_vma_is_userptr(old) && 2900 IS_ALIGNED(xe_vma_start(vma), 2901 xe_vma_max_pte_size(old))); 2902 if (op->remap.skip_next) { 2903 xe_vma_set_pte_size(vma, xe_vma_max_pte_size(old)); 2904 op->remap.range -= 2905 xe_vma_end(old) - 2906 xe_vma_start(vma); 2907 vm_dbg(&xe->drm, "REMAP:SKIP_NEXT: addr=0x%016llx, range=0x%016llx", 2908 (ULL)op->remap.start, 2909 (ULL)op->remap.range); 2910 } else { 2911 num_remap_ops++; 2912 } 2913 } 2914 if (!skip) 2915 num_remap_ops++; 2916 2917 xe_vma_ops_incr_pt_update_ops(vops, op->tile_mask, num_remap_ops); 2918 break; 2919 } 2920 case DRM_GPUVA_OP_UNMAP: 2921 vma = gpuva_to_vma(op->base.unmap.va); 2922 2923 if (xe_vma_is_cpu_addr_mirror(vma) && 2924 xe_svm_has_mapping(vm, xe_vma_start(vma), 2925 xe_vma_end(vma)) && 2926 !(vops->flags & XE_VMA_OPS_FLAG_ALLOW_SVM_UNMAP)) 2927 return -EBUSY; 2928 2929 if (!xe_vma_is_cpu_addr_mirror(vma)) 2930 xe_vma_ops_incr_pt_update_ops(vops, op->tile_mask, 1); 2931 break; 2932 case DRM_GPUVA_OP_PREFETCH: 2933 vma = gpuva_to_vma(op->base.prefetch.va); 2934 2935 if (xe_vma_is_userptr(vma)) { 2936 err = xe_vma_userptr_pin_pages(to_userptr_vma(vma)); 2937 if (err) 2938 return err; 2939 } 2940 2941 if (xe_vma_is_cpu_addr_mirror(vma)) 2942 xe_vma_ops_incr_pt_update_ops(vops, op->tile_mask, 2943 op->prefetch_range.ranges_count); 2944 else 2945 xe_vma_ops_incr_pt_update_ops(vops, op->tile_mask, 1); 2946 2947 break; 2948 default: 2949 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n"); 2950 } 2951 2952 err = xe_vma_op_commit(vm, op); 2953 if (err) 2954 return err; 2955 } 2956 2957 return 0; 2958 } 2959 2960 static void xe_vma_op_unwind(struct xe_vm *vm, struct xe_vma_op *op, 2961 bool post_commit, bool prev_post_commit, 2962 bool next_post_commit) 2963 { 2964 lockdep_assert_held_write(&vm->lock); 2965 2966 switch (op->base.op) { 2967 case DRM_GPUVA_OP_MAP: 2968 if (op->map.vma) { 2969 prep_vma_destroy(vm, op->map.vma, post_commit); 2970 xe_vma_destroy_unlocked(op->map.vma); 2971 } 2972 break; 2973 case DRM_GPUVA_OP_UNMAP: 2974 { 2975 struct xe_vma *vma = gpuva_to_vma(op->base.unmap.va); 2976 2977 if (vma) { 2978 xe_svm_notifier_lock(vm); 2979 vma->gpuva.flags &= ~XE_VMA_DESTROYED; 2980 xe_svm_notifier_unlock(vm); 2981 if (post_commit) 2982 xe_vm_insert_vma(vm, vma); 2983 } 2984 break; 2985 } 2986 case DRM_GPUVA_OP_REMAP: 2987 { 2988 struct xe_vma *vma = gpuva_to_vma(op->base.remap.unmap->va); 2989 2990 if (op->remap.prev) { 2991 prep_vma_destroy(vm, op->remap.prev, prev_post_commit); 2992 xe_vma_destroy_unlocked(op->remap.prev); 2993 } 2994 if (op->remap.next) { 2995 prep_vma_destroy(vm, op->remap.next, next_post_commit); 2996 xe_vma_destroy_unlocked(op->remap.next); 2997 } 2998 if (vma) { 2999 xe_svm_notifier_lock(vm); 3000 vma->gpuva.flags &= ~XE_VMA_DESTROYED; 3001 xe_svm_notifier_unlock(vm); 3002 if (post_commit) { 3003 /* 3004 * Restore the old va range, in case of the 3005 * prev/next skip optimisation. Otherwise what 3006 * we re-insert here could be smaller than the 3007 * original range. 3008 */ 3009 op->base.remap.unmap->va->va.addr = 3010 op->remap.old_start; 3011 op->base.remap.unmap->va->va.range = 3012 op->remap.old_range; 3013 xe_vm_insert_vma(vm, vma); 3014 } 3015 } 3016 break; 3017 } 3018 case DRM_GPUVA_OP_PREFETCH: 3019 /* Nothing to do */ 3020 break; 3021 default: 3022 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n"); 3023 } 3024 } 3025 3026 static void vm_bind_ioctl_ops_unwind(struct xe_vm *vm, 3027 struct drm_gpuva_ops **ops, 3028 int num_ops_list) 3029 { 3030 int i; 3031 3032 for (i = num_ops_list - 1; i >= 0; --i) { 3033 struct drm_gpuva_ops *__ops = ops[i]; 3034 struct drm_gpuva_op *__op; 3035 3036 if (!__ops) 3037 continue; 3038 3039 drm_gpuva_for_each_op_reverse(__op, __ops) { 3040 struct xe_vma_op *op = gpuva_op_to_vma_op(__op); 3041 3042 xe_vma_op_unwind(vm, op, 3043 op->flags & XE_VMA_OP_COMMITTED, 3044 op->flags & XE_VMA_OP_PREV_COMMITTED, 3045 op->flags & XE_VMA_OP_NEXT_COMMITTED); 3046 } 3047 } 3048 } 3049 3050 /** 3051 * struct xe_vma_lock_and_validate_flags - Flags for vma_lock_and_validate() 3052 * @res_evict: Allow evicting resources during validation 3053 * @validate: Perform BO validation 3054 * @request_decompress: Request BO decompression 3055 * @check_purged: Reject operation if BO is DONTNEED or PURGED 3056 */ 3057 struct xe_vma_lock_and_validate_flags { 3058 u32 res_evict : 1; 3059 u32 validate : 1; 3060 u32 request_decompress : 1; 3061 u32 check_purged : 1; 3062 }; 3063 3064 static int vma_lock_and_validate(struct drm_exec *exec, struct xe_vma *vma, 3065 struct xe_vma_lock_and_validate_flags flags) 3066 { 3067 struct xe_bo *bo = xe_vma_bo(vma); 3068 struct xe_vm *vm = xe_vma_vm(vma); 3069 bool validate_bo = flags.validate; 3070 int err = 0; 3071 3072 if (bo) { 3073 if (!bo->vm) 3074 err = drm_exec_lock_obj(exec, &bo->ttm.base); 3075 3076 /* Reject new mappings to DONTNEED/purged BOs; allow cleanup operations */ 3077 if (!err && flags.check_purged) { 3078 if (xe_bo_madv_is_dontneed(bo)) 3079 err = -EBUSY; /* BO marked purgeable */ 3080 else if (xe_bo_is_purged(bo)) 3081 err = -EINVAL; /* BO already purged */ 3082 } 3083 3084 /* Don't validate the BO for DONTNEED/PURGED remap remnants. */ 3085 if (vma->attr.purgeable_state != XE_MADV_PURGEABLE_WILLNEED) 3086 validate_bo = false; 3087 3088 if (!err && validate_bo) 3089 err = xe_bo_validate(bo, vm, 3090 xe_vm_allow_vm_eviction(vm) && 3091 flags.res_evict, exec); 3092 3093 if (err) 3094 return err; 3095 3096 if (flags.request_decompress) 3097 err = xe_bo_decompress(bo); 3098 } 3099 3100 return err; 3101 } 3102 3103 static int check_ufence(struct xe_vma *vma) 3104 { 3105 if (vma->ufence) { 3106 struct xe_user_fence * const f = vma->ufence; 3107 3108 if (!xe_sync_ufence_get_status(f)) 3109 return -EBUSY; 3110 3111 vma->ufence = NULL; 3112 xe_sync_ufence_put(f); 3113 } 3114 3115 return 0; 3116 } 3117 3118 static int prefetch_ranges(struct xe_vm *vm, struct xe_vma_op *op) 3119 { 3120 bool devmem_possible = IS_DGFX(vm->xe) && IS_ENABLED(CONFIG_DRM_XE_PAGEMAP); 3121 struct xe_vma *vma = gpuva_to_vma(op->base.prefetch.va); 3122 struct drm_pagemap *dpagemap = op->prefetch_range.dpagemap; 3123 int err = 0; 3124 3125 struct xe_svm_range *svm_range; 3126 struct drm_gpusvm_ctx ctx = {}; 3127 unsigned long i; 3128 3129 if (!xe_vma_is_cpu_addr_mirror(vma)) 3130 return 0; 3131 3132 ctx.read_only = xe_vma_read_only(vma); 3133 ctx.devmem_possible = devmem_possible; 3134 ctx.check_pages_threshold = devmem_possible ? SZ_64K : 0; 3135 ctx.device_private_page_owner = xe_svm_private_page_owner(vm, !dpagemap); 3136 3137 /* TODO: Threading the migration */ 3138 xa_for_each(&op->prefetch_range.range, i, svm_range) { 3139 if (!dpagemap) 3140 xe_svm_range_migrate_to_smem(vm, svm_range); 3141 3142 if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM)) { 3143 drm_dbg(&vm->xe->drm, 3144 "Prefetch pagemap is %s start 0x%016lx end 0x%016lx\n", 3145 dpagemap ? dpagemap->drm->unique : "system", 3146 xe_svm_range_start(svm_range), xe_svm_range_end(svm_range)); 3147 } 3148 3149 if (xe_svm_range_needs_migrate_to_vram(svm_range, vma, dpagemap)) { 3150 err = xe_svm_alloc_vram(svm_range, &ctx, dpagemap); 3151 if (err) { 3152 drm_dbg(&vm->xe->drm, "VRAM allocation failed, retry from userspace, asid=%u, gpusvm=%p, errno=%pe\n", 3153 vm->usm.asid, &vm->svm.gpusvm, ERR_PTR(err)); 3154 return -ENODATA; 3155 } 3156 xe_svm_range_debug(svm_range, "PREFETCH - RANGE MIGRATED TO VRAM"); 3157 } 3158 3159 err = xe_svm_range_get_pages(vm, svm_range, &ctx); 3160 if (err) { 3161 drm_dbg(&vm->xe->drm, "Get pages failed, asid=%u, gpusvm=%p, errno=%pe\n", 3162 vm->usm.asid, &vm->svm.gpusvm, ERR_PTR(err)); 3163 if (err == -EOPNOTSUPP || err == -EFAULT || err == -EPERM) 3164 err = -ENODATA; 3165 return err; 3166 } 3167 xe_svm_range_debug(svm_range, "PREFETCH - RANGE GET PAGES DONE"); 3168 } 3169 3170 return err; 3171 } 3172 3173 static int op_lock_and_prep(struct drm_exec *exec, struct xe_vm *vm, 3174 struct xe_vma_ops *vops, struct xe_vma_op *op) 3175 { 3176 int err = 0; 3177 bool res_evict; 3178 3179 /* 3180 * We only allow evicting a BO within the VM if it is not part of an 3181 * array of binds, as an array of binds can evict another BO within the 3182 * bind. 3183 */ 3184 res_evict = !(vops->flags & XE_VMA_OPS_ARRAY_OF_BINDS); 3185 3186 switch (op->base.op) { 3187 case DRM_GPUVA_OP_MAP: 3188 if (!op->map.invalidate_on_bind) 3189 err = vma_lock_and_validate(exec, op->map.vma, 3190 (struct xe_vma_lock_and_validate_flags) { 3191 .res_evict = res_evict, 3192 .validate = !xe_vm_in_fault_mode(vm) || 3193 op->map.immediate, 3194 .request_decompress = 3195 op->map.request_decompress, 3196 .check_purged = false, 3197 }); 3198 break; 3199 case DRM_GPUVA_OP_REMAP: 3200 err = check_ufence(gpuva_to_vma(op->base.remap.unmap->va)); 3201 if (err) 3202 break; 3203 3204 err = vma_lock_and_validate(exec, 3205 gpuva_to_vma(op->base.remap.unmap->va), 3206 (struct xe_vma_lock_and_validate_flags) { 3207 .res_evict = res_evict, 3208 .validate = false, 3209 .request_decompress = false, 3210 .check_purged = false, 3211 }); 3212 if (!err && op->remap.prev) 3213 err = vma_lock_and_validate(exec, op->remap.prev, 3214 (struct xe_vma_lock_and_validate_flags) { 3215 .res_evict = res_evict, 3216 .validate = true, 3217 .request_decompress = false, 3218 .check_purged = false, 3219 }); 3220 if (!err && op->remap.next) 3221 err = vma_lock_and_validate(exec, op->remap.next, 3222 (struct xe_vma_lock_and_validate_flags) { 3223 .res_evict = res_evict, 3224 .validate = true, 3225 .request_decompress = false, 3226 .check_purged = false, 3227 }); 3228 break; 3229 case DRM_GPUVA_OP_UNMAP: 3230 err = check_ufence(gpuva_to_vma(op->base.unmap.va)); 3231 if (err) 3232 break; 3233 3234 err = vma_lock_and_validate(exec, 3235 gpuva_to_vma(op->base.unmap.va), 3236 (struct xe_vma_lock_and_validate_flags) { 3237 .res_evict = res_evict, 3238 .validate = false, 3239 .request_decompress = false, 3240 .check_purged = false, 3241 }); 3242 break; 3243 case DRM_GPUVA_OP_PREFETCH: 3244 { 3245 struct xe_vma *vma = gpuva_to_vma(op->base.prefetch.va); 3246 u32 region; 3247 3248 if (!xe_vma_is_cpu_addr_mirror(vma)) { 3249 region = op->prefetch.region; 3250 xe_assert(vm->xe, region == DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC || 3251 region <= ARRAY_SIZE(region_to_mem_type)); 3252 } 3253 3254 /* 3255 * PREFETCH is the only op that still gates on BO purge state. 3256 * MAP/REMAP handle this inside xe_vma_create() so partial 3257 * unbind on a DONTNEED BO still works. PREFETCH skips 3258 * xe_vma_create() and would migrate a BO with no backing 3259 * store, so reject DONTNEED/PURGED here. 3260 */ 3261 err = vma_lock_and_validate(exec, 3262 gpuva_to_vma(op->base.prefetch.va), 3263 (struct xe_vma_lock_and_validate_flags) { 3264 .res_evict = res_evict, 3265 .validate = false, 3266 .request_decompress = false, 3267 .check_purged = true, 3268 }); 3269 if (!err && !xe_vma_has_no_bo(vma)) { 3270 struct xe_bo *bo = xe_vma_bo(vma); 3271 u32 mem_type; 3272 3273 if (region == DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC) { 3274 unsigned int i; 3275 3276 mem_type = XE_PL_TT; 3277 for (i = 0; i < bo->placement.num_placement; i++) { 3278 if (mem_type_is_vram(bo->placements[i].mem_type)) { 3279 mem_type = bo->placements[i].mem_type; 3280 break; 3281 } 3282 } 3283 } else { 3284 mem_type = region_to_mem_type[region]; 3285 } 3286 3287 err = xe_bo_migrate(bo, mem_type, NULL, exec); 3288 } 3289 break; 3290 } 3291 default: 3292 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n"); 3293 } 3294 3295 return err; 3296 } 3297 3298 static int vm_bind_ioctl_ops_prefetch_ranges(struct xe_vm *vm, struct xe_vma_ops *vops) 3299 { 3300 struct xe_vma_op *op; 3301 int err; 3302 3303 if (!(vops->flags & XE_VMA_OPS_FLAG_HAS_SVM_PREFETCH)) 3304 return 0; 3305 3306 list_for_each_entry(op, &vops->list, link) { 3307 if (op->base.op == DRM_GPUVA_OP_PREFETCH) { 3308 err = prefetch_ranges(vm, op); 3309 if (err) 3310 return err; 3311 } 3312 } 3313 3314 return 0; 3315 } 3316 3317 static int vm_bind_ioctl_ops_lock_and_prep(struct drm_exec *exec, 3318 struct xe_vm *vm, 3319 struct xe_vma_ops *vops) 3320 { 3321 struct xe_vma_op *op; 3322 int err; 3323 3324 err = drm_exec_lock_obj(exec, xe_vm_obj(vm)); 3325 if (err) 3326 return err; 3327 3328 list_for_each_entry(op, &vops->list, link) { 3329 err = op_lock_and_prep(exec, vm, vops, op); 3330 if (err) 3331 return err; 3332 } 3333 3334 #ifdef TEST_VM_OPS_ERROR 3335 if (vops->inject_error && 3336 vm->xe->vm_inject_error_position == FORCE_OP_ERROR_LOCK) 3337 return -ENOSPC; 3338 #endif 3339 3340 return 0; 3341 } 3342 3343 static void op_trace(struct xe_vma_op *op) 3344 { 3345 switch (op->base.op) { 3346 case DRM_GPUVA_OP_MAP: 3347 trace_xe_vma_bind(op->map.vma); 3348 break; 3349 case DRM_GPUVA_OP_REMAP: 3350 trace_xe_vma_unbind(gpuva_to_vma(op->base.remap.unmap->va)); 3351 if (op->remap.prev) 3352 trace_xe_vma_bind(op->remap.prev); 3353 if (op->remap.next) 3354 trace_xe_vma_bind(op->remap.next); 3355 break; 3356 case DRM_GPUVA_OP_UNMAP: 3357 trace_xe_vma_unbind(gpuva_to_vma(op->base.unmap.va)); 3358 break; 3359 case DRM_GPUVA_OP_PREFETCH: 3360 trace_xe_vma_bind(gpuva_to_vma(op->base.prefetch.va)); 3361 break; 3362 case DRM_GPUVA_OP_DRIVER: 3363 break; 3364 default: 3365 XE_WARN_ON("NOT POSSIBLE"); 3366 } 3367 } 3368 3369 static void trace_xe_vm_ops_execute(struct xe_vma_ops *vops) 3370 { 3371 struct xe_vma_op *op; 3372 3373 list_for_each_entry(op, &vops->list, link) 3374 op_trace(op); 3375 } 3376 3377 static int vm_ops_setup_tile_args(struct xe_vm *vm, struct xe_vma_ops *vops) 3378 { 3379 struct xe_exec_queue *q = vops->q; 3380 struct xe_tile *tile; 3381 int number_tiles = 0; 3382 u8 id; 3383 3384 for_each_tile(tile, vm->xe, id) { 3385 if (vops->pt_update_ops[id].num_ops) 3386 ++number_tiles; 3387 3388 if (vops->pt_update_ops[id].q) 3389 continue; 3390 3391 if (q) { 3392 vops->pt_update_ops[id].q = q; 3393 if (vm->pt_root[id] && !list_empty(&q->multi_gt_list)) 3394 q = list_next_entry(q, multi_gt_list); 3395 } else { 3396 vops->pt_update_ops[id].q = vm->q[id]; 3397 } 3398 } 3399 3400 return number_tiles; 3401 } 3402 3403 static struct dma_fence *ops_execute(struct xe_vm *vm, 3404 struct xe_vma_ops *vops) 3405 { 3406 struct xe_tile *tile; 3407 struct dma_fence *fence = NULL; 3408 struct dma_fence **fences = NULL; 3409 struct dma_fence_array *cf = NULL; 3410 int number_tiles = 0, current_fence = 0, n_fence = 0, err, i; 3411 u8 id; 3412 3413 number_tiles = vm_ops_setup_tile_args(vm, vops); 3414 if (number_tiles == 0) 3415 return ERR_PTR(-ENODATA); 3416 3417 for_each_tile(tile, vm->xe, id) { 3418 ++n_fence; 3419 3420 if (!(vops->flags & XE_VMA_OPS_FLAG_SKIP_TLB_WAIT)) 3421 for_each_tlb_inval(i) 3422 ++n_fence; 3423 } 3424 3425 fences = kmalloc_objs(*fences, n_fence); 3426 if (!fences) { 3427 fence = ERR_PTR(-ENOMEM); 3428 goto err_trace; 3429 } 3430 3431 cf = dma_fence_array_alloc(n_fence); 3432 if (!cf) { 3433 fence = ERR_PTR(-ENOMEM); 3434 goto err_out; 3435 } 3436 3437 for_each_tile(tile, vm->xe, id) { 3438 if (!vops->pt_update_ops[id].num_ops) 3439 continue; 3440 3441 err = xe_pt_update_ops_prepare(tile, vops); 3442 if (err) { 3443 fence = ERR_PTR(err); 3444 goto err_out; 3445 } 3446 } 3447 3448 trace_xe_vm_ops_execute(vops); 3449 3450 for_each_tile(tile, vm->xe, id) { 3451 struct xe_exec_queue *q = vops->pt_update_ops[tile->id].q; 3452 3453 fence = NULL; 3454 if (!vops->pt_update_ops[id].num_ops) 3455 goto collect_fences; 3456 3457 fence = xe_pt_update_ops_run(tile, vops); 3458 if (IS_ERR(fence)) 3459 goto err_out; 3460 3461 collect_fences: 3462 fences[current_fence++] = fence ?: dma_fence_get_stub(); 3463 if (vops->flags & XE_VMA_OPS_FLAG_SKIP_TLB_WAIT) 3464 continue; 3465 3466 xe_migrate_job_lock(tile->migrate, q); 3467 for_each_tlb_inval(i) 3468 fences[current_fence++] = 3469 xe_exec_queue_tlb_inval_last_fence_get(q, vm, i); 3470 xe_migrate_job_unlock(tile->migrate, q); 3471 } 3472 3473 xe_assert(vm->xe, current_fence == n_fence); 3474 dma_fence_array_init(cf, n_fence, fences, dma_fence_context_alloc(1), 3475 1); 3476 fence = &cf->base; 3477 3478 for_each_tile(tile, vm->xe, id) { 3479 if (!vops->pt_update_ops[id].num_ops) 3480 continue; 3481 3482 xe_pt_update_ops_fini(tile, vops); 3483 } 3484 3485 return fence; 3486 3487 err_out: 3488 for_each_tile(tile, vm->xe, id) { 3489 if (!vops->pt_update_ops[id].num_ops) 3490 continue; 3491 3492 xe_pt_update_ops_abort(tile, vops); 3493 } 3494 while (current_fence) 3495 dma_fence_put(fences[--current_fence]); 3496 kfree(fences); 3497 kfree(cf); 3498 3499 err_trace: 3500 trace_xe_vm_ops_fail(vm); 3501 return fence; 3502 } 3503 3504 static void vma_add_ufence(struct xe_vma *vma, struct xe_user_fence *ufence) 3505 { 3506 if (vma->ufence) 3507 xe_sync_ufence_put(vma->ufence); 3508 vma->ufence = __xe_sync_ufence_get(ufence); 3509 } 3510 3511 static void op_add_ufence(struct xe_vm *vm, struct xe_vma_op *op, 3512 struct xe_user_fence *ufence) 3513 { 3514 switch (op->base.op) { 3515 case DRM_GPUVA_OP_MAP: 3516 if (!xe_vma_is_cpu_addr_mirror(op->map.vma)) 3517 vma_add_ufence(op->map.vma, ufence); 3518 break; 3519 case DRM_GPUVA_OP_REMAP: 3520 if (op->remap.prev) 3521 vma_add_ufence(op->remap.prev, ufence); 3522 if (op->remap.next) 3523 vma_add_ufence(op->remap.next, ufence); 3524 break; 3525 case DRM_GPUVA_OP_UNMAP: 3526 break; 3527 case DRM_GPUVA_OP_PREFETCH: 3528 vma_add_ufence(gpuva_to_vma(op->base.prefetch.va), ufence); 3529 break; 3530 default: 3531 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n"); 3532 } 3533 } 3534 3535 static void vm_bind_ioctl_ops_fini(struct xe_vm *vm, struct xe_vma_ops *vops, 3536 struct dma_fence *fence) 3537 { 3538 struct xe_user_fence *ufence; 3539 struct xe_vma_op *op; 3540 int i; 3541 3542 ufence = find_ufence_get(vops->syncs, vops->num_syncs); 3543 list_for_each_entry(op, &vops->list, link) { 3544 if (ufence) 3545 op_add_ufence(vm, op, ufence); 3546 3547 if (op->base.op == DRM_GPUVA_OP_UNMAP) 3548 xe_vma_destroy(gpuva_to_vma(op->base.unmap.va), fence); 3549 else if (op->base.op == DRM_GPUVA_OP_REMAP) 3550 xe_vma_destroy(gpuva_to_vma(op->base.remap.unmap->va), 3551 fence); 3552 } 3553 if (ufence) 3554 xe_sync_ufence_put(ufence); 3555 if (fence) { 3556 for (i = 0; i < vops->num_syncs; i++) 3557 xe_sync_entry_signal(vops->syncs + i, fence); 3558 } 3559 } 3560 3561 static struct dma_fence *vm_bind_ioctl_ops_execute(struct xe_vm *vm, 3562 struct xe_vma_ops *vops) 3563 { 3564 struct xe_validation_ctx ctx; 3565 struct drm_exec exec; 3566 struct dma_fence *fence; 3567 int err = 0; 3568 3569 lockdep_assert_held_write(&vm->lock); 3570 3571 xe_validation_guard(&ctx, &vm->xe->val, &exec, 3572 ((struct xe_val_flags) { 3573 .interruptible = true, 3574 .exec_ignore_duplicates = true, 3575 }), err) { 3576 err = vm_bind_ioctl_ops_lock_and_prep(&exec, vm, vops); 3577 drm_exec_retry_on_contention(&exec); 3578 xe_validation_retry_on_oom(&ctx, &err); 3579 if (err) 3580 return ERR_PTR(err); 3581 3582 xe_vm_set_validation_exec(vm, &exec); 3583 fence = ops_execute(vm, vops); 3584 xe_vm_set_validation_exec(vm, NULL); 3585 if (IS_ERR(fence)) { 3586 if (PTR_ERR(fence) == -ENODATA) 3587 vm_bind_ioctl_ops_fini(vm, vops, NULL); 3588 return fence; 3589 } 3590 3591 vm_bind_ioctl_ops_fini(vm, vops, fence); 3592 } 3593 3594 return err ? ERR_PTR(err) : fence; 3595 } 3596 ALLOW_ERROR_INJECTION(vm_bind_ioctl_ops_execute, ERRNO); 3597 3598 #define SUPPORTED_FLAGS_STUB \ 3599 (DRM_XE_VM_BIND_FLAG_READONLY | \ 3600 DRM_XE_VM_BIND_FLAG_IMMEDIATE | \ 3601 DRM_XE_VM_BIND_FLAG_NULL | \ 3602 DRM_XE_VM_BIND_FLAG_DUMPABLE | \ 3603 DRM_XE_VM_BIND_FLAG_CHECK_PXP | \ 3604 DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR | \ 3605 DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET | \ 3606 DRM_XE_VM_BIND_FLAG_DECOMPRESS) 3607 3608 #ifdef TEST_VM_OPS_ERROR 3609 #define SUPPORTED_FLAGS (SUPPORTED_FLAGS_STUB | FORCE_OP_ERROR) 3610 #else 3611 #define SUPPORTED_FLAGS SUPPORTED_FLAGS_STUB 3612 #endif 3613 3614 #define XE_64K_PAGE_MASK 0xffffull 3615 #define ALL_DRM_XE_SYNCS_FLAGS (DRM_XE_SYNCS_FLAG_WAIT_FOR_OP) 3616 3617 static int vm_bind_ioctl_check_args(struct xe_device *xe, struct xe_vm *vm, 3618 struct drm_xe_vm_bind *args, 3619 struct drm_xe_vm_bind_op **bind_ops) 3620 { 3621 int err; 3622 int i; 3623 3624 if (XE_IOCTL_DBG(xe, args->pad || args->pad2) || 3625 XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1])) 3626 return -EINVAL; 3627 3628 if (XE_IOCTL_DBG(xe, args->extensions)) 3629 return -EINVAL; 3630 3631 if (XE_IOCTL_DBG(xe, args->num_syncs > DRM_XE_MAX_SYNCS)) 3632 return -EINVAL; 3633 3634 if (args->num_binds > 1) { 3635 u64 __user *bind_user = 3636 u64_to_user_ptr(args->vector_of_binds); 3637 3638 *bind_ops = kvmalloc_objs(struct drm_xe_vm_bind_op, 3639 args->num_binds, 3640 GFP_KERNEL | __GFP_ACCOUNT | __GFP_RETRY_MAYFAIL | __GFP_NOWARN); 3641 if (!*bind_ops) 3642 return args->num_binds > 1 ? -ENOBUFS : -ENOMEM; 3643 3644 err = copy_from_user(*bind_ops, bind_user, 3645 sizeof(struct drm_xe_vm_bind_op) * 3646 args->num_binds); 3647 if (XE_IOCTL_DBG(xe, err)) { 3648 err = -EFAULT; 3649 goto free_bind_ops; 3650 } 3651 } else { 3652 *bind_ops = &args->bind; 3653 } 3654 3655 for (i = 0; i < args->num_binds; ++i) { 3656 u64 range = (*bind_ops)[i].range; 3657 u64 addr = (*bind_ops)[i].addr; 3658 u32 op = (*bind_ops)[i].op; 3659 u32 flags = (*bind_ops)[i].flags; 3660 u32 obj = (*bind_ops)[i].obj; 3661 u64 obj_offset = (*bind_ops)[i].obj_offset; 3662 u32 prefetch_region = (*bind_ops)[i].prefetch_mem_region_instance; 3663 bool is_null = flags & DRM_XE_VM_BIND_FLAG_NULL; 3664 bool is_cpu_addr_mirror = flags & 3665 DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR; 3666 bool is_decompress = flags & DRM_XE_VM_BIND_FLAG_DECOMPRESS; 3667 u16 pat_index = (*bind_ops)[i].pat_index; 3668 u16 coh_mode; 3669 bool comp_en; 3670 3671 if (XE_IOCTL_DBG(xe, is_cpu_addr_mirror && 3672 (!xe_vm_in_fault_mode(vm) || 3673 !IS_ENABLED(CONFIG_DRM_XE_GPUSVM)))) { 3674 err = -EINVAL; 3675 goto free_bind_ops; 3676 } 3677 3678 if (XE_IOCTL_DBG(xe, pat_index >= xe->pat.n_entries)) { 3679 err = -EINVAL; 3680 goto free_bind_ops; 3681 } 3682 3683 pat_index = array_index_nospec(pat_index, xe->pat.n_entries); 3684 (*bind_ops)[i].pat_index = pat_index; 3685 coh_mode = xe_pat_index_get_coh_mode(xe, pat_index); 3686 comp_en = xe_pat_index_get_comp_en(xe, pat_index); 3687 if (XE_IOCTL_DBG(xe, !coh_mode)) { /* hw reserved */ 3688 err = -EINVAL; 3689 goto free_bind_ops; 3690 } 3691 3692 if (XE_WARN_ON(coh_mode > XE_COH_2WAY)) { 3693 err = -EINVAL; 3694 goto free_bind_ops; 3695 } 3696 3697 if (XE_IOCTL_DBG(xe, op > DRM_XE_VM_BIND_OP_PREFETCH) || 3698 XE_IOCTL_DBG(xe, flags & ~SUPPORTED_FLAGS) || 3699 XE_IOCTL_DBG(xe, obj && (is_null || is_cpu_addr_mirror)) || 3700 XE_IOCTL_DBG(xe, obj_offset && (is_null || 3701 is_cpu_addr_mirror)) || 3702 XE_IOCTL_DBG(xe, op != DRM_XE_VM_BIND_OP_MAP && 3703 (is_decompress || is_null || is_cpu_addr_mirror)) || 3704 XE_IOCTL_DBG(xe, is_decompress && 3705 xe_pat_index_get_comp_en(xe, pat_index)) || 3706 XE_IOCTL_DBG(xe, !obj && 3707 op == DRM_XE_VM_BIND_OP_MAP && 3708 !is_null && !is_cpu_addr_mirror) || 3709 XE_IOCTL_DBG(xe, !obj && 3710 op == DRM_XE_VM_BIND_OP_UNMAP_ALL) || 3711 XE_IOCTL_DBG(xe, addr && 3712 op == DRM_XE_VM_BIND_OP_UNMAP_ALL) || 3713 XE_IOCTL_DBG(xe, range && 3714 op == DRM_XE_VM_BIND_OP_UNMAP_ALL) || 3715 XE_IOCTL_DBG(xe, obj && 3716 op == DRM_XE_VM_BIND_OP_MAP_USERPTR) || 3717 XE_IOCTL_DBG(xe, coh_mode == XE_COH_NONE && 3718 op == DRM_XE_VM_BIND_OP_MAP_USERPTR) || 3719 XE_IOCTL_DBG(xe, !IS_DGFX(xe) && coh_mode == XE_COH_NONE && 3720 is_cpu_addr_mirror) || 3721 XE_IOCTL_DBG(xe, xe_device_is_l2_flush_optimized(xe) && 3722 (op == DRM_XE_VM_BIND_OP_MAP_USERPTR || 3723 is_cpu_addr_mirror) && 3724 (pat_index != 19 && coh_mode != XE_COH_2WAY)) || 3725 XE_IOCTL_DBG(xe, comp_en && 3726 op == DRM_XE_VM_BIND_OP_MAP_USERPTR) || 3727 XE_IOCTL_DBG(xe, op == DRM_XE_VM_BIND_OP_MAP_USERPTR && 3728 !IS_ENABLED(CONFIG_DRM_GPUSVM)) || 3729 XE_IOCTL_DBG(xe, obj && 3730 op == DRM_XE_VM_BIND_OP_PREFETCH) || 3731 XE_IOCTL_DBG(xe, prefetch_region && 3732 op != DRM_XE_VM_BIND_OP_PREFETCH) || 3733 XE_IOCTL_DBG(xe, (prefetch_region != DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC && 3734 /* Guard against undefined shift in BIT(prefetch_region) */ 3735 (prefetch_region >= (sizeof(xe->info.mem_region_mask) * 8) || 3736 !(BIT(prefetch_region) & xe->info.mem_region_mask)))) || 3737 XE_IOCTL_DBG(xe, obj && 3738 op == DRM_XE_VM_BIND_OP_UNMAP) || 3739 XE_IOCTL_DBG(xe, (flags & DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET) && 3740 (!is_cpu_addr_mirror || op != DRM_XE_VM_BIND_OP_MAP))) { 3741 err = -EINVAL; 3742 goto free_bind_ops; 3743 } 3744 3745 if (XE_IOCTL_DBG(xe, obj_offset & ~PAGE_MASK) || 3746 XE_IOCTL_DBG(xe, addr & ~PAGE_MASK) || 3747 XE_IOCTL_DBG(xe, range & ~PAGE_MASK) || 3748 XE_IOCTL_DBG(xe, !range && 3749 op != DRM_XE_VM_BIND_OP_UNMAP_ALL)) { 3750 err = -EINVAL; 3751 goto free_bind_ops; 3752 } 3753 3754 if (is_decompress && (XE_IOCTL_DBG(xe, !xe_device_has_flat_ccs(xe)) || 3755 XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20) || 3756 XE_IOCTL_DBG(xe, !IS_DGFX(xe)))) { 3757 err = -EOPNOTSUPP; 3758 goto free_bind_ops; 3759 } 3760 } 3761 3762 return 0; 3763 3764 free_bind_ops: 3765 if (args->num_binds > 1) 3766 kvfree(*bind_ops); 3767 *bind_ops = NULL; 3768 return err; 3769 } 3770 3771 static int vm_bind_ioctl_signal_fences(struct xe_vm *vm, 3772 struct xe_exec_queue *q, 3773 struct xe_sync_entry *syncs, 3774 int num_syncs) 3775 { 3776 struct dma_fence *fence = NULL; 3777 int i, err = 0; 3778 3779 if (num_syncs) { 3780 fence = xe_sync_in_fence_get(syncs, num_syncs, 3781 to_wait_exec_queue(vm, q), vm); 3782 if (IS_ERR(fence)) 3783 return PTR_ERR(fence); 3784 3785 for (i = 0; i < num_syncs; i++) 3786 xe_sync_entry_signal(&syncs[i], fence); 3787 } 3788 3789 dma_fence_put(fence); 3790 3791 return err; 3792 } 3793 3794 static void xe_vma_ops_init(struct xe_vma_ops *vops, struct xe_vm *vm, 3795 struct xe_exec_queue *q, 3796 struct xe_sync_entry *syncs, u32 num_syncs) 3797 { 3798 memset(vops, 0, sizeof(*vops)); 3799 INIT_LIST_HEAD(&vops->list); 3800 vops->vm = vm; 3801 vops->q = q; 3802 vops->syncs = syncs; 3803 vops->num_syncs = num_syncs; 3804 vops->flags = 0; 3805 } 3806 3807 static int xe_vm_bind_ioctl_validate_bo(struct xe_device *xe, struct xe_bo *bo, 3808 u64 addr, u64 range, u64 obj_offset, 3809 u16 pat_index, u32 op, u32 bind_flags) 3810 { 3811 u16 coh_mode; 3812 bool comp_en; 3813 3814 if (XE_IOCTL_DBG(xe, (bo->flags & XE_BO_FLAG_NO_COMPRESSION) && 3815 xe_pat_index_get_comp_en(xe, pat_index))) 3816 return -EINVAL; 3817 3818 if (XE_IOCTL_DBG(xe, range > xe_bo_size(bo)) || 3819 XE_IOCTL_DBG(xe, obj_offset > 3820 xe_bo_size(bo) - range)) { 3821 return -EINVAL; 3822 } 3823 3824 /* 3825 * Some platforms require 64k VM_BIND alignment, 3826 * specifically those with XE_VRAM_FLAGS_NEED64K. 3827 * 3828 * Other platforms may have BO's set to 64k physical placement, 3829 * but can be mapped at 4k offsets anyway. This check is only 3830 * there for the former case. 3831 */ 3832 if ((bo->flags & XE_BO_FLAG_INTERNAL_64K) && 3833 (xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K)) { 3834 if (XE_IOCTL_DBG(xe, obj_offset & 3835 XE_64K_PAGE_MASK) || 3836 XE_IOCTL_DBG(xe, addr & XE_64K_PAGE_MASK) || 3837 XE_IOCTL_DBG(xe, range & XE_64K_PAGE_MASK)) { 3838 return -EINVAL; 3839 } 3840 } 3841 3842 coh_mode = xe_pat_index_get_coh_mode(xe, pat_index); 3843 if (bo->cpu_caching) { 3844 if (XE_IOCTL_DBG(xe, coh_mode == XE_COH_NONE && 3845 bo->cpu_caching == DRM_XE_GEM_CPU_CACHING_WB)) { 3846 return -EINVAL; 3847 } 3848 } else if (XE_IOCTL_DBG(xe, coh_mode == XE_COH_NONE)) { 3849 /* 3850 * Imported dma-buf from a different device should 3851 * require 1way or 2way coherency since we don't know 3852 * how it was mapped on the CPU. Just assume is it 3853 * potentially cached on CPU side. 3854 */ 3855 return -EINVAL; 3856 } 3857 3858 /* 3859 * Ensures that imported buffer objects (dma-bufs) are not mapped 3860 * with a PAT index that enables compression. 3861 */ 3862 comp_en = xe_pat_index_get_comp_en(xe, pat_index); 3863 if (XE_IOCTL_DBG(xe, bo->ttm.base.import_attach && comp_en)) 3864 return -EINVAL; 3865 3866 if (XE_IOCTL_DBG(xe, bo->ttm.base.import_attach && xe_device_is_l2_flush_optimized(xe) && 3867 (pat_index != 19 && coh_mode != XE_COH_2WAY))) 3868 return -EINVAL; 3869 3870 /* If a BO is protected it can only be mapped if the key is still valid */ 3871 if ((bind_flags & DRM_XE_VM_BIND_FLAG_CHECK_PXP) && xe_bo_is_protected(bo) && 3872 op != DRM_XE_VM_BIND_OP_UNMAP && op != DRM_XE_VM_BIND_OP_UNMAP_ALL) 3873 if (XE_IOCTL_DBG(xe, xe_pxp_bo_key_check(xe->pxp, bo) != 0)) 3874 return -ENOEXEC; 3875 3876 return 0; 3877 } 3878 3879 int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file) 3880 { 3881 struct xe_device *xe = to_xe_device(dev); 3882 struct xe_file *xef = to_xe_file(file); 3883 struct drm_xe_vm_bind *args = data; 3884 struct drm_xe_sync __user *syncs_user; 3885 struct xe_bo **bos = NULL; 3886 struct drm_gpuva_ops **ops = NULL; 3887 struct xe_vm *vm; 3888 struct xe_exec_queue *q = NULL; 3889 u32 num_syncs, num_ufence = 0; 3890 struct xe_sync_entry *syncs = NULL; 3891 struct drm_xe_vm_bind_op *bind_ops = NULL; 3892 struct xe_vma_ops vops; 3893 struct dma_fence *fence; 3894 int err; 3895 int i; 3896 3897 vm = xe_vm_lookup(xef, args->vm_id); 3898 if (XE_IOCTL_DBG(xe, !vm)) 3899 return -EINVAL; 3900 3901 err = vm_bind_ioctl_check_args(xe, vm, args, &bind_ops); 3902 if (err) 3903 goto put_vm; 3904 3905 if (args->exec_queue_id) { 3906 q = xe_exec_queue_lookup(xef, args->exec_queue_id); 3907 if (XE_IOCTL_DBG(xe, !q)) { 3908 err = -ENOENT; 3909 goto free_bind_ops; 3910 } 3911 3912 if (XE_IOCTL_DBG(xe, !(q->flags & EXEC_QUEUE_FLAG_VM))) { 3913 err = -EINVAL; 3914 goto put_exec_queue; 3915 } 3916 } 3917 3918 if (XE_IOCTL_DBG(xe, q && vm != q->user_vm)) { 3919 err = -EINVAL; 3920 goto put_exec_queue; 3921 } 3922 3923 /* Ensure all UNMAPs visible */ 3924 xe_svm_flush(vm); 3925 3926 err = down_write_killable(&vm->lock); 3927 if (err) 3928 goto put_exec_queue; 3929 3930 if (XE_IOCTL_DBG(xe, xe_vm_is_closed_or_banned(vm))) { 3931 err = -ENOENT; 3932 goto release_vm_lock; 3933 } 3934 3935 for (i = 0; i < args->num_binds; ++i) { 3936 u64 range = bind_ops[i].range; 3937 u64 addr = bind_ops[i].addr; 3938 3939 if (XE_IOCTL_DBG(xe, range > vm->size) || 3940 XE_IOCTL_DBG(xe, addr > vm->size - range)) { 3941 err = -EINVAL; 3942 goto release_vm_lock; 3943 } 3944 } 3945 3946 if (args->num_binds) { 3947 bos = kvzalloc_objs(*bos, args->num_binds, 3948 GFP_KERNEL | __GFP_ACCOUNT | __GFP_RETRY_MAYFAIL | __GFP_NOWARN); 3949 if (!bos) { 3950 err = -ENOMEM; 3951 goto release_vm_lock; 3952 } 3953 3954 ops = kvzalloc_objs(*ops, args->num_binds, 3955 GFP_KERNEL | __GFP_ACCOUNT | __GFP_RETRY_MAYFAIL | __GFP_NOWARN); 3956 if (!ops) { 3957 err = -ENOMEM; 3958 goto free_bos; 3959 } 3960 } 3961 3962 for (i = 0; i < args->num_binds; ++i) { 3963 struct drm_gem_object *gem_obj; 3964 u64 range = bind_ops[i].range; 3965 u64 addr = bind_ops[i].addr; 3966 u32 obj = bind_ops[i].obj; 3967 u64 obj_offset = bind_ops[i].obj_offset; 3968 u16 pat_index = bind_ops[i].pat_index; 3969 u32 op = bind_ops[i].op; 3970 u32 bind_flags = bind_ops[i].flags; 3971 3972 if (!obj) 3973 continue; 3974 3975 gem_obj = drm_gem_object_lookup(file, obj); 3976 if (XE_IOCTL_DBG(xe, !gem_obj)) { 3977 err = -ENOENT; 3978 goto put_obj; 3979 } 3980 bos[i] = gem_to_xe_bo(gem_obj); 3981 3982 err = xe_vm_bind_ioctl_validate_bo(xe, bos[i], addr, range, 3983 obj_offset, pat_index, op, 3984 bind_flags); 3985 if (err) 3986 goto put_obj; 3987 } 3988 3989 if (args->num_syncs) { 3990 syncs = kzalloc_objs(*syncs, args->num_syncs); 3991 if (!syncs) { 3992 err = -ENOMEM; 3993 goto put_obj; 3994 } 3995 } 3996 3997 syncs_user = u64_to_user_ptr(args->syncs); 3998 for (num_syncs = 0; num_syncs < args->num_syncs; num_syncs++) { 3999 struct xe_exec_queue *__q = q ?: vm->q[0]; 4000 4001 err = xe_sync_entry_parse(xe, xef, &syncs[num_syncs], 4002 &syncs_user[num_syncs], 4003 __q->ufence_syncobj, 4004 ++__q->ufence_timeline_value, 4005 (xe_vm_in_lr_mode(vm) ? 4006 SYNC_PARSE_FLAG_LR_MODE : 0) | 4007 (!args->num_binds ? 4008 SYNC_PARSE_FLAG_DISALLOW_USER_FENCE : 0)); 4009 if (err) 4010 goto free_syncs; 4011 4012 if (xe_sync_is_ufence(&syncs[num_syncs])) 4013 num_ufence++; 4014 } 4015 4016 if (XE_IOCTL_DBG(xe, num_ufence > 1)) { 4017 err = -EINVAL; 4018 goto free_syncs; 4019 } 4020 4021 if (!args->num_binds) { 4022 err = -ENODATA; 4023 goto free_syncs; 4024 } 4025 4026 xe_vma_ops_init(&vops, vm, q, syncs, num_syncs); 4027 if (args->num_binds > 1) 4028 vops.flags |= XE_VMA_OPS_ARRAY_OF_BINDS; 4029 for (i = 0; i < args->num_binds; ++i) { 4030 u64 range = bind_ops[i].range; 4031 u64 addr = bind_ops[i].addr; 4032 u32 op = bind_ops[i].op; 4033 u32 flags = bind_ops[i].flags; 4034 u64 obj_offset = bind_ops[i].obj_offset; 4035 u32 prefetch_region = bind_ops[i].prefetch_mem_region_instance; 4036 u16 pat_index = bind_ops[i].pat_index; 4037 4038 ops[i] = vm_bind_ioctl_ops_create(vm, &vops, bos[i], obj_offset, 4039 addr, range, op, flags, 4040 prefetch_region, pat_index); 4041 if (IS_ERR(ops[i])) { 4042 err = PTR_ERR(ops[i]); 4043 ops[i] = NULL; 4044 goto unwind_ops; 4045 } 4046 4047 err = vm_bind_ioctl_ops_parse(vm, ops[i], &vops); 4048 if (err) 4049 goto unwind_ops; 4050 4051 #ifdef TEST_VM_OPS_ERROR 4052 if (flags & FORCE_OP_ERROR) { 4053 vops.inject_error = true; 4054 vm->xe->vm_inject_error_position = 4055 (vm->xe->vm_inject_error_position + 1) % 4056 FORCE_OP_ERROR_COUNT; 4057 } 4058 #endif 4059 } 4060 4061 /* Nothing to do */ 4062 if (list_empty(&vops.list)) { 4063 err = -ENODATA; 4064 goto unwind_ops; 4065 } 4066 4067 err = xe_vma_ops_alloc(&vops, args->num_binds > 1); 4068 if (err) 4069 goto unwind_ops; 4070 4071 err = vm_bind_ioctl_ops_prefetch_ranges(vm, &vops); 4072 if (err) 4073 goto unwind_ops; 4074 4075 fence = vm_bind_ioctl_ops_execute(vm, &vops); 4076 if (IS_ERR(fence)) 4077 err = PTR_ERR(fence); 4078 else 4079 dma_fence_put(fence); 4080 4081 unwind_ops: 4082 if (err && err != -ENODATA) 4083 vm_bind_ioctl_ops_unwind(vm, ops, args->num_binds); 4084 xe_vma_ops_fini(&vops); 4085 for (i = args->num_binds - 1; i >= 0; --i) 4086 if (ops[i]) 4087 drm_gpuva_ops_free(&vm->gpuvm, ops[i]); 4088 free_syncs: 4089 if (err == -ENODATA) 4090 err = vm_bind_ioctl_signal_fences(vm, q, syncs, num_syncs); 4091 while (num_syncs--) 4092 xe_sync_entry_cleanup(&syncs[num_syncs]); 4093 4094 kfree(syncs); 4095 put_obj: 4096 for (i = 0; i < args->num_binds; ++i) 4097 xe_bo_put(bos[i]); 4098 4099 kvfree(ops); 4100 free_bos: 4101 kvfree(bos); 4102 release_vm_lock: 4103 up_write(&vm->lock); 4104 put_exec_queue: 4105 if (q) 4106 xe_exec_queue_put(q); 4107 free_bind_ops: 4108 if (args->num_binds > 1) 4109 kvfree(bind_ops); 4110 put_vm: 4111 xe_vm_put(vm); 4112 return err; 4113 } 4114 4115 /* 4116 * Map access type, fault type, and fault level from current bspec 4117 * specification to user spec abstraction. The current mapping is 4118 * approximately 1-to-1, with access type being the only notable 4119 * exception as it carries additional data with respect to prefetch 4120 * status that needs to be masked out. 4121 */ 4122 static u8 xe_to_user_access_type(u8 access_type) 4123 { 4124 return access_type & XE_PAGEFAULT_ACCESS_TYPE_MASK; 4125 } 4126 4127 static u8 xe_to_user_fault_type(u8 fault_type) 4128 { 4129 return fault_type; 4130 } 4131 4132 static u8 xe_to_user_fault_level(u8 fault_level) 4133 { 4134 return fault_level; 4135 } 4136 4137 static int fill_faults(struct xe_vm *vm, 4138 struct drm_xe_vm_get_property *args) 4139 { 4140 struct xe_vm_fault __user *usr_ptr = u64_to_user_ptr(args->data); 4141 struct xe_vm_fault *fault_list, fault_entry = { 0 }; 4142 struct xe_vm_fault_entry *entry; 4143 int ret = 0, i = 0, count, entry_size; 4144 4145 entry_size = sizeof(struct xe_vm_fault); 4146 count = args->size / entry_size; 4147 4148 fault_list = kzalloc_objs(struct xe_vm_fault, count); 4149 if (!fault_list) 4150 return -ENOMEM; 4151 4152 spin_lock(&vm->faults.lock); 4153 list_for_each_entry(entry, &vm->faults.list, list) { 4154 if (i == count) 4155 break; 4156 4157 fault_entry.address = xe_device_canonicalize_addr(vm->xe, entry->address); 4158 fault_entry.address_precision = entry->address_precision; 4159 4160 fault_entry.access_type = xe_to_user_access_type(entry->access_type); 4161 fault_entry.fault_type = xe_to_user_fault_type(entry->fault_type); 4162 fault_entry.fault_level = xe_to_user_fault_level(entry->fault_level); 4163 4164 memcpy(&fault_list[i], &fault_entry, entry_size); 4165 4166 i++; 4167 } 4168 spin_unlock(&vm->faults.lock); 4169 4170 ret = copy_to_user(usr_ptr, fault_list, args->size); 4171 4172 kfree(fault_list); 4173 return ret ? -EFAULT : 0; 4174 } 4175 4176 static int xe_vm_get_property_helper(struct xe_vm *vm, 4177 struct drm_xe_vm_get_property *args) 4178 { 4179 size_t size; 4180 4181 switch (args->property) { 4182 case DRM_XE_VM_GET_PROPERTY_FAULTS: 4183 spin_lock(&vm->faults.lock); 4184 size = size_mul(sizeof(struct xe_vm_fault), vm->faults.len); 4185 spin_unlock(&vm->faults.lock); 4186 4187 if (!args->size) { 4188 args->size = size; 4189 return 0; 4190 } 4191 4192 /* 4193 * Number of faults may increase between calls to 4194 * xe_vm_get_property_ioctl, so just report the number of 4195 * faults the user requests if it's less than or equal to 4196 * the number of faults in the VM fault array. 4197 * 4198 * We should also at least assert that the args->size value 4199 * is a multiple of the xe_vm_fault struct size. 4200 */ 4201 if (args->size > size || args->size % sizeof(struct xe_vm_fault)) 4202 return -EINVAL; 4203 4204 return fill_faults(vm, args); 4205 } 4206 return -EINVAL; 4207 } 4208 4209 int xe_vm_get_property_ioctl(struct drm_device *drm, void *data, 4210 struct drm_file *file) 4211 { 4212 struct xe_device *xe = to_xe_device(drm); 4213 struct xe_file *xef = to_xe_file(file); 4214 struct drm_xe_vm_get_property *args = data; 4215 struct xe_vm *vm; 4216 int ret = 0; 4217 4218 if (XE_IOCTL_DBG(xe, (args->reserved[0] || args->reserved[1] || 4219 args->reserved[2] || args->extensions || 4220 args->pad))) 4221 return -EINVAL; 4222 4223 vm = xe_vm_lookup(xef, args->vm_id); 4224 if (XE_IOCTL_DBG(xe, !vm)) 4225 return -ENOENT; 4226 4227 ret = xe_vm_get_property_helper(vm, args); 4228 4229 xe_vm_put(vm); 4230 return ret; 4231 } 4232 4233 /** 4234 * xe_vm_bind_kernel_bo - bind a kernel BO to a VM 4235 * @vm: VM to bind the BO to 4236 * @bo: BO to bind 4237 * @q: exec queue to use for the bind (optional) 4238 * @addr: address at which to bind the BO 4239 * @cache_lvl: PAT cache level to use 4240 * 4241 * Execute a VM bind map operation on a kernel-owned BO to bind it into a 4242 * kernel-owned VM. 4243 * 4244 * Returns a dma_fence to track the binding completion if the job to do so was 4245 * successfully submitted, an error pointer otherwise. 4246 */ 4247 struct dma_fence *xe_vm_bind_kernel_bo(struct xe_vm *vm, struct xe_bo *bo, 4248 struct xe_exec_queue *q, u64 addr, 4249 enum xe_cache_level cache_lvl) 4250 { 4251 struct xe_vma_ops vops; 4252 struct drm_gpuva_ops *ops = NULL; 4253 struct dma_fence *fence; 4254 int err; 4255 4256 xe_bo_get(bo); 4257 xe_vm_get(vm); 4258 if (q) 4259 xe_exec_queue_get(q); 4260 4261 down_write(&vm->lock); 4262 4263 xe_vma_ops_init(&vops, vm, q, NULL, 0); 4264 4265 ops = vm_bind_ioctl_ops_create(vm, &vops, bo, 0, addr, xe_bo_size(bo), 4266 DRM_XE_VM_BIND_OP_MAP, 0, 0, 4267 xe_cache_pat_idx(vm->xe, cache_lvl)); 4268 if (IS_ERR(ops)) { 4269 err = PTR_ERR(ops); 4270 goto release_vm_lock; 4271 } 4272 4273 err = vm_bind_ioctl_ops_parse(vm, ops, &vops); 4274 if (err) 4275 goto release_vm_lock; 4276 4277 xe_assert(vm->xe, !list_empty(&vops.list)); 4278 4279 err = xe_vma_ops_alloc(&vops, false); 4280 if (err) 4281 goto unwind_ops; 4282 4283 fence = vm_bind_ioctl_ops_execute(vm, &vops); 4284 if (IS_ERR(fence)) 4285 err = PTR_ERR(fence); 4286 4287 unwind_ops: 4288 if (err && err != -ENODATA) 4289 vm_bind_ioctl_ops_unwind(vm, &ops, 1); 4290 4291 xe_vma_ops_fini(&vops); 4292 drm_gpuva_ops_free(&vm->gpuvm, ops); 4293 4294 release_vm_lock: 4295 up_write(&vm->lock); 4296 4297 if (q) 4298 xe_exec_queue_put(q); 4299 xe_vm_put(vm); 4300 xe_bo_put(bo); 4301 4302 if (err) 4303 fence = ERR_PTR(err); 4304 4305 return fence; 4306 } 4307 4308 /** 4309 * xe_vm_lock() - Lock the vm's dma_resv object 4310 * @vm: The struct xe_vm whose lock is to be locked 4311 * @intr: Whether to perform any wait interruptible 4312 * 4313 * Return: 0 on success, -EINTR if @intr is true and the wait for a 4314 * contended lock was interrupted. If @intr is false, the function 4315 * always returns 0. 4316 */ 4317 int xe_vm_lock(struct xe_vm *vm, bool intr) 4318 { 4319 int ret; 4320 4321 if (intr) 4322 ret = dma_resv_lock_interruptible(xe_vm_resv(vm), NULL); 4323 else 4324 ret = dma_resv_lock(xe_vm_resv(vm), NULL); 4325 4326 return ret; 4327 } 4328 4329 /** 4330 * xe_vm_unlock() - Unlock the vm's dma_resv object 4331 * @vm: The struct xe_vm whose lock is to be released. 4332 * 4333 * Unlock a buffer object lock that was locked by xe_vm_lock(). 4334 */ 4335 void xe_vm_unlock(struct xe_vm *vm) 4336 { 4337 dma_resv_unlock(xe_vm_resv(vm)); 4338 } 4339 4340 /** 4341 * xe_vm_invalidate_vma_submit - Submit a job to invalidate GPU mappings for 4342 * VMA. 4343 * @vma: VMA to invalidate 4344 * @batch: TLB invalidation batch to populate; caller must later call 4345 * xe_tlb_inval_batch_wait() on it to wait for completion 4346 * 4347 * Walks a list of page tables leaves which it memset the entries owned by this 4348 * VMA to zero, invalidates the TLBs, but doesn't block waiting for TLB flush 4349 * to complete, but instead populates @batch which can be waited on using 4350 * xe_tlb_inval_batch_wait(). 4351 * 4352 * Returns 0 for success, negative error code otherwise. 4353 */ 4354 int xe_vm_invalidate_vma_submit(struct xe_vma *vma, struct xe_tlb_inval_batch *batch) 4355 { 4356 struct xe_device *xe = xe_vma_vm(vma)->xe; 4357 struct xe_vm *vm = xe_vma_vm(vma); 4358 struct xe_tile *tile; 4359 u8 tile_mask = 0; 4360 int ret = 0; 4361 u8 id; 4362 4363 xe_assert(xe, !xe_vma_is_null(vma)); 4364 xe_assert(xe, !xe_vma_is_cpu_addr_mirror(vma)); 4365 trace_xe_vma_invalidate(vma); 4366 4367 vm_dbg(&vm->xe->drm, 4368 "INVALIDATE: addr=0x%016llx, range=0x%016llx", 4369 xe_vma_start(vma), xe_vma_size(vma)); 4370 4371 /* 4372 * Check that we don't race with page-table updates, tile_invalidated 4373 * update is safe 4374 */ 4375 if (IS_ENABLED(CONFIG_PROVE_LOCKING)) { 4376 if (xe_vma_is_userptr(vma)) { 4377 lockdep_assert(lockdep_is_held_type(&vm->svm.gpusvm.notifier_lock, 0) || 4378 (lockdep_is_held_type(&vm->svm.gpusvm.notifier_lock, 1) && 4379 lockdep_is_held(&xe_vm_resv(vm)->lock.base))); 4380 4381 WARN_ON_ONCE(!mmu_interval_check_retry 4382 (&to_userptr_vma(vma)->userptr.notifier, 4383 to_userptr_vma(vma)->userptr.pages.notifier_seq)); 4384 WARN_ON_ONCE(!dma_resv_test_signaled(xe_vm_resv(vm), 4385 DMA_RESV_USAGE_BOOKKEEP)); 4386 4387 } else { 4388 xe_bo_assert_held(xe_vma_bo(vma)); 4389 } 4390 } 4391 4392 for_each_tile(tile, xe, id) 4393 if (xe_pt_zap_ptes(tile, vma)) 4394 tile_mask |= BIT(id); 4395 4396 xe_device_wmb(xe); 4397 4398 ret = xe_tlb_inval_range_tilemask_submit(xe, xe_vma_vm(vma)->usm.asid, 4399 xe_vma_start(vma), xe_vma_end(vma), 4400 tile_mask, batch); 4401 4402 /* WRITE_ONCE pairs with READ_ONCE in xe_vm_has_valid_gpu_mapping() */ 4403 WRITE_ONCE(vma->tile_invalidated, vma->tile_mask); 4404 return ret; 4405 } 4406 4407 /** 4408 * xe_vm_invalidate_vma - invalidate GPU mappings for VMA without a lock 4409 * @vma: VMA to invalidate 4410 * 4411 * Walks a list of page tables leaves which it memset the entries owned by this 4412 * VMA to zero, invalidates the TLBs, and block until TLBs invalidation is 4413 * complete. 4414 * 4415 * Returns 0 for success, negative error code otherwise. 4416 */ 4417 int xe_vm_invalidate_vma(struct xe_vma *vma) 4418 { 4419 struct xe_tlb_inval_batch batch; 4420 int ret; 4421 4422 ret = xe_vm_invalidate_vma_submit(vma, &batch); 4423 if (ret) 4424 return ret; 4425 4426 xe_tlb_inval_batch_wait(&batch); 4427 return ret; 4428 } 4429 4430 int xe_vm_validate_protected(struct xe_vm *vm) 4431 { 4432 struct drm_gpuva *gpuva; 4433 int err = 0; 4434 4435 if (!vm) 4436 return -ENODEV; 4437 4438 mutex_lock(&vm->snap_mutex); 4439 4440 drm_gpuvm_for_each_va(gpuva, &vm->gpuvm) { 4441 struct xe_vma *vma = gpuva_to_vma(gpuva); 4442 struct xe_bo *bo = vma->gpuva.gem.obj ? 4443 gem_to_xe_bo(vma->gpuva.gem.obj) : NULL; 4444 4445 if (!bo) 4446 continue; 4447 4448 if (xe_bo_is_protected(bo)) { 4449 err = xe_pxp_bo_key_check(vm->xe->pxp, bo); 4450 if (err) 4451 break; 4452 } 4453 } 4454 4455 mutex_unlock(&vm->snap_mutex); 4456 return err; 4457 } 4458 4459 struct xe_vm_snapshot { 4460 int uapi_flags; 4461 unsigned long num_snaps; 4462 struct { 4463 u64 ofs, bo_ofs; 4464 unsigned long len; 4465 #define XE_VM_SNAP_FLAG_USERPTR BIT(0) 4466 #define XE_VM_SNAP_FLAG_READ_ONLY BIT(1) 4467 #define XE_VM_SNAP_FLAG_IS_NULL BIT(2) 4468 unsigned long flags; 4469 int uapi_mem_region; 4470 u16 pat_index; 4471 int cpu_caching; 4472 struct xe_bo *bo; 4473 void *data; 4474 struct mm_struct *mm; 4475 } snap[]; 4476 }; 4477 4478 struct xe_vm_snapshot *xe_vm_snapshot_capture(struct xe_vm *vm) 4479 { 4480 unsigned long num_snaps = 0, i; 4481 struct xe_vm_snapshot *snap = NULL; 4482 struct drm_gpuva *gpuva; 4483 4484 if (!vm) 4485 return NULL; 4486 4487 mutex_lock(&vm->snap_mutex); 4488 drm_gpuvm_for_each_va(gpuva, &vm->gpuvm) { 4489 if (gpuva->flags & XE_VMA_DUMPABLE) 4490 num_snaps++; 4491 } 4492 4493 if (num_snaps) 4494 snap = kvzalloc(offsetof(struct xe_vm_snapshot, snap[num_snaps]), GFP_NOWAIT); 4495 if (!snap) { 4496 snap = num_snaps ? ERR_PTR(-ENOMEM) : ERR_PTR(-ENODEV); 4497 goto out_unlock; 4498 } 4499 4500 if (vm->flags & XE_VM_FLAG_FAULT_MODE) 4501 snap->uapi_flags |= DRM_XE_VM_CREATE_FLAG_FAULT_MODE; 4502 if (vm->flags & XE_VM_FLAG_LR_MODE) 4503 snap->uapi_flags |= DRM_XE_VM_CREATE_FLAG_LR_MODE; 4504 if (vm->flags & XE_VM_FLAG_SCRATCH_PAGE) 4505 snap->uapi_flags |= DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE; 4506 4507 snap->num_snaps = num_snaps; 4508 i = 0; 4509 drm_gpuvm_for_each_va(gpuva, &vm->gpuvm) { 4510 struct xe_vma *vma = gpuva_to_vma(gpuva); 4511 struct xe_bo *bo = vma->gpuva.gem.obj ? 4512 gem_to_xe_bo(vma->gpuva.gem.obj) : NULL; 4513 4514 if (!(gpuva->flags & XE_VMA_DUMPABLE)) 4515 continue; 4516 4517 snap->snap[i].ofs = xe_vma_start(vma); 4518 snap->snap[i].len = xe_vma_size(vma); 4519 snap->snap[i].flags = xe_vma_read_only(vma) ? 4520 XE_VM_SNAP_FLAG_READ_ONLY : 0; 4521 snap->snap[i].pat_index = vma->attr.pat_index; 4522 if (bo) { 4523 snap->snap[i].cpu_caching = bo->cpu_caching; 4524 snap->snap[i].bo = xe_bo_get(bo); 4525 snap->snap[i].bo_ofs = xe_vma_bo_offset(vma); 4526 switch (bo->ttm.resource->mem_type) { 4527 case XE_PL_SYSTEM: 4528 case XE_PL_TT: 4529 snap->snap[i].uapi_mem_region = 0; 4530 break; 4531 case XE_PL_VRAM0: 4532 snap->snap[i].uapi_mem_region = 1; 4533 break; 4534 case XE_PL_VRAM1: 4535 snap->snap[i].uapi_mem_region = 2; 4536 break; 4537 } 4538 } else if (xe_vma_is_userptr(vma)) { 4539 struct mm_struct *mm = 4540 to_userptr_vma(vma)->userptr.notifier.mm; 4541 4542 if (mmget_not_zero(mm)) 4543 snap->snap[i].mm = mm; 4544 else 4545 snap->snap[i].data = ERR_PTR(-EFAULT); 4546 4547 snap->snap[i].bo_ofs = xe_vma_userptr(vma); 4548 snap->snap[i].flags |= XE_VM_SNAP_FLAG_USERPTR; 4549 snap->snap[i].uapi_mem_region = 0; 4550 } else if (xe_vma_is_null(vma)) { 4551 snap->snap[i].flags |= XE_VM_SNAP_FLAG_IS_NULL; 4552 snap->snap[i].uapi_mem_region = -1; 4553 } else { 4554 snap->snap[i].data = ERR_PTR(-ENOENT); 4555 snap->snap[i].uapi_mem_region = -1; 4556 } 4557 i++; 4558 } 4559 4560 out_unlock: 4561 mutex_unlock(&vm->snap_mutex); 4562 return snap; 4563 } 4564 4565 void xe_vm_snapshot_capture_delayed(struct xe_vm_snapshot *snap) 4566 { 4567 if (IS_ERR_OR_NULL(snap)) 4568 return; 4569 4570 for (int i = 0; i < snap->num_snaps; i++) { 4571 struct xe_bo *bo = snap->snap[i].bo; 4572 int err; 4573 4574 if (IS_ERR(snap->snap[i].data) || 4575 snap->snap[i].flags & XE_VM_SNAP_FLAG_IS_NULL) 4576 continue; 4577 4578 snap->snap[i].data = kvmalloc(snap->snap[i].len, GFP_USER); 4579 if (!snap->snap[i].data) { 4580 snap->snap[i].data = ERR_PTR(-ENOMEM); 4581 goto cleanup_bo; 4582 } 4583 4584 if (bo) { 4585 err = xe_bo_read(bo, snap->snap[i].bo_ofs, 4586 snap->snap[i].data, snap->snap[i].len); 4587 } else { 4588 void __user *userptr = (void __user *)(size_t)snap->snap[i].bo_ofs; 4589 4590 kthread_use_mm(snap->snap[i].mm); 4591 if (!copy_from_user(snap->snap[i].data, userptr, snap->snap[i].len)) 4592 err = 0; 4593 else 4594 err = -EFAULT; 4595 kthread_unuse_mm(snap->snap[i].mm); 4596 4597 mmput(snap->snap[i].mm); 4598 snap->snap[i].mm = NULL; 4599 } 4600 4601 if (err) { 4602 kvfree(snap->snap[i].data); 4603 snap->snap[i].data = ERR_PTR(err); 4604 } 4605 4606 cleanup_bo: 4607 xe_bo_put(bo); 4608 snap->snap[i].bo = NULL; 4609 } 4610 } 4611 4612 void xe_vm_snapshot_print(struct xe_vm_snapshot *snap, struct drm_printer *p) 4613 { 4614 unsigned long i, j; 4615 4616 if (IS_ERR_OR_NULL(snap)) { 4617 drm_printf(p, "[0].error: %li\n", PTR_ERR(snap)); 4618 return; 4619 } 4620 4621 drm_printf(p, "VM.uapi_flags: 0x%x\n", snap->uapi_flags); 4622 for (i = 0; i < snap->num_snaps; i++) { 4623 drm_printf(p, "[%llx].length: 0x%lx\n", snap->snap[i].ofs, snap->snap[i].len); 4624 4625 drm_printf(p, "[%llx].properties: %s|%s|mem_region=0x%lx|pat_index=%d|cpu_caching=%d\n", 4626 snap->snap[i].ofs, 4627 snap->snap[i].flags & XE_VM_SNAP_FLAG_READ_ONLY ? 4628 "read_only" : "read_write", 4629 snap->snap[i].flags & XE_VM_SNAP_FLAG_IS_NULL ? 4630 "null_sparse" : 4631 snap->snap[i].flags & XE_VM_SNAP_FLAG_USERPTR ? 4632 "userptr" : "bo", 4633 snap->snap[i].uapi_mem_region == -1 ? 0 : 4634 BIT(snap->snap[i].uapi_mem_region), 4635 snap->snap[i].pat_index, 4636 snap->snap[i].cpu_caching); 4637 4638 if (IS_ERR(snap->snap[i].data)) { 4639 drm_printf(p, "[%llx].error: %li\n", snap->snap[i].ofs, 4640 PTR_ERR(snap->snap[i].data)); 4641 continue; 4642 } 4643 4644 if (snap->snap[i].flags & XE_VM_SNAP_FLAG_IS_NULL) 4645 continue; 4646 4647 drm_printf(p, "[%llx].data: ", snap->snap[i].ofs); 4648 4649 for (j = 0; j < snap->snap[i].len; j += sizeof(u32)) { 4650 u32 *val = snap->snap[i].data + j; 4651 char dumped[ASCII85_BUFSZ]; 4652 4653 drm_puts(p, ascii85_encode(*val, dumped)); 4654 } 4655 4656 drm_puts(p, "\n"); 4657 4658 if (drm_coredump_printer_is_full(p)) 4659 return; 4660 } 4661 } 4662 4663 void xe_vm_snapshot_free(struct xe_vm_snapshot *snap) 4664 { 4665 unsigned long i; 4666 4667 if (IS_ERR_OR_NULL(snap)) 4668 return; 4669 4670 for (i = 0; i < snap->num_snaps; i++) { 4671 if (!IS_ERR(snap->snap[i].data)) 4672 kvfree(snap->snap[i].data); 4673 xe_bo_put(snap->snap[i].bo); 4674 if (snap->snap[i].mm) 4675 mmput(snap->snap[i].mm); 4676 } 4677 kvfree(snap); 4678 } 4679 4680 /** 4681 * xe_vma_need_vram_for_atomic - Check if VMA needs VRAM migration for atomic operations 4682 * @xe: Pointer to the Xe device structure 4683 * @vma: Pointer to the virtual memory area (VMA) structure 4684 * @is_atomic: In pagefault path and atomic operation 4685 * 4686 * This function determines whether the given VMA needs to be migrated to 4687 * VRAM in order to do atomic GPU operation. 4688 * 4689 * Return: 4690 * 1 - Migration to VRAM is required 4691 * 0 - Migration is not required 4692 * -EACCES - Invalid access for atomic memory attr 4693 * 4694 */ 4695 int xe_vma_need_vram_for_atomic(struct xe_device *xe, struct xe_vma *vma, bool is_atomic) 4696 { 4697 u32 atomic_access = xe_vma_bo(vma) ? xe_vma_bo(vma)->attr.atomic_access : 4698 vma->attr.atomic_access; 4699 4700 if (!IS_DGFX(xe) || !is_atomic) 4701 return false; 4702 4703 /* 4704 * NOTE: The checks implemented here are platform-specific. For 4705 * instance, on a device supporting CXL atomics, these would ideally 4706 * work universally without additional handling. 4707 */ 4708 switch (atomic_access) { 4709 case DRM_XE_ATOMIC_DEVICE: 4710 return !xe->info.has_device_atomics_on_smem; 4711 4712 case DRM_XE_ATOMIC_CPU: 4713 return -EACCES; 4714 4715 case DRM_XE_ATOMIC_UNDEFINED: 4716 case DRM_XE_ATOMIC_GLOBAL: 4717 default: 4718 return 1; 4719 } 4720 } 4721 4722 static int xe_vm_alloc_vma(struct xe_vm *vm, 4723 struct drm_gpuvm_map_req *map_req, 4724 bool is_madvise) 4725 { 4726 struct xe_vma_ops vops; 4727 struct drm_gpuva_ops *ops = NULL; 4728 struct drm_gpuva_op *__op; 4729 unsigned int vma_flags = 0; 4730 bool remap_op = false; 4731 struct xe_vma_mem_attr tmp_attr = {}; 4732 u16 default_pat; 4733 int err; 4734 4735 lockdep_assert_held_write(&vm->lock); 4736 4737 if (is_madvise) 4738 ops = drm_gpuvm_madvise_ops_create(&vm->gpuvm, map_req); 4739 else 4740 ops = drm_gpuvm_sm_map_ops_create(&vm->gpuvm, map_req); 4741 4742 if (IS_ERR(ops)) 4743 return PTR_ERR(ops); 4744 4745 if (list_empty(&ops->list)) { 4746 err = 0; 4747 goto free_ops; 4748 } 4749 4750 drm_gpuva_for_each_op(__op, ops) { 4751 struct xe_vma_op *op = gpuva_op_to_vma_op(__op); 4752 struct xe_vma *vma = NULL; 4753 4754 if (!is_madvise) { 4755 if (__op->op == DRM_GPUVA_OP_UNMAP) { 4756 vma = gpuva_to_vma(op->base.unmap.va); 4757 XE_WARN_ON(!xe_vma_has_default_mem_attrs(vma)); 4758 default_pat = vma->attr.default_pat_index; 4759 vma_flags = vma->gpuva.flags; 4760 } 4761 4762 if (__op->op == DRM_GPUVA_OP_REMAP) { 4763 vma = gpuva_to_vma(op->base.remap.unmap->va); 4764 default_pat = vma->attr.default_pat_index; 4765 vma_flags = vma->gpuva.flags; 4766 } 4767 4768 if (__op->op == DRM_GPUVA_OP_MAP) { 4769 op->map.vma_flags |= vma_flags & XE_VMA_CREATE_MASK; 4770 op->map.pat_index = default_pat; 4771 } 4772 } else { 4773 if (__op->op == DRM_GPUVA_OP_REMAP) { 4774 vma = gpuva_to_vma(op->base.remap.unmap->va); 4775 xe_assert(vm->xe, !remap_op); 4776 xe_assert(vm->xe, xe_vma_has_no_bo(vma)); 4777 remap_op = true; 4778 vma_flags = vma->gpuva.flags; 4779 } 4780 4781 if (__op->op == DRM_GPUVA_OP_MAP) { 4782 xe_assert(vm->xe, remap_op); 4783 remap_op = false; 4784 /* 4785 * In case of madvise ops DRM_GPUVA_OP_MAP is 4786 * always after DRM_GPUVA_OP_REMAP, so ensure 4787 * to propagate the flags from the vma we're 4788 * unmapping. 4789 */ 4790 op->map.vma_flags |= vma_flags & XE_VMA_CREATE_MASK; 4791 } 4792 } 4793 print_op(vm->xe, __op); 4794 } 4795 4796 xe_vma_ops_init(&vops, vm, NULL, NULL, 0); 4797 4798 if (is_madvise) 4799 vops.flags |= XE_VMA_OPS_FLAG_MADVISE; 4800 else 4801 vops.flags |= XE_VMA_OPS_FLAG_ALLOW_SVM_UNMAP; 4802 4803 err = vm_bind_ioctl_ops_parse(vm, ops, &vops); 4804 if (err) 4805 goto unwind_ops; 4806 4807 xe_vm_lock(vm, false); 4808 4809 drm_gpuva_for_each_op(__op, ops) { 4810 struct xe_vma_op *op = gpuva_op_to_vma_op(__op); 4811 struct xe_vma *vma; 4812 4813 if (__op->op == DRM_GPUVA_OP_UNMAP) { 4814 vma = gpuva_to_vma(op->base.unmap.va); 4815 /* There should be no unmap for madvise */ 4816 if (is_madvise) 4817 XE_WARN_ON("UNEXPECTED UNMAP"); 4818 4819 xe_vma_destroy(vma, NULL); 4820 } else if (__op->op == DRM_GPUVA_OP_REMAP) { 4821 vma = gpuva_to_vma(op->base.remap.unmap->va); 4822 /* In case of madvise ops Store attributes for REMAP UNMAPPED 4823 * VMA, so they can be assigned to newly MAP created vma. 4824 */ 4825 if (is_madvise) 4826 xe_vma_mem_attr_copy(&tmp_attr, &vma->attr); 4827 4828 xe_vma_destroy(gpuva_to_vma(op->base.remap.unmap->va), NULL); 4829 } else if (__op->op == DRM_GPUVA_OP_MAP) { 4830 vma = op->map.vma; 4831 /* In case of madvise call, MAP will always be followed by REMAP. 4832 * Therefore temp_attr will always have sane values, making it safe to 4833 * copy them to new vma. 4834 */ 4835 if (is_madvise) 4836 xe_vma_mem_attr_copy(&vma->attr, &tmp_attr); 4837 } 4838 } 4839 4840 xe_vm_unlock(vm); 4841 drm_gpuva_ops_free(&vm->gpuvm, ops); 4842 xe_vma_mem_attr_fini(&tmp_attr); 4843 return 0; 4844 4845 unwind_ops: 4846 vm_bind_ioctl_ops_unwind(vm, &ops, 1); 4847 free_ops: 4848 drm_gpuva_ops_free(&vm->gpuvm, ops); 4849 return err; 4850 } 4851 4852 /** 4853 * xe_vm_alloc_madvise_vma - Allocate VMA's with madvise ops 4854 * @vm: Pointer to the xe_vm structure 4855 * @start: Starting input address 4856 * @range: Size of the input range 4857 * 4858 * This function splits existing vma to create new vma for user provided input range 4859 * 4860 * Return: 0 if success 4861 */ 4862 int xe_vm_alloc_madvise_vma(struct xe_vm *vm, uint64_t start, uint64_t range) 4863 { 4864 struct drm_gpuvm_map_req map_req = { 4865 .map.va.addr = start, 4866 .map.va.range = range, 4867 }; 4868 4869 lockdep_assert_held_write(&vm->lock); 4870 4871 vm_dbg(&vm->xe->drm, "MADVISE_OPS_CREATE: addr=0x%016llx, size=0x%016llx", start, range); 4872 4873 return xe_vm_alloc_vma(vm, &map_req, true); 4874 } 4875 4876 static bool is_cpu_addr_vma_with_default_attr(struct xe_vma *vma) 4877 { 4878 return vma && xe_vma_is_cpu_addr_mirror(vma) && 4879 xe_vma_has_default_mem_attrs(vma); 4880 } 4881 4882 /** 4883 * xe_vm_find_cpu_addr_mirror_vma_range - Extend a VMA range to include adjacent CPU-mirrored VMAs 4884 * @vm: VM to search within 4885 * @start: Input/output pointer to the starting address of the range 4886 * @end: Input/output pointer to the end address of the range 4887 * 4888 * Given a range defined by @start and @range, this function checks the VMAs 4889 * immediately before and after the range. If those neighboring VMAs are 4890 * CPU-address-mirrored and have default memory attributes, the function 4891 * updates @start and @range to include them. This extended range can then 4892 * be used for merging or other operations that require a unified VMA. 4893 * 4894 * The function does not perform the merge itself; it only computes the 4895 * mergeable boundaries. 4896 */ 4897 void xe_vm_find_cpu_addr_mirror_vma_range(struct xe_vm *vm, u64 *start, u64 *end) 4898 { 4899 struct xe_vma *prev, *next; 4900 4901 lockdep_assert_held(&vm->lock); 4902 4903 if (*start >= SZ_4K) { 4904 prev = xe_vm_find_vma_by_addr(vm, *start - SZ_4K); 4905 if (is_cpu_addr_vma_with_default_attr(prev)) 4906 *start = xe_vma_start(prev); 4907 } 4908 4909 if (*end < vm->size) { 4910 next = xe_vm_find_vma_by_addr(vm, *end + 1); 4911 if (is_cpu_addr_vma_with_default_attr(next)) 4912 *end = xe_vma_end(next); 4913 } 4914 } 4915 4916 /** 4917 * xe_vm_alloc_cpu_addr_mirror_vma - Allocate CPU addr mirror vma 4918 * @vm: Pointer to the xe_vm structure 4919 * @start: Starting input address 4920 * @range: Size of the input range 4921 * 4922 * This function splits/merges existing vma to create new vma for user provided input range 4923 * 4924 * Return: 0 if success 4925 */ 4926 int xe_vm_alloc_cpu_addr_mirror_vma(struct xe_vm *vm, uint64_t start, uint64_t range) 4927 { 4928 struct drm_gpuvm_map_req map_req = { 4929 .map.va.addr = start, 4930 .map.va.range = range, 4931 }; 4932 4933 lockdep_assert_held_write(&vm->lock); 4934 4935 vm_dbg(&vm->xe->drm, "CPU_ADDR_MIRROR_VMA_OPS_CREATE: addr=0x%016llx, size=0x%016llx", 4936 start, range); 4937 4938 return xe_vm_alloc_vma(vm, &map_req, false); 4939 } 4940 4941 /** 4942 * xe_vm_add_exec_queue() - Add exec queue to VM 4943 * @vm: The VM. 4944 * @q: The exec_queue 4945 * 4946 * Add exec queue to VM, skipped if the device does not have context based TLB 4947 * invalidations. 4948 */ 4949 void xe_vm_add_exec_queue(struct xe_vm *vm, struct xe_exec_queue *q) 4950 { 4951 struct xe_device *xe = vm->xe; 4952 4953 /* User VMs and queues only */ 4954 xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_KERNEL)); 4955 xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_PERMANENT)); 4956 xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_VM)); 4957 xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_MIGRATE)); 4958 xe_assert(xe, vm->xef); 4959 xe_assert(xe, vm == q->vm); 4960 4961 if (!xe->info.has_ctx_tlb_inval) 4962 return; 4963 4964 down_write(&vm->exec_queues.lock); 4965 list_add(&q->vm_exec_queue_link, &vm->exec_queues.list[q->gt->info.id]); 4966 ++vm->exec_queues.count[q->gt->info.id]; 4967 up_write(&vm->exec_queues.lock); 4968 } 4969 4970 /** 4971 * xe_vm_remove_exec_queue() - Remove exec queue from VM 4972 * @vm: The VM. 4973 * @q: The exec_queue 4974 * 4975 * Remove exec queue from VM, skipped if the device does not have context based 4976 * TLB invalidations. 4977 */ 4978 void xe_vm_remove_exec_queue(struct xe_vm *vm, struct xe_exec_queue *q) 4979 { 4980 if (!vm->xe->info.has_ctx_tlb_inval) 4981 return; 4982 4983 down_write(&vm->exec_queues.lock); 4984 if (!list_empty(&q->vm_exec_queue_link)) { 4985 list_del(&q->vm_exec_queue_link); 4986 --vm->exec_queues.count[q->gt->info.id]; 4987 } 4988 up_write(&vm->exec_queues.lock); 4989 } 4990