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
xe_vm_obj(struct xe_vm * vm)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 */
xe_vm_drm_exec_lock(struct xe_vm * vm,struct drm_exec * exec)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
preempt_fences_waiting(struct xe_vm * vm)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
free_preempt_fences(struct list_head * list)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
alloc_preempt_fences(struct xe_vm * vm,struct list_head * list,unsigned int * count)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
wait_for_existing_preempt_fences(struct xe_vm * vm)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
xe_vm_is_idle(struct xe_vm * vm)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
arm_preempt_fences(struct xe_vm * vm,struct list_head * list)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
add_preempt_fences(struct xe_vm * vm,struct xe_bo * bo)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
resume_and_reinstall_preempt_fences(struct xe_vm * vm,struct drm_exec * exec)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
xe_vm_add_compute_exec_queue(struct xe_vm * vm,struct xe_exec_queue * q)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 */
xe_vm_remove_compute_exec_queue(struct xe_vm * vm,struct xe_exec_queue * q)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 */
xe_vm_kill(struct xe_vm * vm,bool unlocked)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
xe_gpuvm_validate(struct drm_gpuvm_bo * vm_bo,struct drm_exec * exec)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 */
xe_vm_validate_rebind(struct xe_vm * vm,struct drm_exec * exec,unsigned int num_fences)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
xe_preempt_work_begin(struct drm_exec * exec,struct xe_vm * vm,bool * done)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
vm_suspend_rebind_worker(struct xe_vm * vm)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 */
xe_vm_resume_rebind_worker(struct xe_vm * vm)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
preempt_rebind_work_func(struct work_struct * w)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 */
xe_vm_add_fault_entry_pf(struct xe_vm * vm,struct xe_pagefault * pf)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
xe_vm_clear_fault_entries(struct xe_vm * vm)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
xe_vma_ops_alloc(struct xe_vma_ops * vops,bool array_of_binds)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
xe_vma_svm_prefetch_op_fini(struct xe_vma_op * op)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
xe_vma_svm_prefetch_ops_fini(struct xe_vma_ops * vops)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
xe_vma_ops_fini(struct xe_vma_ops * vops)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
xe_vma_ops_incr_pt_update_ops(struct xe_vma_ops * vops,u8 tile_mask,int inc_val)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
xe_vm_populate_rebind(struct xe_vma_op * op,struct xe_vma * vma,u8 tile_mask)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
xe_vm_ops_add_rebind(struct xe_vma_ops * vops,struct xe_vma * vma,u8 tile_mask)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
xe_vm_rebind(struct xe_vm * vm,bool rebind_worker)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
xe_vma_rebind(struct xe_vm * vm,struct xe_vma * vma,u8 tile_mask)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
xe_vm_populate_range_rebind(struct xe_vma_op * op,struct xe_vma * vma,struct xe_svm_range * range,u8 tile_mask)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
xe_vm_ops_add_range_rebind(struct xe_vma_ops * vops,struct xe_vma * vma,struct xe_svm_range * range,u8 tile_mask)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 */
xe_vm_range_rebind(struct xe_vm * vm,struct xe_vma * vma,struct xe_svm_range * range,u8 tile_mask)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
xe_vm_populate_range_unbind(struct xe_vma_op * op,struct xe_svm_range * range)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
xe_vm_ops_add_range_unbind(struct xe_vma_ops * vops,struct xe_svm_range * range)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 */
xe_vm_range_unbind(struct xe_vm * vm,struct xe_svm_range * range)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
xe_vma_mem_attr_fini(struct xe_vma_mem_attr * attr)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
xe_vma_free(struct xe_vma * vma)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 */
xe_vma_mem_attr_copy(struct xe_vma_mem_attr * to,struct xe_vma_mem_attr * from)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
xe_vma_create(struct xe_vm * vm,struct xe_bo * bo,u64 bo_offset_or_userptr,u64 start,u64 end,struct xe_vma_mem_attr * attr,unsigned int flags)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
xe_vma_destroy_late(struct xe_vma * vma)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
vma_destroy_work_func(struct work_struct * w)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
vma_destroy_cb(struct dma_fence * fence,struct dma_fence_cb * cb)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
xe_vma_destroy(struct xe_vma * vma,struct dma_fence * fence)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 */
xe_vm_lock_vma(struct drm_exec * exec,struct xe_vma * vma)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
xe_vma_destroy_unlocked(struct xe_vma * vma)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 *
xe_vm_find_overlapping_vma(struct xe_vm * vm,u64 start,u64 range)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
xe_vm_insert_vma(struct xe_vm * vm,struct xe_vma * vma)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
xe_vm_remove_vma(struct xe_vm * vm,struct xe_vma * vma)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
xe_vm_op_alloc(void)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
pde_encode_pat_index(u16 pat_index)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
pte_encode_pat_index(u16 pat_index,u32 pt_level)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
pte_encode_ps(u32 pt_level)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
pde_pat_index(struct xe_bo * bo)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
xelp_pde_encode_bo(struct xe_bo * bo,u64 bo_offset)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
xelp_pte_encode_bo(struct xe_bo * bo,u64 bo_offset,u16 pat_index,u32 pt_level)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
xelp_pte_encode_vma(u64 pte,struct xe_vma * vma,u16 pat_index,u32 pt_level)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
xelp_pte_encode_addr(struct xe_device * xe,u64 addr,u16 pat_index,u32 pt_level,bool devmem,u64 flags)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 */
xe_vm_create_scratch(struct xe_device * xe,struct xe_tile * tile,struct xe_vm * vm,struct drm_exec * exec)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
xe_vm_free_scratch(struct xe_vm * vm)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
xe_vm_pt_destroy(struct xe_vm * vm)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
xe_vm_init_prove_locking(struct xe_device * xe,struct xe_vm * vm)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
xe_vm_create(struct xe_device * xe,u32 flags,struct xe_file * xef)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
xe_vm_close(struct xe_vm * vm)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
xe_vm_close_and_put(struct xe_vm * vm)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 /*
1951 * All vm operations will add shared fences to resv.
1952 * The only exception is eviction for a shared object,
1953 * but even so, the unbind when evicted would still
1954 * install a fence to resv. Hence it's safe to
1955 * destroy the pagetables immediately.
1956 */
1957 xe_vm_free_scratch(vm);
1958 xe_vm_pt_destroy(vm);
1959 xe_vm_unlock(vm);
1960
1961 /*
1962 * VM is now dead, cannot re-add nodes to vm->vmas if it's NULL
1963 * Since we hold a refcount to the bo, we can remove and free
1964 * the members safely without locking.
1965 */
1966 list_for_each_entry_safe(vma, next_vma, &contested,
1967 combined_links.destroy) {
1968 list_del_init(&vma->combined_links.destroy);
1969 xe_vma_destroy_unlocked(vma);
1970 }
1971
1972 xe_svm_fini(vm);
1973
1974 up_write(&vm->lock);
1975
1976 down_write(&xe->usm.lock);
1977 if (vm->usm.asid) {
1978 void *lookup;
1979
1980 xe_assert(xe, xe->info.has_asid);
1981 xe_assert(xe, !(vm->flags & XE_VM_FLAG_MIGRATION));
1982
1983 lookup = xa_erase(&xe->usm.asid_to_vm, vm->usm.asid);
1984 xe_assert(xe, lookup == vm);
1985 }
1986 up_write(&xe->usm.lock);
1987
1988 xe_vm_clear_fault_entries(vm);
1989
1990 for_each_tile(tile, xe, id)
1991 xe_range_fence_tree_fini(&vm->rftree[id]);
1992
1993 xe_vm_put(vm);
1994 }
1995
vm_destroy_work_func(struct work_struct * w)1996 static void vm_destroy_work_func(struct work_struct *w)
1997 {
1998 struct xe_vm *vm =
1999 container_of(w, struct xe_vm, destroy_work);
2000 struct xe_device *xe = vm->xe;
2001 struct xe_tile *tile;
2002 u8 id;
2003
2004 /* xe_vm_close_and_put was not called? */
2005 xe_assert(xe, !vm->size);
2006
2007 if (xe_vm_in_preempt_fence_mode(vm))
2008 flush_work(&vm->preempt.rebind_work);
2009
2010 mutex_destroy(&vm->snap_mutex);
2011
2012 if (vm->flags & XE_VM_FLAG_LR_MODE)
2013 xe_pm_runtime_put(xe);
2014
2015 for_each_tile(tile, xe, id)
2016 XE_WARN_ON(vm->pt_root[id]);
2017
2018 trace_xe_vm_free(vm);
2019
2020 ttm_lru_bulk_move_fini(&xe->ttm, &vm->lru_bulk_move);
2021
2022 if (vm->xef)
2023 xe_file_put(vm->xef);
2024
2025 kfree(vm);
2026 }
2027
xe_vm_free(struct drm_gpuvm * gpuvm)2028 static void xe_vm_free(struct drm_gpuvm *gpuvm)
2029 {
2030 struct xe_vm *vm = container_of(gpuvm, struct xe_vm, gpuvm);
2031
2032 /* To destroy the VM we need to be able to sleep */
2033 queue_work(system_dfl_wq, &vm->destroy_work);
2034 }
2035
xe_vm_lookup(struct xe_file * xef,u32 id)2036 struct xe_vm *xe_vm_lookup(struct xe_file *xef, u32 id)
2037 {
2038 struct xe_vm *vm;
2039
2040 mutex_lock(&xef->vm.lock);
2041 vm = xa_load(&xef->vm.xa, id);
2042 if (vm)
2043 xe_vm_get(vm);
2044 mutex_unlock(&xef->vm.lock);
2045
2046 return vm;
2047 }
2048
xe_vm_pdp4_descriptor(struct xe_vm * vm,struct xe_tile * tile)2049 u64 xe_vm_pdp4_descriptor(struct xe_vm *vm, struct xe_tile *tile)
2050 {
2051 return vm->pt_ops->pde_encode_bo(vm->pt_root[tile->id]->bo, 0);
2052 }
2053
2054 static struct xe_exec_queue *
to_wait_exec_queue(struct xe_vm * vm,struct xe_exec_queue * q)2055 to_wait_exec_queue(struct xe_vm *vm, struct xe_exec_queue *q)
2056 {
2057 return q ? q : vm->q[0];
2058 }
2059
2060 static struct xe_user_fence *
find_ufence_get(struct xe_sync_entry * syncs,u32 num_syncs)2061 find_ufence_get(struct xe_sync_entry *syncs, u32 num_syncs)
2062 {
2063 unsigned int i;
2064
2065 for (i = 0; i < num_syncs; i++) {
2066 struct xe_sync_entry *e = &syncs[i];
2067
2068 if (xe_sync_is_ufence(e))
2069 return xe_sync_ufence_get(e);
2070 }
2071
2072 return NULL;
2073 }
2074
2075 #define ALL_DRM_XE_VM_CREATE_FLAGS (DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE | \
2076 DRM_XE_VM_CREATE_FLAG_LR_MODE | \
2077 DRM_XE_VM_CREATE_FLAG_FAULT_MODE | \
2078 DRM_XE_VM_CREATE_FLAG_NO_VM_OVERCOMMIT)
2079
xe_vm_create_ioctl(struct drm_device * dev,void * data,struct drm_file * file)2080 int xe_vm_create_ioctl(struct drm_device *dev, void *data,
2081 struct drm_file *file)
2082 {
2083 struct xe_device *xe = to_xe_device(dev);
2084 struct xe_file *xef = to_xe_file(file);
2085 struct drm_xe_vm_create *args = data;
2086 struct xe_gt *wa_gt = xe_root_mmio_gt(xe);
2087 struct xe_vm *vm;
2088 u32 id;
2089 int err;
2090 u32 flags = 0;
2091
2092 if (XE_IOCTL_DBG(xe, args->extensions))
2093 return -EINVAL;
2094
2095 if (wa_gt && XE_GT_WA(wa_gt, 22014953428))
2096 args->flags |= DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE;
2097
2098 if (XE_IOCTL_DBG(xe, args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE &&
2099 !xe->info.has_usm))
2100 return -EINVAL;
2101
2102 if (XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
2103 return -EINVAL;
2104
2105 if (XE_IOCTL_DBG(xe, args->flags & ~ALL_DRM_XE_VM_CREATE_FLAGS))
2106 return -EINVAL;
2107
2108 if (XE_IOCTL_DBG(xe, args->flags & DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE &&
2109 args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE &&
2110 !xe->info.needs_scratch))
2111 return -EINVAL;
2112
2113 if (XE_IOCTL_DBG(xe, !(args->flags & DRM_XE_VM_CREATE_FLAG_LR_MODE) &&
2114 args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE))
2115 return -EINVAL;
2116
2117 if (XE_IOCTL_DBG(xe, !(args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE) &&
2118 args->flags & DRM_XE_VM_CREATE_FLAG_NO_VM_OVERCOMMIT))
2119 return -EINVAL;
2120
2121 if (args->flags & DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE)
2122 flags |= XE_VM_FLAG_SCRATCH_PAGE;
2123 if (args->flags & DRM_XE_VM_CREATE_FLAG_LR_MODE)
2124 flags |= XE_VM_FLAG_LR_MODE;
2125 if (args->flags & DRM_XE_VM_CREATE_FLAG_FAULT_MODE)
2126 flags |= XE_VM_FLAG_FAULT_MODE;
2127 if (args->flags & DRM_XE_VM_CREATE_FLAG_NO_VM_OVERCOMMIT)
2128 flags |= XE_VM_FLAG_NO_VM_OVERCOMMIT;
2129
2130 vm = xe_vm_create(xe, flags, xef);
2131 if (IS_ERR(vm))
2132 return PTR_ERR(vm);
2133
2134 #if IS_ENABLED(CONFIG_DRM_XE_DEBUG_MEM)
2135 /* Warning: Security issue - never enable by default */
2136 args->reserved[0] = xe_bo_main_addr(vm->pt_root[0]->bo, XE_PAGE_SIZE);
2137 #endif
2138
2139 /* user id alloc must always be last in ioctl to prevent UAF */
2140 err = xa_alloc(&xef->vm.xa, &id, vm, xa_limit_32b, GFP_KERNEL);
2141 if (err)
2142 goto err_close_and_put;
2143
2144 args->vm_id = id;
2145
2146 return 0;
2147
2148 err_close_and_put:
2149 xe_vm_close_and_put(vm);
2150
2151 return err;
2152 }
2153
xe_vm_destroy_ioctl(struct drm_device * dev,void * data,struct drm_file * file)2154 int xe_vm_destroy_ioctl(struct drm_device *dev, void *data,
2155 struct drm_file *file)
2156 {
2157 struct xe_device *xe = to_xe_device(dev);
2158 struct xe_file *xef = to_xe_file(file);
2159 struct drm_xe_vm_destroy *args = data;
2160 struct xe_vm *vm;
2161 int err = 0;
2162
2163 if (XE_IOCTL_DBG(xe, args->pad) ||
2164 XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
2165 return -EINVAL;
2166
2167 mutex_lock(&xef->vm.lock);
2168 vm = xa_load(&xef->vm.xa, args->vm_id);
2169 if (XE_IOCTL_DBG(xe, !vm))
2170 err = -ENOENT;
2171 else if (XE_IOCTL_DBG(xe, vm->preempt.num_exec_queues))
2172 err = -EBUSY;
2173 else
2174 xa_erase(&xef->vm.xa, args->vm_id);
2175 mutex_unlock(&xef->vm.lock);
2176
2177 if (!err)
2178 xe_vm_close_and_put(vm);
2179
2180 return err;
2181 }
2182
xe_vm_query_vmas(struct xe_vm * vm,u64 start,u64 end)2183 static int xe_vm_query_vmas(struct xe_vm *vm, u64 start, u64 end)
2184 {
2185 struct drm_gpuva *gpuva;
2186 u32 num_vmas = 0;
2187
2188 lockdep_assert_held(&vm->lock);
2189 drm_gpuvm_for_each_va_range(gpuva, &vm->gpuvm, start, end)
2190 num_vmas++;
2191
2192 return num_vmas;
2193 }
2194
get_mem_attrs(struct xe_vm * vm,u32 * num_vmas,u64 start,u64 end,struct drm_xe_mem_range_attr * attrs)2195 static int get_mem_attrs(struct xe_vm *vm, u32 *num_vmas, u64 start,
2196 u64 end, struct drm_xe_mem_range_attr *attrs)
2197 {
2198 struct drm_gpuva *gpuva;
2199 int i = 0;
2200
2201 lockdep_assert_held(&vm->lock);
2202
2203 drm_gpuvm_for_each_va_range(gpuva, &vm->gpuvm, start, end) {
2204 struct xe_vma *vma = gpuva_to_vma(gpuva);
2205
2206 if (i == *num_vmas)
2207 return -ENOSPC;
2208
2209 attrs[i].start = xe_vma_start(vma);
2210 attrs[i].end = xe_vma_end(vma);
2211 attrs[i].atomic.val = vma->attr.atomic_access;
2212 attrs[i].pat_index.val = vma->attr.pat_index;
2213 attrs[i].preferred_mem_loc.devmem_fd = vma->attr.preferred_loc.devmem_fd;
2214 attrs[i].preferred_mem_loc.migration_policy =
2215 vma->attr.preferred_loc.migration_policy;
2216
2217 i++;
2218 }
2219
2220 *num_vmas = i;
2221 return 0;
2222 }
2223
xe_vm_query_vmas_attrs_ioctl(struct drm_device * dev,void * data,struct drm_file * file)2224 int xe_vm_query_vmas_attrs_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
2225 {
2226 struct xe_device *xe = to_xe_device(dev);
2227 struct xe_file *xef = to_xe_file(file);
2228 struct drm_xe_mem_range_attr *mem_attrs;
2229 struct drm_xe_vm_query_mem_range_attr *args = data;
2230 u64 __user *attrs_user = u64_to_user_ptr(args->vector_of_mem_attr);
2231 struct xe_vm *vm;
2232 int err = 0;
2233
2234 if (XE_IOCTL_DBG(xe,
2235 ((args->num_mem_ranges == 0 &&
2236 (attrs_user || args->sizeof_mem_range_attr != 0)) ||
2237 (args->num_mem_ranges > 0 &&
2238 (!attrs_user ||
2239 args->sizeof_mem_range_attr !=
2240 sizeof(struct drm_xe_mem_range_attr))))))
2241 return -EINVAL;
2242
2243 vm = xe_vm_lookup(xef, args->vm_id);
2244 if (XE_IOCTL_DBG(xe, !vm))
2245 return -EINVAL;
2246
2247 err = down_read_interruptible(&vm->lock);
2248 if (err)
2249 goto put_vm;
2250
2251 attrs_user = u64_to_user_ptr(args->vector_of_mem_attr);
2252
2253 if (args->num_mem_ranges == 0 && !attrs_user) {
2254 args->num_mem_ranges = xe_vm_query_vmas(vm, args->start, args->start + args->range);
2255 args->sizeof_mem_range_attr = sizeof(struct drm_xe_mem_range_attr);
2256 goto unlock_vm;
2257 }
2258
2259 mem_attrs = kvmalloc_array(args->num_mem_ranges, args->sizeof_mem_range_attr,
2260 GFP_KERNEL | __GFP_ACCOUNT |
2261 __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
2262 if (!mem_attrs) {
2263 err = args->num_mem_ranges > 1 ? -ENOBUFS : -ENOMEM;
2264 goto unlock_vm;
2265 }
2266
2267 memset(mem_attrs, 0, args->num_mem_ranges * args->sizeof_mem_range_attr);
2268 err = get_mem_attrs(vm, &args->num_mem_ranges, args->start,
2269 args->start + args->range, mem_attrs);
2270 if (err)
2271 goto free_mem_attrs;
2272
2273 err = copy_to_user(attrs_user, mem_attrs,
2274 args->sizeof_mem_range_attr * args->num_mem_ranges);
2275 if (err)
2276 err = -EFAULT;
2277
2278 free_mem_attrs:
2279 kvfree(mem_attrs);
2280 unlock_vm:
2281 up_read(&vm->lock);
2282 put_vm:
2283 xe_vm_put(vm);
2284 return err;
2285 }
2286
vma_matches(struct xe_vma * vma,u64 page_addr)2287 static bool vma_matches(struct xe_vma *vma, u64 page_addr)
2288 {
2289 if (page_addr > xe_vma_end(vma) - 1 ||
2290 page_addr + SZ_4K - 1 < xe_vma_start(vma))
2291 return false;
2292
2293 return true;
2294 }
2295
2296 /**
2297 * xe_vm_find_vma_by_addr() - Find a VMA by its address
2298 *
2299 * @vm: the xe_vm the vma belongs to
2300 * @page_addr: address to look up
2301 */
xe_vm_find_vma_by_addr(struct xe_vm * vm,u64 page_addr)2302 struct xe_vma *xe_vm_find_vma_by_addr(struct xe_vm *vm, u64 page_addr)
2303 {
2304 struct xe_vma *vma = NULL;
2305
2306 if (vm->usm.last_fault_vma) { /* Fast lookup */
2307 if (vma_matches(vm->usm.last_fault_vma, page_addr))
2308 vma = vm->usm.last_fault_vma;
2309 }
2310 if (!vma)
2311 vma = xe_vm_find_overlapping_vma(vm, page_addr, SZ_4K);
2312
2313 return vma;
2314 }
2315
2316 static const u32 region_to_mem_type[] = {
2317 XE_PL_TT,
2318 XE_PL_VRAM0,
2319 XE_PL_VRAM1,
2320 };
2321
prep_vma_destroy(struct xe_vm * vm,struct xe_vma * vma,bool post_commit)2322 static void prep_vma_destroy(struct xe_vm *vm, struct xe_vma *vma,
2323 bool post_commit)
2324 {
2325 xe_svm_notifier_lock(vm);
2326 vma->gpuva.flags |= XE_VMA_DESTROYED;
2327 xe_svm_notifier_unlock(vm);
2328 if (post_commit)
2329 xe_vm_remove_vma(vm, vma);
2330 }
2331
2332 #undef ULL
2333 #define ULL unsigned long long
2334
2335 #if IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM)
print_op(struct xe_device * xe,struct drm_gpuva_op * op)2336 static void print_op(struct xe_device *xe, struct drm_gpuva_op *op)
2337 {
2338 struct xe_vma *vma;
2339
2340 switch (op->op) {
2341 case DRM_GPUVA_OP_MAP:
2342 vm_dbg(&xe->drm, "MAP: addr=0x%016llx, range=0x%016llx",
2343 (ULL)op->map.va.addr, (ULL)op->map.va.range);
2344 break;
2345 case DRM_GPUVA_OP_REMAP:
2346 vma = gpuva_to_vma(op->remap.unmap->va);
2347 vm_dbg(&xe->drm, "REMAP:UNMAP: addr=0x%016llx, range=0x%016llx, keep=%d",
2348 (ULL)xe_vma_start(vma), (ULL)xe_vma_size(vma),
2349 op->remap.unmap->keep ? 1 : 0);
2350 if (op->remap.prev)
2351 vm_dbg(&xe->drm,
2352 "REMAP:PREV: addr=0x%016llx, range=0x%016llx",
2353 (ULL)op->remap.prev->va.addr,
2354 (ULL)op->remap.prev->va.range);
2355 if (op->remap.next)
2356 vm_dbg(&xe->drm,
2357 "REMAP:NEXT: addr=0x%016llx, range=0x%016llx",
2358 (ULL)op->remap.next->va.addr,
2359 (ULL)op->remap.next->va.range);
2360 break;
2361 case DRM_GPUVA_OP_UNMAP:
2362 vma = gpuva_to_vma(op->unmap.va);
2363 vm_dbg(&xe->drm, "UNMAP: addr=0x%016llx, range=0x%016llx, keep=%d",
2364 (ULL)xe_vma_start(vma), (ULL)xe_vma_size(vma),
2365 op->unmap.keep ? 1 : 0);
2366 break;
2367 case DRM_GPUVA_OP_PREFETCH:
2368 vma = gpuva_to_vma(op->prefetch.va);
2369 vm_dbg(&xe->drm, "PREFETCH: addr=0x%016llx, range=0x%016llx",
2370 (ULL)xe_vma_start(vma), (ULL)xe_vma_size(vma));
2371 break;
2372 default:
2373 drm_warn(&xe->drm, "NOT POSSIBLE\n");
2374 }
2375 }
2376 #else
print_op(struct xe_device * xe,struct drm_gpuva_op * op)2377 static void print_op(struct xe_device *xe, struct drm_gpuva_op *op)
2378 {
2379 }
2380 #endif
2381
__xe_vm_needs_clear_scratch_pages(struct xe_vm * vm,u32 bind_flags)2382 static bool __xe_vm_needs_clear_scratch_pages(struct xe_vm *vm, u32 bind_flags)
2383 {
2384 if (!xe_vm_in_fault_mode(vm))
2385 return false;
2386
2387 if (!xe_vm_has_scratch(vm))
2388 return false;
2389
2390 if (bind_flags & DRM_XE_VM_BIND_FLAG_IMMEDIATE)
2391 return false;
2392
2393 return true;
2394 }
2395
xe_svm_prefetch_gpuva_ops_fini(struct drm_gpuva_ops * ops)2396 static void xe_svm_prefetch_gpuva_ops_fini(struct drm_gpuva_ops *ops)
2397 {
2398 struct drm_gpuva_op *__op;
2399
2400 drm_gpuva_for_each_op(__op, ops) {
2401 struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
2402
2403 xe_vma_svm_prefetch_op_fini(op);
2404 }
2405 }
2406
2407 /*
2408 * Create operations list from IOCTL arguments, setup operations fields so parse
2409 * and commit steps are decoupled from IOCTL arguments. This step can fail.
2410 */
2411 static struct drm_gpuva_ops *
vm_bind_ioctl_ops_create(struct xe_vm * vm,struct xe_vma_ops * vops,struct xe_bo * bo,u64 bo_offset_or_userptr,u64 addr,u64 range,u32 operation,u32 flags,u32 prefetch_region,u16 pat_index)2412 vm_bind_ioctl_ops_create(struct xe_vm *vm, struct xe_vma_ops *vops,
2413 struct xe_bo *bo, u64 bo_offset_or_userptr,
2414 u64 addr, u64 range,
2415 u32 operation, u32 flags,
2416 u32 prefetch_region, u16 pat_index)
2417 {
2418 struct drm_gem_object *obj = bo ? &bo->ttm.base : NULL;
2419 struct drm_gpuva_ops *ops;
2420 struct drm_gpuva_op *__op;
2421 struct drm_gpuvm_bo *vm_bo;
2422 u64 range_start = addr;
2423 u64 range_end = addr + range;
2424 int err;
2425
2426 lockdep_assert_held_write(&vm->lock);
2427
2428 vm_dbg(&vm->xe->drm,
2429 "op=%d, addr=0x%016llx, range=0x%016llx, bo_offset_or_userptr=0x%016llx",
2430 operation, (ULL)addr, (ULL)range,
2431 (ULL)bo_offset_or_userptr);
2432
2433 switch (operation) {
2434 case DRM_XE_VM_BIND_OP_MAP:
2435 if (flags & DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR) {
2436 xe_vm_find_cpu_addr_mirror_vma_range(vm, &range_start, &range_end);
2437 vops->flags |= XE_VMA_OPS_FLAG_ALLOW_SVM_UNMAP;
2438 }
2439
2440 fallthrough;
2441 case DRM_XE_VM_BIND_OP_MAP_USERPTR: {
2442 struct drm_gpuvm_map_req map_req = {
2443 .map.va.addr = range_start,
2444 .map.va.range = range_end - range_start,
2445 .map.gem.obj = obj,
2446 .map.gem.offset = bo_offset_or_userptr,
2447 };
2448
2449 ops = drm_gpuvm_sm_map_ops_create(&vm->gpuvm, &map_req);
2450 break;
2451 }
2452 case DRM_XE_VM_BIND_OP_UNMAP:
2453 ops = drm_gpuvm_sm_unmap_ops_create(&vm->gpuvm, addr, range);
2454 break;
2455 case DRM_XE_VM_BIND_OP_PREFETCH:
2456 ops = drm_gpuvm_prefetch_ops_create(&vm->gpuvm, addr, range);
2457 break;
2458 case DRM_XE_VM_BIND_OP_UNMAP_ALL:
2459 xe_assert(vm->xe, bo);
2460
2461 err = xe_bo_lock(bo, true);
2462 if (err)
2463 return ERR_PTR(err);
2464
2465 vm_bo = drm_gpuvm_bo_obtain_locked(&vm->gpuvm, obj);
2466 if (IS_ERR(vm_bo)) {
2467 xe_bo_unlock(bo);
2468 return ERR_CAST(vm_bo);
2469 }
2470
2471 ops = drm_gpuvm_bo_unmap_ops_create(vm_bo);
2472 drm_gpuvm_bo_put(vm_bo);
2473 xe_bo_unlock(bo);
2474 break;
2475 default:
2476 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n");
2477 ops = ERR_PTR(-EINVAL);
2478 }
2479 if (IS_ERR(ops))
2480 return ops;
2481
2482 drm_gpuva_for_each_op(__op, ops) {
2483 struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
2484
2485 if (__op->op == DRM_GPUVA_OP_MAP) {
2486 op->map.immediate =
2487 flags & DRM_XE_VM_BIND_FLAG_IMMEDIATE;
2488 if (flags & DRM_XE_VM_BIND_FLAG_READONLY)
2489 op->map.vma_flags |= XE_VMA_READ_ONLY;
2490 if (flags & DRM_XE_VM_BIND_FLAG_NULL)
2491 op->map.vma_flags |= DRM_GPUVA_SPARSE;
2492 if (flags & DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR)
2493 op->map.vma_flags |= XE_VMA_SYSTEM_ALLOCATOR;
2494 if (flags & DRM_XE_VM_BIND_FLAG_DUMPABLE)
2495 op->map.vma_flags |= XE_VMA_DUMPABLE;
2496 if (flags & DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET)
2497 op->map.vma_flags |= XE_VMA_MADV_AUTORESET;
2498 op->map.request_decompress = flags & DRM_XE_VM_BIND_FLAG_DECOMPRESS;
2499 op->map.pat_index = pat_index;
2500 op->map.invalidate_on_bind =
2501 __xe_vm_needs_clear_scratch_pages(vm, flags);
2502 } else if (__op->op == DRM_GPUVA_OP_PREFETCH) {
2503 struct xe_vma *vma = gpuva_to_vma(op->base.prefetch.va);
2504 struct xe_tile *tile;
2505 struct xe_svm_range *svm_range;
2506 struct drm_gpusvm_ctx ctx = {};
2507 struct drm_pagemap *dpagemap = NULL;
2508 u8 id, tile_mask = 0;
2509 u32 i;
2510
2511 if (!xe_vma_is_cpu_addr_mirror(vma)) {
2512 op->prefetch.region = prefetch_region;
2513 break;
2514 }
2515
2516 ctx.read_only = xe_vma_read_only(vma);
2517 ctx.devmem_possible = IS_DGFX(vm->xe) &&
2518 IS_ENABLED(CONFIG_DRM_XE_PAGEMAP);
2519
2520 for_each_tile(tile, vm->xe, id)
2521 tile_mask |= 0x1 << id;
2522
2523 xa_init_flags(&op->prefetch_range.range, XA_FLAGS_ALLOC);
2524 op->prefetch_range.ranges_count = 0;
2525
2526 if (prefetch_region == DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC) {
2527 dpagemap = xe_vma_resolve_pagemap(vma,
2528 xe_device_get_root_tile(vm->xe));
2529 } else if (prefetch_region) {
2530 tile = &vm->xe->tiles[region_to_mem_type[prefetch_region] -
2531 XE_PL_VRAM0];
2532 dpagemap = xe_tile_local_pagemap(tile);
2533 }
2534
2535 op->prefetch_range.dpagemap = dpagemap;
2536 alloc_next_range:
2537 svm_range = xe_svm_range_find_or_insert(vm, addr, vma, &ctx);
2538
2539 if (PTR_ERR(svm_range) == -ENOENT) {
2540 u64 ret = xe_svm_find_vma_start(vm, addr, range_end, vma);
2541
2542 addr = ret == ULONG_MAX ? 0 : ret;
2543 if (addr)
2544 goto alloc_next_range;
2545 else
2546 goto print_op_label;
2547 }
2548
2549 if (IS_ERR(svm_range)) {
2550 err = PTR_ERR(svm_range);
2551 goto unwind_prefetch_ops;
2552 }
2553
2554 if (xe_svm_range_validate(vm, svm_range, tile_mask, dpagemap)) {
2555 xe_svm_range_debug(svm_range, "PREFETCH - RANGE IS VALID");
2556 goto check_next_range;
2557 }
2558
2559 err = xa_alloc(&op->prefetch_range.range,
2560 &i, svm_range, xa_limit_32b,
2561 GFP_KERNEL);
2562
2563 if (err)
2564 goto unwind_prefetch_ops;
2565
2566 op->prefetch_range.ranges_count++;
2567 vops->flags |= XE_VMA_OPS_FLAG_HAS_SVM_PREFETCH;
2568 xe_svm_range_debug(svm_range, "PREFETCH - RANGE CREATED");
2569 check_next_range:
2570 if (range_end > xe_svm_range_end(svm_range) &&
2571 xe_svm_range_end(svm_range) < xe_vma_end(vma)) {
2572 addr = xe_svm_range_end(svm_range);
2573 goto alloc_next_range;
2574 }
2575 }
2576 print_op_label:
2577 print_op(vm->xe, __op);
2578 }
2579
2580 return ops;
2581
2582 unwind_prefetch_ops:
2583 xe_svm_prefetch_gpuva_ops_fini(ops);
2584 drm_gpuva_ops_free(&vm->gpuvm, ops);
2585 return ERR_PTR(err);
2586 }
2587
2588 ALLOW_ERROR_INJECTION(vm_bind_ioctl_ops_create, ERRNO);
2589
new_vma(struct xe_vm * vm,struct drm_gpuva_op_map * op,struct xe_vma_mem_attr * attr,unsigned int flags)2590 static struct xe_vma *new_vma(struct xe_vm *vm, struct drm_gpuva_op_map *op,
2591 struct xe_vma_mem_attr *attr, unsigned int flags)
2592 {
2593 struct xe_bo *bo = op->gem.obj ? gem_to_xe_bo(op->gem.obj) : NULL;
2594 struct xe_validation_ctx ctx;
2595 struct drm_exec exec;
2596 struct xe_vma *vma;
2597 int err = 0;
2598
2599 lockdep_assert_held_write(&vm->lock);
2600
2601 if (bo) {
2602 err = 0;
2603 xe_validation_guard(&ctx, &vm->xe->val, &exec,
2604 (struct xe_val_flags) {.interruptible = true}, err) {
2605 if (!bo->vm) {
2606 err = drm_exec_lock_obj(&exec, xe_vm_obj(vm));
2607 drm_exec_retry_on_contention(&exec);
2608 }
2609 if (!err) {
2610 err = drm_exec_lock_obj(&exec, &bo->ttm.base);
2611 drm_exec_retry_on_contention(&exec);
2612 }
2613 if (err)
2614 return ERR_PTR(err);
2615
2616 vma = xe_vma_create(vm, bo, op->gem.offset,
2617 op->va.addr, op->va.addr +
2618 op->va.range - 1, attr, flags);
2619 if (IS_ERR(vma))
2620 return vma;
2621
2622 if (!bo->vm) {
2623 err = add_preempt_fences(vm, bo);
2624 if (err) {
2625 prep_vma_destroy(vm, vma, false);
2626 xe_vma_destroy(vma, NULL);
2627 }
2628 }
2629 }
2630 if (err)
2631 return ERR_PTR(err);
2632 } else {
2633 vma = xe_vma_create(vm, NULL, op->gem.offset,
2634 op->va.addr, op->va.addr +
2635 op->va.range - 1, attr, flags);
2636 if (IS_ERR(vma))
2637 return vma;
2638
2639 if (xe_vma_is_userptr(vma)) {
2640 err = xe_vma_userptr_pin_pages(to_userptr_vma(vma));
2641 /*
2642 * -EBUSY has dedicated meaning that a user fence
2643 * attached to the VMA is busy, in practice
2644 * xe_vma_userptr_pin_pages can only fail with -EBUSY if
2645 * we are low on memory so convert this to -ENOMEM.
2646 */
2647 if (err == -EBUSY)
2648 err = -ENOMEM;
2649 }
2650 }
2651 if (err) {
2652 prep_vma_destroy(vm, vma, false);
2653 xe_vma_destroy_unlocked(vma);
2654 vma = ERR_PTR(err);
2655 }
2656
2657 return vma;
2658 }
2659
xe_vma_max_pte_size(struct xe_vma * vma)2660 static u64 xe_vma_max_pte_size(struct xe_vma *vma)
2661 {
2662 if (vma->gpuva.flags & XE_VMA_PTE_1G)
2663 return SZ_1G;
2664 else if (vma->gpuva.flags & (XE_VMA_PTE_2M | XE_VMA_PTE_COMPACT))
2665 return SZ_2M;
2666 else if (vma->gpuva.flags & XE_VMA_PTE_64K)
2667 return SZ_64K;
2668 else if (vma->gpuva.flags & XE_VMA_PTE_4K)
2669 return SZ_4K;
2670
2671 return SZ_1G; /* Uninitialized, used max size */
2672 }
2673
xe_vma_set_pte_size(struct xe_vma * vma,u64 size)2674 static void xe_vma_set_pte_size(struct xe_vma *vma, u64 size)
2675 {
2676 switch (size) {
2677 case SZ_1G:
2678 vma->gpuva.flags |= XE_VMA_PTE_1G;
2679 break;
2680 case SZ_2M:
2681 vma->gpuva.flags |= XE_VMA_PTE_2M;
2682 break;
2683 case SZ_64K:
2684 vma->gpuva.flags |= XE_VMA_PTE_64K;
2685 break;
2686 case SZ_4K:
2687 vma->gpuva.flags |= XE_VMA_PTE_4K;
2688 break;
2689 }
2690 }
2691
xe_vma_op_commit(struct xe_vm * vm,struct xe_vma_op * op)2692 static int xe_vma_op_commit(struct xe_vm *vm, struct xe_vma_op *op)
2693 {
2694 int err = 0;
2695
2696 lockdep_assert_held_write(&vm->lock);
2697
2698 switch (op->base.op) {
2699 case DRM_GPUVA_OP_MAP:
2700 err |= xe_vm_insert_vma(vm, op->map.vma);
2701 if (!err)
2702 op->flags |= XE_VMA_OP_COMMITTED;
2703 break;
2704 case DRM_GPUVA_OP_REMAP:
2705 {
2706 u8 tile_present =
2707 gpuva_to_vma(op->base.remap.unmap->va)->tile_present;
2708
2709 prep_vma_destroy(vm, gpuva_to_vma(op->base.remap.unmap->va),
2710 true);
2711 op->flags |= XE_VMA_OP_COMMITTED;
2712
2713 if (op->remap.prev) {
2714 err |= xe_vm_insert_vma(vm, op->remap.prev);
2715 if (!err)
2716 op->flags |= XE_VMA_OP_PREV_COMMITTED;
2717 if (!err && op->remap.skip_prev) {
2718 op->remap.prev->tile_present =
2719 tile_present;
2720 }
2721 }
2722 if (op->remap.next) {
2723 err |= xe_vm_insert_vma(vm, op->remap.next);
2724 if (!err)
2725 op->flags |= XE_VMA_OP_NEXT_COMMITTED;
2726 if (!err && op->remap.skip_next) {
2727 op->remap.next->tile_present =
2728 tile_present;
2729 }
2730 }
2731
2732 /*
2733 * Adjust for partial unbind after removing VMA from VM. In case
2734 * of unwind we might need to undo this later.
2735 */
2736 if (!err) {
2737 op->base.remap.unmap->va->va.addr = op->remap.start;
2738 op->base.remap.unmap->va->va.range = op->remap.range;
2739 }
2740 break;
2741 }
2742 case DRM_GPUVA_OP_UNMAP:
2743 prep_vma_destroy(vm, gpuva_to_vma(op->base.unmap.va), true);
2744 op->flags |= XE_VMA_OP_COMMITTED;
2745 break;
2746 case DRM_GPUVA_OP_PREFETCH:
2747 op->flags |= XE_VMA_OP_COMMITTED;
2748 break;
2749 default:
2750 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n");
2751 }
2752
2753 return err;
2754 }
2755
2756 /**
2757 * xe_vma_has_default_mem_attrs - Check if a VMA has default memory attributes
2758 * @vma: Pointer to the xe_vma structure to check
2759 *
2760 * This function determines whether the given VMA (Virtual Memory Area)
2761 * has its memory attributes set to their default values. Specifically,
2762 * it checks the following conditions:
2763 *
2764 * - `atomic_access` is `DRM_XE_VMA_ATOMIC_UNDEFINED`
2765 * - `pat_index` is equal to `default_pat_index`
2766 * - `preferred_loc.devmem_fd` is `DRM_XE_PREFERRED_LOC_DEFAULT_DEVICE`
2767 * - `preferred_loc.migration_policy` is `DRM_XE_MIGRATE_ALL_PAGES`
2768 *
2769 * Return: true if all attributes are at their default values, false otherwise.
2770 */
xe_vma_has_default_mem_attrs(struct xe_vma * vma)2771 bool xe_vma_has_default_mem_attrs(struct xe_vma *vma)
2772 {
2773 return (vma->attr.atomic_access == DRM_XE_ATOMIC_UNDEFINED &&
2774 vma->attr.pat_index == vma->attr.default_pat_index &&
2775 vma->attr.preferred_loc.devmem_fd == DRM_XE_PREFERRED_LOC_DEFAULT_DEVICE &&
2776 vma->attr.preferred_loc.migration_policy == DRM_XE_MIGRATE_ALL_PAGES);
2777 }
2778
vm_bind_ioctl_ops_parse(struct xe_vm * vm,struct drm_gpuva_ops * ops,struct xe_vma_ops * vops)2779 static int vm_bind_ioctl_ops_parse(struct xe_vm *vm, struct drm_gpuva_ops *ops,
2780 struct xe_vma_ops *vops)
2781 {
2782 struct xe_device *xe = vm->xe;
2783 struct drm_gpuva_op *__op;
2784 struct xe_tile *tile;
2785 u8 id, tile_mask = 0;
2786 int err = 0;
2787
2788 lockdep_assert_held_write(&vm->lock);
2789
2790 for_each_tile(tile, vm->xe, id)
2791 tile_mask |= 0x1 << id;
2792
2793 drm_gpuva_for_each_op(__op, ops) {
2794 struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
2795 struct xe_vma *vma;
2796 unsigned int flags = 0;
2797
2798 INIT_LIST_HEAD(&op->link);
2799 list_add_tail(&op->link, &vops->list);
2800 op->tile_mask = tile_mask;
2801
2802 switch (op->base.op) {
2803 case DRM_GPUVA_OP_MAP:
2804 {
2805 struct xe_vma_mem_attr default_attr = {
2806 .preferred_loc = {
2807 .devmem_fd = DRM_XE_PREFERRED_LOC_DEFAULT_DEVICE,
2808 .migration_policy = DRM_XE_MIGRATE_ALL_PAGES,
2809 },
2810 .atomic_access = DRM_XE_ATOMIC_UNDEFINED,
2811 .default_pat_index = op->map.pat_index,
2812 .pat_index = op->map.pat_index,
2813 .purgeable_state = XE_MADV_PURGEABLE_WILLNEED,
2814 };
2815
2816 flags |= op->map.vma_flags & XE_VMA_CREATE_MASK;
2817
2818 vma = new_vma(vm, &op->base.map, &default_attr,
2819 flags);
2820 if (IS_ERR(vma))
2821 return PTR_ERR(vma);
2822
2823 op->map.vma = vma;
2824 if (((op->map.immediate || !xe_vm_in_fault_mode(vm)) &&
2825 !(op->map.vma_flags & XE_VMA_SYSTEM_ALLOCATOR)) ||
2826 op->map.invalidate_on_bind)
2827 xe_vma_ops_incr_pt_update_ops(vops,
2828 op->tile_mask, 1);
2829 break;
2830 }
2831 case DRM_GPUVA_OP_REMAP:
2832 {
2833 struct xe_vma *old =
2834 gpuva_to_vma(op->base.remap.unmap->va);
2835 bool skip = xe_vma_is_cpu_addr_mirror(old);
2836 u64 start = xe_vma_start(old), end = xe_vma_end(old);
2837 int num_remap_ops = 0;
2838
2839 if (op->base.remap.prev)
2840 start = op->base.remap.prev->va.addr +
2841 op->base.remap.prev->va.range;
2842 if (op->base.remap.next)
2843 end = op->base.remap.next->va.addr;
2844
2845 if (xe_vma_is_cpu_addr_mirror(old) &&
2846 xe_svm_has_mapping(vm, start, end)) {
2847 if (vops->flags & XE_VMA_OPS_FLAG_MADVISE)
2848 xe_svm_unmap_address_range(vm, start, end);
2849 else
2850 return -EBUSY;
2851 }
2852
2853 op->remap.start = xe_vma_start(old);
2854 op->remap.range = xe_vma_size(old);
2855 op->remap.old_start = op->remap.start;
2856 op->remap.old_range = op->remap.range;
2857
2858 flags |= op->base.remap.unmap->va->flags & XE_VMA_CREATE_MASK;
2859 if (op->base.remap.prev) {
2860 vma = new_vma(vm, op->base.remap.prev,
2861 &old->attr, flags);
2862 if (IS_ERR(vma))
2863 return PTR_ERR(vma);
2864
2865 op->remap.prev = vma;
2866
2867 /*
2868 * Userptr creates a new SG mapping so
2869 * we must also rebind.
2870 */
2871 op->remap.skip_prev = skip ||
2872 (!xe_vma_is_userptr(old) &&
2873 IS_ALIGNED(xe_vma_end(vma),
2874 xe_vma_max_pte_size(old)));
2875 if (op->remap.skip_prev) {
2876 xe_vma_set_pte_size(vma, xe_vma_max_pte_size(old));
2877 op->remap.range -=
2878 xe_vma_end(vma) -
2879 xe_vma_start(old);
2880 op->remap.start = xe_vma_end(vma);
2881 vm_dbg(&xe->drm, "REMAP:SKIP_PREV: addr=0x%016llx, range=0x%016llx",
2882 (ULL)op->remap.start,
2883 (ULL)op->remap.range);
2884 } else {
2885 num_remap_ops++;
2886 }
2887 }
2888
2889 if (op->base.remap.next) {
2890 vma = new_vma(vm, op->base.remap.next,
2891 &old->attr, flags);
2892 if (IS_ERR(vma))
2893 return PTR_ERR(vma);
2894
2895 op->remap.next = vma;
2896
2897 /*
2898 * Userptr creates a new SG mapping so
2899 * we must also rebind.
2900 */
2901 op->remap.skip_next = skip ||
2902 (!xe_vma_is_userptr(old) &&
2903 IS_ALIGNED(xe_vma_start(vma),
2904 xe_vma_max_pte_size(old)));
2905 if (op->remap.skip_next) {
2906 xe_vma_set_pte_size(vma, xe_vma_max_pte_size(old));
2907 op->remap.range -=
2908 xe_vma_end(old) -
2909 xe_vma_start(vma);
2910 vm_dbg(&xe->drm, "REMAP:SKIP_NEXT: addr=0x%016llx, range=0x%016llx",
2911 (ULL)op->remap.start,
2912 (ULL)op->remap.range);
2913 } else {
2914 num_remap_ops++;
2915 }
2916 }
2917 if (!skip)
2918 num_remap_ops++;
2919
2920 xe_vma_ops_incr_pt_update_ops(vops, op->tile_mask, num_remap_ops);
2921 break;
2922 }
2923 case DRM_GPUVA_OP_UNMAP:
2924 vma = gpuva_to_vma(op->base.unmap.va);
2925
2926 if (xe_vma_is_cpu_addr_mirror(vma) &&
2927 xe_svm_has_mapping(vm, xe_vma_start(vma),
2928 xe_vma_end(vma)) &&
2929 !(vops->flags & XE_VMA_OPS_FLAG_ALLOW_SVM_UNMAP))
2930 return -EBUSY;
2931
2932 if (!xe_vma_is_cpu_addr_mirror(vma))
2933 xe_vma_ops_incr_pt_update_ops(vops, op->tile_mask, 1);
2934 break;
2935 case DRM_GPUVA_OP_PREFETCH:
2936 vma = gpuva_to_vma(op->base.prefetch.va);
2937
2938 if (xe_vma_is_userptr(vma)) {
2939 err = xe_vma_userptr_pin_pages(to_userptr_vma(vma));
2940 if (err)
2941 return err;
2942 }
2943
2944 if (xe_vma_is_cpu_addr_mirror(vma))
2945 xe_vma_ops_incr_pt_update_ops(vops, op->tile_mask,
2946 op->prefetch_range.ranges_count);
2947 else
2948 xe_vma_ops_incr_pt_update_ops(vops, op->tile_mask, 1);
2949
2950 break;
2951 default:
2952 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n");
2953 }
2954
2955 err = xe_vma_op_commit(vm, op);
2956 if (err)
2957 return err;
2958 }
2959
2960 return 0;
2961 }
2962
xe_vma_op_unwind(struct xe_vm * vm,struct xe_vma_op * op,bool post_commit,bool prev_post_commit,bool next_post_commit)2963 static void xe_vma_op_unwind(struct xe_vm *vm, struct xe_vma_op *op,
2964 bool post_commit, bool prev_post_commit,
2965 bool next_post_commit)
2966 {
2967 lockdep_assert_held_write(&vm->lock);
2968
2969 switch (op->base.op) {
2970 case DRM_GPUVA_OP_MAP:
2971 if (op->map.vma) {
2972 prep_vma_destroy(vm, op->map.vma, post_commit);
2973 xe_vma_destroy_unlocked(op->map.vma);
2974 }
2975 break;
2976 case DRM_GPUVA_OP_UNMAP:
2977 {
2978 struct xe_vma *vma = gpuva_to_vma(op->base.unmap.va);
2979
2980 if (vma) {
2981 xe_svm_notifier_lock(vm);
2982 vma->gpuva.flags &= ~XE_VMA_DESTROYED;
2983 xe_svm_notifier_unlock(vm);
2984 if (post_commit)
2985 xe_vm_insert_vma(vm, vma);
2986 }
2987 break;
2988 }
2989 case DRM_GPUVA_OP_REMAP:
2990 {
2991 struct xe_vma *vma = gpuva_to_vma(op->base.remap.unmap->va);
2992
2993 if (op->remap.prev) {
2994 prep_vma_destroy(vm, op->remap.prev, prev_post_commit);
2995 xe_vma_destroy_unlocked(op->remap.prev);
2996 }
2997 if (op->remap.next) {
2998 prep_vma_destroy(vm, op->remap.next, next_post_commit);
2999 xe_vma_destroy_unlocked(op->remap.next);
3000 }
3001 if (vma) {
3002 xe_svm_notifier_lock(vm);
3003 vma->gpuva.flags &= ~XE_VMA_DESTROYED;
3004 xe_svm_notifier_unlock(vm);
3005 if (post_commit) {
3006 /*
3007 * Restore the old va range, in case of the
3008 * prev/next skip optimisation. Otherwise what
3009 * we re-insert here could be smaller than the
3010 * original range.
3011 */
3012 op->base.remap.unmap->va->va.addr =
3013 op->remap.old_start;
3014 op->base.remap.unmap->va->va.range =
3015 op->remap.old_range;
3016 xe_vm_insert_vma(vm, vma);
3017 }
3018 }
3019 break;
3020 }
3021 case DRM_GPUVA_OP_PREFETCH:
3022 /* Nothing to do */
3023 break;
3024 default:
3025 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n");
3026 }
3027 }
3028
vm_bind_ioctl_ops_unwind(struct xe_vm * vm,struct drm_gpuva_ops ** ops,int num_ops_list)3029 static void vm_bind_ioctl_ops_unwind(struct xe_vm *vm,
3030 struct drm_gpuva_ops **ops,
3031 int num_ops_list)
3032 {
3033 int i;
3034
3035 for (i = num_ops_list - 1; i >= 0; --i) {
3036 struct drm_gpuva_ops *__ops = ops[i];
3037 struct drm_gpuva_op *__op;
3038
3039 if (!__ops)
3040 continue;
3041
3042 drm_gpuva_for_each_op_reverse(__op, __ops) {
3043 struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
3044
3045 xe_vma_op_unwind(vm, op,
3046 op->flags & XE_VMA_OP_COMMITTED,
3047 op->flags & XE_VMA_OP_PREV_COMMITTED,
3048 op->flags & XE_VMA_OP_NEXT_COMMITTED);
3049 }
3050 }
3051 }
3052
3053 /**
3054 * struct xe_vma_lock_and_validate_flags - Flags for vma_lock_and_validate()
3055 * @res_evict: Allow evicting resources during validation
3056 * @validate: Perform BO validation
3057 * @request_decompress: Request BO decompression
3058 * @check_purged: Reject operation if BO is DONTNEED or PURGED
3059 */
3060 struct xe_vma_lock_and_validate_flags {
3061 u32 res_evict : 1;
3062 u32 validate : 1;
3063 u32 request_decompress : 1;
3064 u32 check_purged : 1;
3065 };
3066
vma_lock_and_validate(struct drm_exec * exec,struct xe_vma * vma,struct xe_vma_lock_and_validate_flags flags)3067 static int vma_lock_and_validate(struct drm_exec *exec, struct xe_vma *vma,
3068 struct xe_vma_lock_and_validate_flags flags)
3069 {
3070 struct xe_bo *bo = xe_vma_bo(vma);
3071 struct xe_vm *vm = xe_vma_vm(vma);
3072 bool validate_bo = flags.validate;
3073 int err = 0;
3074
3075 if (bo) {
3076 if (!bo->vm)
3077 err = drm_exec_lock_obj(exec, &bo->ttm.base);
3078
3079 /* Reject new mappings to DONTNEED/purged BOs; allow cleanup operations */
3080 if (!err && flags.check_purged) {
3081 if (xe_bo_madv_is_dontneed(bo))
3082 err = -EBUSY; /* BO marked purgeable */
3083 else if (xe_bo_is_purged(bo))
3084 err = -EINVAL; /* BO already purged */
3085 }
3086
3087 /* Don't validate the BO for DONTNEED/PURGED remap remnants. */
3088 if (vma->attr.purgeable_state != XE_MADV_PURGEABLE_WILLNEED)
3089 validate_bo = false;
3090
3091 if (!err && validate_bo)
3092 err = xe_bo_validate(bo, vm,
3093 xe_vm_allow_vm_eviction(vm) &&
3094 flags.res_evict, exec);
3095
3096 if (err)
3097 return err;
3098
3099 if (flags.request_decompress)
3100 err = xe_bo_decompress(bo);
3101 }
3102
3103 return err;
3104 }
3105
check_ufence(struct xe_vma * vma)3106 static int check_ufence(struct xe_vma *vma)
3107 {
3108 if (vma->ufence) {
3109 struct xe_user_fence * const f = vma->ufence;
3110
3111 if (!xe_sync_ufence_get_status(f))
3112 return -EBUSY;
3113
3114 vma->ufence = NULL;
3115 xe_sync_ufence_put(f);
3116 }
3117
3118 return 0;
3119 }
3120
prefetch_ranges(struct xe_vm * vm,struct xe_vma_op * op)3121 static int prefetch_ranges(struct xe_vm *vm, struct xe_vma_op *op)
3122 {
3123 bool devmem_possible = IS_DGFX(vm->xe) && IS_ENABLED(CONFIG_DRM_XE_PAGEMAP);
3124 struct xe_vma *vma = gpuva_to_vma(op->base.prefetch.va);
3125 struct drm_pagemap *dpagemap = op->prefetch_range.dpagemap;
3126 int err = 0;
3127
3128 struct xe_svm_range *svm_range;
3129 struct drm_gpusvm_ctx ctx = {};
3130 unsigned long i;
3131
3132 if (!xe_vma_is_cpu_addr_mirror(vma))
3133 return 0;
3134
3135 ctx.read_only = xe_vma_read_only(vma);
3136 ctx.devmem_possible = devmem_possible;
3137 ctx.check_pages_threshold = devmem_possible ? SZ_64K : 0;
3138 ctx.device_private_page_owner = xe_svm_private_page_owner(vm, !dpagemap);
3139
3140 /* TODO: Threading the migration */
3141 xa_for_each(&op->prefetch_range.range, i, svm_range) {
3142 if (!dpagemap)
3143 xe_svm_range_migrate_to_smem(vm, svm_range);
3144
3145 if (IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM)) {
3146 drm_dbg(&vm->xe->drm,
3147 "Prefetch pagemap is %s start 0x%016lx end 0x%016lx\n",
3148 dpagemap ? dpagemap->drm->unique : "system",
3149 xe_svm_range_start(svm_range), xe_svm_range_end(svm_range));
3150 }
3151
3152 if (xe_svm_range_needs_migrate_to_vram(svm_range, vma, dpagemap)) {
3153 err = xe_svm_alloc_vram(svm_range, &ctx, dpagemap);
3154 if (err) {
3155 drm_dbg(&vm->xe->drm, "VRAM allocation failed, retry from userspace, asid=%u, gpusvm=%p, errno=%pe\n",
3156 vm->usm.asid, &vm->svm.gpusvm, ERR_PTR(err));
3157 return -ENODATA;
3158 }
3159 xe_svm_range_debug(svm_range, "PREFETCH - RANGE MIGRATED TO VRAM");
3160 }
3161
3162 err = xe_svm_range_get_pages(vm, svm_range, &ctx);
3163 if (err) {
3164 drm_dbg(&vm->xe->drm, "Get pages failed, asid=%u, gpusvm=%p, errno=%pe\n",
3165 vm->usm.asid, &vm->svm.gpusvm, ERR_PTR(err));
3166 if (err == -EOPNOTSUPP || err == -EFAULT || err == -EPERM)
3167 err = -ENODATA;
3168 return err;
3169 }
3170 xe_svm_range_debug(svm_range, "PREFETCH - RANGE GET PAGES DONE");
3171 }
3172
3173 return err;
3174 }
3175
op_lock_and_prep(struct drm_exec * exec,struct xe_vm * vm,struct xe_vma_ops * vops,struct xe_vma_op * op)3176 static int op_lock_and_prep(struct drm_exec *exec, struct xe_vm *vm,
3177 struct xe_vma_ops *vops, struct xe_vma_op *op)
3178 {
3179 int err = 0;
3180 bool res_evict;
3181
3182 /*
3183 * We only allow evicting a BO within the VM if it is not part of an
3184 * array of binds, as an array of binds can evict another BO within the
3185 * bind.
3186 */
3187 res_evict = !(vops->flags & XE_VMA_OPS_ARRAY_OF_BINDS);
3188
3189 switch (op->base.op) {
3190 case DRM_GPUVA_OP_MAP:
3191 if (!op->map.invalidate_on_bind)
3192 err = vma_lock_and_validate(exec, op->map.vma,
3193 (struct xe_vma_lock_and_validate_flags) {
3194 .res_evict = res_evict,
3195 .validate = !xe_vm_in_fault_mode(vm) ||
3196 op->map.immediate,
3197 .request_decompress =
3198 op->map.request_decompress,
3199 .check_purged = false,
3200 });
3201 break;
3202 case DRM_GPUVA_OP_REMAP:
3203 err = check_ufence(gpuva_to_vma(op->base.remap.unmap->va));
3204 if (err)
3205 break;
3206
3207 err = vma_lock_and_validate(exec,
3208 gpuva_to_vma(op->base.remap.unmap->va),
3209 (struct xe_vma_lock_and_validate_flags) {
3210 .res_evict = res_evict,
3211 .validate = false,
3212 .request_decompress = false,
3213 .check_purged = false,
3214 });
3215 if (!err && op->remap.prev)
3216 err = vma_lock_and_validate(exec, op->remap.prev,
3217 (struct xe_vma_lock_and_validate_flags) {
3218 .res_evict = res_evict,
3219 .validate = true,
3220 .request_decompress = false,
3221 .check_purged = false,
3222 });
3223 if (!err && op->remap.next)
3224 err = vma_lock_and_validate(exec, op->remap.next,
3225 (struct xe_vma_lock_and_validate_flags) {
3226 .res_evict = res_evict,
3227 .validate = true,
3228 .request_decompress = false,
3229 .check_purged = false,
3230 });
3231 break;
3232 case DRM_GPUVA_OP_UNMAP:
3233 err = check_ufence(gpuva_to_vma(op->base.unmap.va));
3234 if (err)
3235 break;
3236
3237 err = vma_lock_and_validate(exec,
3238 gpuva_to_vma(op->base.unmap.va),
3239 (struct xe_vma_lock_and_validate_flags) {
3240 .res_evict = res_evict,
3241 .validate = false,
3242 .request_decompress = false,
3243 .check_purged = false,
3244 });
3245 break;
3246 case DRM_GPUVA_OP_PREFETCH:
3247 {
3248 struct xe_vma *vma = gpuva_to_vma(op->base.prefetch.va);
3249 u32 region;
3250
3251 if (!xe_vma_is_cpu_addr_mirror(vma)) {
3252 region = op->prefetch.region;
3253 xe_assert(vm->xe, region == DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC ||
3254 region <= ARRAY_SIZE(region_to_mem_type));
3255 }
3256
3257 /*
3258 * PREFETCH is the only op that still gates on BO purge state.
3259 * MAP/REMAP handle this inside xe_vma_create() so partial
3260 * unbind on a DONTNEED BO still works. PREFETCH skips
3261 * xe_vma_create() and would migrate a BO with no backing
3262 * store, so reject DONTNEED/PURGED here.
3263 */
3264 err = vma_lock_and_validate(exec,
3265 gpuva_to_vma(op->base.prefetch.va),
3266 (struct xe_vma_lock_and_validate_flags) {
3267 .res_evict = res_evict,
3268 .validate = false,
3269 .request_decompress = false,
3270 .check_purged = true,
3271 });
3272 if (!err && !xe_vma_has_no_bo(vma)) {
3273 struct xe_bo *bo = xe_vma_bo(vma);
3274 u32 mem_type;
3275
3276 if (region == DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC) {
3277 unsigned int i;
3278
3279 mem_type = XE_PL_TT;
3280 for (i = 0; i < bo->placement.num_placement; i++) {
3281 if (mem_type_is_vram(bo->placements[i].mem_type)) {
3282 mem_type = bo->placements[i].mem_type;
3283 break;
3284 }
3285 }
3286 } else {
3287 mem_type = region_to_mem_type[region];
3288 }
3289
3290 err = xe_bo_migrate(bo, mem_type, NULL, exec);
3291 }
3292 break;
3293 }
3294 default:
3295 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n");
3296 }
3297
3298 return err;
3299 }
3300
vm_bind_ioctl_ops_prefetch_ranges(struct xe_vm * vm,struct xe_vma_ops * vops)3301 static int vm_bind_ioctl_ops_prefetch_ranges(struct xe_vm *vm, struct xe_vma_ops *vops)
3302 {
3303 struct xe_vma_op *op;
3304 int err;
3305
3306 if (!(vops->flags & XE_VMA_OPS_FLAG_HAS_SVM_PREFETCH))
3307 return 0;
3308
3309 list_for_each_entry(op, &vops->list, link) {
3310 if (op->base.op == DRM_GPUVA_OP_PREFETCH) {
3311 err = prefetch_ranges(vm, op);
3312 if (err)
3313 return err;
3314 }
3315 }
3316
3317 return 0;
3318 }
3319
vm_bind_ioctl_ops_lock_and_prep(struct drm_exec * exec,struct xe_vm * vm,struct xe_vma_ops * vops)3320 static int vm_bind_ioctl_ops_lock_and_prep(struct drm_exec *exec,
3321 struct xe_vm *vm,
3322 struct xe_vma_ops *vops)
3323 {
3324 struct xe_vma_op *op;
3325 int err;
3326
3327 err = drm_exec_lock_obj(exec, xe_vm_obj(vm));
3328 if (err)
3329 return err;
3330
3331 list_for_each_entry(op, &vops->list, link) {
3332 err = op_lock_and_prep(exec, vm, vops, op);
3333 if (err)
3334 return err;
3335 }
3336
3337 #ifdef TEST_VM_OPS_ERROR
3338 if (vops->inject_error &&
3339 vm->xe->vm_inject_error_position == FORCE_OP_ERROR_LOCK)
3340 return -ENOSPC;
3341 #endif
3342
3343 return 0;
3344 }
3345
op_trace(struct xe_vma_op * op)3346 static void op_trace(struct xe_vma_op *op)
3347 {
3348 switch (op->base.op) {
3349 case DRM_GPUVA_OP_MAP:
3350 trace_xe_vma_bind(op->map.vma);
3351 break;
3352 case DRM_GPUVA_OP_REMAP:
3353 trace_xe_vma_unbind(gpuva_to_vma(op->base.remap.unmap->va));
3354 if (op->remap.prev)
3355 trace_xe_vma_bind(op->remap.prev);
3356 if (op->remap.next)
3357 trace_xe_vma_bind(op->remap.next);
3358 break;
3359 case DRM_GPUVA_OP_UNMAP:
3360 trace_xe_vma_unbind(gpuva_to_vma(op->base.unmap.va));
3361 break;
3362 case DRM_GPUVA_OP_PREFETCH:
3363 trace_xe_vma_bind(gpuva_to_vma(op->base.prefetch.va));
3364 break;
3365 case DRM_GPUVA_OP_DRIVER:
3366 break;
3367 default:
3368 XE_WARN_ON("NOT POSSIBLE");
3369 }
3370 }
3371
trace_xe_vm_ops_execute(struct xe_vma_ops * vops)3372 static void trace_xe_vm_ops_execute(struct xe_vma_ops *vops)
3373 {
3374 struct xe_vma_op *op;
3375
3376 list_for_each_entry(op, &vops->list, link)
3377 op_trace(op);
3378 }
3379
vm_ops_setup_tile_args(struct xe_vm * vm,struct xe_vma_ops * vops)3380 static int vm_ops_setup_tile_args(struct xe_vm *vm, struct xe_vma_ops *vops)
3381 {
3382 struct xe_exec_queue *q = vops->q;
3383 struct xe_tile *tile;
3384 int number_tiles = 0;
3385 u8 id;
3386
3387 for_each_tile(tile, vm->xe, id) {
3388 if (vops->pt_update_ops[id].num_ops)
3389 ++number_tiles;
3390
3391 if (vops->pt_update_ops[id].q)
3392 continue;
3393
3394 if (q) {
3395 vops->pt_update_ops[id].q = q;
3396 if (vm->pt_root[id] && !list_empty(&q->multi_gt_list))
3397 q = list_next_entry(q, multi_gt_list);
3398 } else {
3399 vops->pt_update_ops[id].q = vm->q[id];
3400 }
3401 }
3402
3403 return number_tiles;
3404 }
3405
ops_execute(struct xe_vm * vm,struct xe_vma_ops * vops)3406 static struct dma_fence *ops_execute(struct xe_vm *vm,
3407 struct xe_vma_ops *vops)
3408 {
3409 struct xe_tile *tile;
3410 struct dma_fence *fence = NULL;
3411 struct dma_fence **fences = NULL;
3412 struct dma_fence_array *cf = NULL;
3413 int number_tiles = 0, current_fence = 0, n_fence = 0, err, i;
3414 u8 id;
3415
3416 number_tiles = vm_ops_setup_tile_args(vm, vops);
3417 if (number_tiles == 0)
3418 return ERR_PTR(-ENODATA);
3419
3420 for_each_tile(tile, vm->xe, id) {
3421 ++n_fence;
3422
3423 if (!(vops->flags & XE_VMA_OPS_FLAG_SKIP_TLB_WAIT))
3424 for_each_tlb_inval(i)
3425 ++n_fence;
3426 }
3427
3428 fences = kmalloc_objs(*fences, n_fence);
3429 if (!fences) {
3430 fence = ERR_PTR(-ENOMEM);
3431 goto err_trace;
3432 }
3433
3434 cf = dma_fence_array_alloc(n_fence);
3435 if (!cf) {
3436 fence = ERR_PTR(-ENOMEM);
3437 goto err_out;
3438 }
3439
3440 for_each_tile(tile, vm->xe, id) {
3441 if (!vops->pt_update_ops[id].num_ops)
3442 continue;
3443
3444 err = xe_pt_update_ops_prepare(tile, vops);
3445 if (err) {
3446 fence = ERR_PTR(err);
3447 goto err_out;
3448 }
3449 }
3450
3451 trace_xe_vm_ops_execute(vops);
3452
3453 for_each_tile(tile, vm->xe, id) {
3454 struct xe_exec_queue *q = vops->pt_update_ops[tile->id].q;
3455
3456 fence = NULL;
3457 if (!vops->pt_update_ops[id].num_ops)
3458 goto collect_fences;
3459
3460 fence = xe_pt_update_ops_run(tile, vops);
3461 if (IS_ERR(fence))
3462 goto err_out;
3463
3464 collect_fences:
3465 fences[current_fence++] = fence ?: dma_fence_get_stub();
3466 if (vops->flags & XE_VMA_OPS_FLAG_SKIP_TLB_WAIT)
3467 continue;
3468
3469 xe_migrate_job_lock(tile->migrate, q);
3470 for_each_tlb_inval(i)
3471 fences[current_fence++] =
3472 xe_exec_queue_tlb_inval_last_fence_get(q, vm, i);
3473 xe_migrate_job_unlock(tile->migrate, q);
3474 }
3475
3476 xe_assert(vm->xe, current_fence == n_fence);
3477 dma_fence_array_init(cf, n_fence, fences, dma_fence_context_alloc(1),
3478 1);
3479 fence = &cf->base;
3480
3481 for_each_tile(tile, vm->xe, id) {
3482 if (!vops->pt_update_ops[id].num_ops)
3483 continue;
3484
3485 xe_pt_update_ops_fini(tile, vops);
3486 }
3487
3488 return fence;
3489
3490 err_out:
3491 for_each_tile(tile, vm->xe, id) {
3492 if (!vops->pt_update_ops[id].num_ops)
3493 continue;
3494
3495 xe_pt_update_ops_abort(tile, vops);
3496 }
3497 while (current_fence)
3498 dma_fence_put(fences[--current_fence]);
3499 kfree(fences);
3500 kfree(cf);
3501
3502 err_trace:
3503 trace_xe_vm_ops_fail(vm);
3504 return fence;
3505 }
3506
vma_add_ufence(struct xe_vma * vma,struct xe_user_fence * ufence)3507 static void vma_add_ufence(struct xe_vma *vma, struct xe_user_fence *ufence)
3508 {
3509 if (vma->ufence)
3510 xe_sync_ufence_put(vma->ufence);
3511 vma->ufence = __xe_sync_ufence_get(ufence);
3512 }
3513
op_add_ufence(struct xe_vm * vm,struct xe_vma_op * op,struct xe_user_fence * ufence)3514 static void op_add_ufence(struct xe_vm *vm, struct xe_vma_op *op,
3515 struct xe_user_fence *ufence)
3516 {
3517 switch (op->base.op) {
3518 case DRM_GPUVA_OP_MAP:
3519 if (!xe_vma_is_cpu_addr_mirror(op->map.vma))
3520 vma_add_ufence(op->map.vma, ufence);
3521 break;
3522 case DRM_GPUVA_OP_REMAP:
3523 if (op->remap.prev)
3524 vma_add_ufence(op->remap.prev, ufence);
3525 if (op->remap.next)
3526 vma_add_ufence(op->remap.next, ufence);
3527 break;
3528 case DRM_GPUVA_OP_UNMAP:
3529 break;
3530 case DRM_GPUVA_OP_PREFETCH:
3531 vma_add_ufence(gpuva_to_vma(op->base.prefetch.va), ufence);
3532 break;
3533 default:
3534 drm_warn(&vm->xe->drm, "NOT POSSIBLE\n");
3535 }
3536 }
3537
vm_bind_ioctl_ops_fini(struct xe_vm * vm,struct xe_vma_ops * vops,struct dma_fence * fence)3538 static void vm_bind_ioctl_ops_fini(struct xe_vm *vm, struct xe_vma_ops *vops,
3539 struct dma_fence *fence)
3540 {
3541 struct xe_user_fence *ufence;
3542 struct xe_vma_op *op;
3543 int i;
3544
3545 ufence = find_ufence_get(vops->syncs, vops->num_syncs);
3546 list_for_each_entry(op, &vops->list, link) {
3547 if (ufence)
3548 op_add_ufence(vm, op, ufence);
3549
3550 if (op->base.op == DRM_GPUVA_OP_UNMAP)
3551 xe_vma_destroy(gpuva_to_vma(op->base.unmap.va), fence);
3552 else if (op->base.op == DRM_GPUVA_OP_REMAP)
3553 xe_vma_destroy(gpuva_to_vma(op->base.remap.unmap->va),
3554 fence);
3555 }
3556 if (ufence)
3557 xe_sync_ufence_put(ufence);
3558 if (fence) {
3559 for (i = 0; i < vops->num_syncs; i++)
3560 xe_sync_entry_signal(vops->syncs + i, fence);
3561 }
3562 }
3563
vm_bind_ioctl_ops_execute(struct xe_vm * vm,struct xe_vma_ops * vops)3564 static struct dma_fence *vm_bind_ioctl_ops_execute(struct xe_vm *vm,
3565 struct xe_vma_ops *vops)
3566 {
3567 struct xe_validation_ctx ctx;
3568 struct drm_exec exec;
3569 struct dma_fence *fence;
3570 int err = 0;
3571
3572 lockdep_assert_held_write(&vm->lock);
3573
3574 xe_validation_guard(&ctx, &vm->xe->val, &exec,
3575 ((struct xe_val_flags) {
3576 .interruptible = true,
3577 .exec_ignore_duplicates = true,
3578 }), err) {
3579 err = vm_bind_ioctl_ops_lock_and_prep(&exec, vm, vops);
3580 drm_exec_retry_on_contention(&exec);
3581 xe_validation_retry_on_oom(&ctx, &err);
3582 if (err)
3583 return ERR_PTR(err);
3584
3585 xe_vm_set_validation_exec(vm, &exec);
3586 fence = ops_execute(vm, vops);
3587 xe_vm_set_validation_exec(vm, NULL);
3588 if (IS_ERR(fence)) {
3589 if (PTR_ERR(fence) == -ENODATA)
3590 vm_bind_ioctl_ops_fini(vm, vops, NULL);
3591 return fence;
3592 }
3593
3594 vm_bind_ioctl_ops_fini(vm, vops, fence);
3595 }
3596
3597 return err ? ERR_PTR(err) : fence;
3598 }
3599 ALLOW_ERROR_INJECTION(vm_bind_ioctl_ops_execute, ERRNO);
3600
3601 #define SUPPORTED_FLAGS_STUB \
3602 (DRM_XE_VM_BIND_FLAG_READONLY | \
3603 DRM_XE_VM_BIND_FLAG_IMMEDIATE | \
3604 DRM_XE_VM_BIND_FLAG_NULL | \
3605 DRM_XE_VM_BIND_FLAG_DUMPABLE | \
3606 DRM_XE_VM_BIND_FLAG_CHECK_PXP | \
3607 DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR | \
3608 DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET | \
3609 DRM_XE_VM_BIND_FLAG_DECOMPRESS)
3610
3611 #ifdef TEST_VM_OPS_ERROR
3612 #define SUPPORTED_FLAGS (SUPPORTED_FLAGS_STUB | FORCE_OP_ERROR)
3613 #else
3614 #define SUPPORTED_FLAGS SUPPORTED_FLAGS_STUB
3615 #endif
3616
3617 #define XE_64K_PAGE_MASK 0xffffull
3618 #define ALL_DRM_XE_SYNCS_FLAGS (DRM_XE_SYNCS_FLAG_WAIT_FOR_OP)
3619
vm_bind_ioctl_check_args(struct xe_device * xe,struct xe_vm * vm,struct drm_xe_vm_bind * args,struct drm_xe_vm_bind_op ** bind_ops)3620 static int vm_bind_ioctl_check_args(struct xe_device *xe, struct xe_vm *vm,
3621 struct drm_xe_vm_bind *args,
3622 struct drm_xe_vm_bind_op **bind_ops)
3623 {
3624 int err;
3625 int i;
3626
3627 if (XE_IOCTL_DBG(xe, args->pad || args->pad2) ||
3628 XE_IOCTL_DBG(xe, args->reserved[0] || args->reserved[1]))
3629 return -EINVAL;
3630
3631 if (XE_IOCTL_DBG(xe, args->extensions))
3632 return -EINVAL;
3633
3634 if (XE_IOCTL_DBG(xe, args->num_syncs > DRM_XE_MAX_SYNCS))
3635 return -EINVAL;
3636
3637 if (args->num_binds > 1) {
3638 u64 __user *bind_user =
3639 u64_to_user_ptr(args->vector_of_binds);
3640
3641 *bind_ops = kvmalloc_objs(struct drm_xe_vm_bind_op,
3642 args->num_binds,
3643 GFP_KERNEL | __GFP_ACCOUNT | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
3644 if (!*bind_ops)
3645 return args->num_binds > 1 ? -ENOBUFS : -ENOMEM;
3646
3647 err = copy_from_user(*bind_ops, bind_user,
3648 sizeof(struct drm_xe_vm_bind_op) *
3649 args->num_binds);
3650 if (XE_IOCTL_DBG(xe, err)) {
3651 err = -EFAULT;
3652 goto free_bind_ops;
3653 }
3654 } else {
3655 *bind_ops = &args->bind;
3656 }
3657
3658 for (i = 0; i < args->num_binds; ++i) {
3659 u64 range = (*bind_ops)[i].range;
3660 u64 addr = (*bind_ops)[i].addr;
3661 u32 op = (*bind_ops)[i].op;
3662 u32 flags = (*bind_ops)[i].flags;
3663 u32 obj = (*bind_ops)[i].obj;
3664 u64 obj_offset = (*bind_ops)[i].obj_offset;
3665 u32 prefetch_region = (*bind_ops)[i].prefetch_mem_region_instance;
3666 bool is_null = flags & DRM_XE_VM_BIND_FLAG_NULL;
3667 bool is_cpu_addr_mirror = flags &
3668 DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR;
3669 bool is_decompress = flags & DRM_XE_VM_BIND_FLAG_DECOMPRESS;
3670 u16 pat_index = (*bind_ops)[i].pat_index;
3671 u16 coh_mode;
3672 bool comp_en;
3673
3674 if (XE_IOCTL_DBG(xe, is_cpu_addr_mirror &&
3675 (!xe_vm_in_fault_mode(vm) ||
3676 !IS_ENABLED(CONFIG_DRM_XE_GPUSVM)))) {
3677 err = -EINVAL;
3678 goto free_bind_ops;
3679 }
3680
3681 if (XE_IOCTL_DBG(xe, pat_index >= xe->pat.n_entries)) {
3682 err = -EINVAL;
3683 goto free_bind_ops;
3684 }
3685
3686 pat_index = array_index_nospec(pat_index, xe->pat.n_entries);
3687 (*bind_ops)[i].pat_index = pat_index;
3688 coh_mode = xe_pat_index_get_coh_mode(xe, pat_index);
3689 comp_en = xe_pat_index_get_comp_en(xe, pat_index);
3690 if (XE_IOCTL_DBG(xe, !coh_mode)) { /* hw reserved */
3691 err = -EINVAL;
3692 goto free_bind_ops;
3693 }
3694
3695 if (XE_WARN_ON(coh_mode > XE_COH_2WAY)) {
3696 err = -EINVAL;
3697 goto free_bind_ops;
3698 }
3699
3700 if (XE_IOCTL_DBG(xe, op > DRM_XE_VM_BIND_OP_PREFETCH) ||
3701 XE_IOCTL_DBG(xe, flags & ~SUPPORTED_FLAGS) ||
3702 XE_IOCTL_DBG(xe, obj && (is_null || is_cpu_addr_mirror)) ||
3703 XE_IOCTL_DBG(xe, obj_offset && (is_null ||
3704 is_cpu_addr_mirror)) ||
3705 XE_IOCTL_DBG(xe, op != DRM_XE_VM_BIND_OP_MAP &&
3706 (is_decompress || is_null || is_cpu_addr_mirror)) ||
3707 XE_IOCTL_DBG(xe, is_decompress &&
3708 xe_pat_index_get_comp_en(xe, pat_index)) ||
3709 XE_IOCTL_DBG(xe, !obj &&
3710 op == DRM_XE_VM_BIND_OP_MAP &&
3711 !is_null && !is_cpu_addr_mirror) ||
3712 XE_IOCTL_DBG(xe, !obj &&
3713 op == DRM_XE_VM_BIND_OP_UNMAP_ALL) ||
3714 XE_IOCTL_DBG(xe, addr &&
3715 op == DRM_XE_VM_BIND_OP_UNMAP_ALL) ||
3716 XE_IOCTL_DBG(xe, range &&
3717 op == DRM_XE_VM_BIND_OP_UNMAP_ALL) ||
3718 XE_IOCTL_DBG(xe, obj &&
3719 op == DRM_XE_VM_BIND_OP_MAP_USERPTR) ||
3720 XE_IOCTL_DBG(xe, coh_mode == XE_COH_NONE &&
3721 op == DRM_XE_VM_BIND_OP_MAP_USERPTR) ||
3722 XE_IOCTL_DBG(xe, !IS_DGFX(xe) && coh_mode == XE_COH_NONE &&
3723 is_cpu_addr_mirror) ||
3724 XE_IOCTL_DBG(xe, xe_device_is_l2_flush_optimized(xe) &&
3725 (op == DRM_XE_VM_BIND_OP_MAP_USERPTR ||
3726 is_cpu_addr_mirror) &&
3727 (pat_index != 19 && coh_mode != XE_COH_2WAY)) ||
3728 XE_IOCTL_DBG(xe, comp_en &&
3729 op == DRM_XE_VM_BIND_OP_MAP_USERPTR) ||
3730 XE_IOCTL_DBG(xe, op == DRM_XE_VM_BIND_OP_MAP_USERPTR &&
3731 !IS_ENABLED(CONFIG_DRM_GPUSVM)) ||
3732 XE_IOCTL_DBG(xe, obj &&
3733 op == DRM_XE_VM_BIND_OP_PREFETCH) ||
3734 XE_IOCTL_DBG(xe, prefetch_region &&
3735 op != DRM_XE_VM_BIND_OP_PREFETCH) ||
3736 XE_IOCTL_DBG(xe, (prefetch_region != DRM_XE_CONSULT_MEM_ADVISE_PREF_LOC &&
3737 /* Guard against undefined shift in BIT(prefetch_region) */
3738 (prefetch_region >= (sizeof(xe->info.mem_region_mask) * 8) ||
3739 !(BIT(prefetch_region) & xe->info.mem_region_mask)))) ||
3740 XE_IOCTL_DBG(xe, obj &&
3741 op == DRM_XE_VM_BIND_OP_UNMAP) ||
3742 XE_IOCTL_DBG(xe, (flags & DRM_XE_VM_BIND_FLAG_MADVISE_AUTORESET) &&
3743 (!is_cpu_addr_mirror || op != DRM_XE_VM_BIND_OP_MAP))) {
3744 err = -EINVAL;
3745 goto free_bind_ops;
3746 }
3747
3748 if (XE_IOCTL_DBG(xe, obj_offset & ~PAGE_MASK) ||
3749 XE_IOCTL_DBG(xe, addr & ~PAGE_MASK) ||
3750 XE_IOCTL_DBG(xe, range & ~PAGE_MASK) ||
3751 XE_IOCTL_DBG(xe, !range &&
3752 op != DRM_XE_VM_BIND_OP_UNMAP_ALL)) {
3753 err = -EINVAL;
3754 goto free_bind_ops;
3755 }
3756
3757 if (is_decompress && (XE_IOCTL_DBG(xe, !xe_device_has_flat_ccs(xe)) ||
3758 XE_IOCTL_DBG(xe, GRAPHICS_VER(xe) < 20) ||
3759 XE_IOCTL_DBG(xe, !IS_DGFX(xe)))) {
3760 err = -EOPNOTSUPP;
3761 goto free_bind_ops;
3762 }
3763 }
3764
3765 return 0;
3766
3767 free_bind_ops:
3768 if (args->num_binds > 1)
3769 kvfree(*bind_ops);
3770 *bind_ops = NULL;
3771 return err;
3772 }
3773
vm_bind_ioctl_signal_fences(struct xe_vm * vm,struct xe_exec_queue * q,struct xe_sync_entry * syncs,int num_syncs)3774 static int vm_bind_ioctl_signal_fences(struct xe_vm *vm,
3775 struct xe_exec_queue *q,
3776 struct xe_sync_entry *syncs,
3777 int num_syncs)
3778 {
3779 struct dma_fence *fence = NULL;
3780 int i, err = 0;
3781
3782 if (num_syncs) {
3783 fence = xe_sync_in_fence_get(syncs, num_syncs,
3784 to_wait_exec_queue(vm, q), vm);
3785 if (IS_ERR(fence))
3786 return PTR_ERR(fence);
3787
3788 for (i = 0; i < num_syncs; i++)
3789 xe_sync_entry_signal(&syncs[i], fence);
3790 }
3791
3792 dma_fence_put(fence);
3793
3794 return err;
3795 }
3796
xe_vma_ops_init(struct xe_vma_ops * vops,struct xe_vm * vm,struct xe_exec_queue * q,struct xe_sync_entry * syncs,u32 num_syncs)3797 static void xe_vma_ops_init(struct xe_vma_ops *vops, struct xe_vm *vm,
3798 struct xe_exec_queue *q,
3799 struct xe_sync_entry *syncs, u32 num_syncs)
3800 {
3801 memset(vops, 0, sizeof(*vops));
3802 INIT_LIST_HEAD(&vops->list);
3803 vops->vm = vm;
3804 vops->q = q;
3805 vops->syncs = syncs;
3806 vops->num_syncs = num_syncs;
3807 vops->flags = 0;
3808 }
3809
xe_vm_bind_ioctl_validate_bo(struct xe_device * xe,struct xe_bo * bo,u64 addr,u64 range,u64 obj_offset,u16 pat_index,u32 op,u32 bind_flags)3810 static int xe_vm_bind_ioctl_validate_bo(struct xe_device *xe, struct xe_bo *bo,
3811 u64 addr, u64 range, u64 obj_offset,
3812 u16 pat_index, u32 op, u32 bind_flags)
3813 {
3814 u16 coh_mode;
3815 bool comp_en;
3816
3817 if (XE_IOCTL_DBG(xe, (bo->flags & XE_BO_FLAG_NO_COMPRESSION) &&
3818 xe_pat_index_get_comp_en(xe, pat_index)))
3819 return -EINVAL;
3820
3821 if (XE_IOCTL_DBG(xe, range > xe_bo_size(bo)) ||
3822 XE_IOCTL_DBG(xe, obj_offset >
3823 xe_bo_size(bo) - range)) {
3824 return -EINVAL;
3825 }
3826
3827 /*
3828 * Some platforms require 64k VM_BIND alignment,
3829 * specifically those with XE_VRAM_FLAGS_NEED64K.
3830 *
3831 * Other platforms may have BO's set to 64k physical placement,
3832 * but can be mapped at 4k offsets anyway. This check is only
3833 * there for the former case.
3834 */
3835 if ((bo->flags & XE_BO_FLAG_INTERNAL_64K) &&
3836 (xe->info.vram_flags & XE_VRAM_FLAGS_NEED64K)) {
3837 if (XE_IOCTL_DBG(xe, obj_offset &
3838 XE_64K_PAGE_MASK) ||
3839 XE_IOCTL_DBG(xe, addr & XE_64K_PAGE_MASK) ||
3840 XE_IOCTL_DBG(xe, range & XE_64K_PAGE_MASK)) {
3841 return -EINVAL;
3842 }
3843 }
3844
3845 coh_mode = xe_pat_index_get_coh_mode(xe, pat_index);
3846 if (bo->cpu_caching) {
3847 if (XE_IOCTL_DBG(xe, coh_mode == XE_COH_NONE &&
3848 bo->cpu_caching == DRM_XE_GEM_CPU_CACHING_WB)) {
3849 return -EINVAL;
3850 }
3851 } else if (XE_IOCTL_DBG(xe, coh_mode == XE_COH_NONE)) {
3852 /*
3853 * Imported dma-buf from a different device should
3854 * require 1way or 2way coherency since we don't know
3855 * how it was mapped on the CPU. Just assume is it
3856 * potentially cached on CPU side.
3857 */
3858 return -EINVAL;
3859 }
3860
3861 /*
3862 * Ensures that imported buffer objects (dma-bufs) are not mapped
3863 * with a PAT index that enables compression.
3864 */
3865 comp_en = xe_pat_index_get_comp_en(xe, pat_index);
3866 if (XE_IOCTL_DBG(xe, bo->ttm.base.import_attach && comp_en))
3867 return -EINVAL;
3868
3869 if (XE_IOCTL_DBG(xe, bo->ttm.base.import_attach && xe_device_is_l2_flush_optimized(xe) &&
3870 (pat_index != 19 && coh_mode != XE_COH_2WAY)))
3871 return -EINVAL;
3872
3873 /* If a BO is protected it can only be mapped if the key is still valid */
3874 if ((bind_flags & DRM_XE_VM_BIND_FLAG_CHECK_PXP) && xe_bo_is_protected(bo) &&
3875 op != DRM_XE_VM_BIND_OP_UNMAP && op != DRM_XE_VM_BIND_OP_UNMAP_ALL)
3876 if (XE_IOCTL_DBG(xe, xe_pxp_bo_key_check(xe->pxp, bo) != 0))
3877 return -ENOEXEC;
3878
3879 return 0;
3880 }
3881
xe_vm_bind_ioctl(struct drm_device * dev,void * data,struct drm_file * file)3882 int xe_vm_bind_ioctl(struct drm_device *dev, void *data, struct drm_file *file)
3883 {
3884 struct xe_device *xe = to_xe_device(dev);
3885 struct xe_file *xef = to_xe_file(file);
3886 struct drm_xe_vm_bind *args = data;
3887 struct drm_xe_sync __user *syncs_user;
3888 struct xe_bo **bos = NULL;
3889 struct drm_gpuva_ops **ops = NULL;
3890 struct xe_vm *vm;
3891 struct xe_exec_queue *q = NULL;
3892 u32 num_syncs, num_ufence = 0;
3893 struct xe_sync_entry *syncs = NULL;
3894 struct drm_xe_vm_bind_op *bind_ops = NULL;
3895 struct xe_vma_ops vops;
3896 struct dma_fence *fence;
3897 int err;
3898 int i;
3899
3900 vm = xe_vm_lookup(xef, args->vm_id);
3901 if (XE_IOCTL_DBG(xe, !vm))
3902 return -EINVAL;
3903
3904 err = vm_bind_ioctl_check_args(xe, vm, args, &bind_ops);
3905 if (err)
3906 goto put_vm;
3907
3908 if (args->exec_queue_id) {
3909 q = xe_exec_queue_lookup(xef, args->exec_queue_id);
3910 if (XE_IOCTL_DBG(xe, !q)) {
3911 err = -ENOENT;
3912 goto free_bind_ops;
3913 }
3914
3915 if (XE_IOCTL_DBG(xe, !(q->flags & EXEC_QUEUE_FLAG_VM))) {
3916 err = -EINVAL;
3917 goto put_exec_queue;
3918 }
3919 }
3920
3921 if (XE_IOCTL_DBG(xe, q && vm != q->user_vm)) {
3922 err = -EINVAL;
3923 goto put_exec_queue;
3924 }
3925
3926 /* Ensure all UNMAPs visible */
3927 xe_svm_flush(vm);
3928
3929 err = down_write_killable(&vm->lock);
3930 if (err)
3931 goto put_exec_queue;
3932
3933 if (XE_IOCTL_DBG(xe, xe_vm_is_closed_or_banned(vm))) {
3934 err = -ENOENT;
3935 goto release_vm_lock;
3936 }
3937
3938 for (i = 0; i < args->num_binds; ++i) {
3939 u64 range = bind_ops[i].range;
3940 u64 addr = bind_ops[i].addr;
3941
3942 if (XE_IOCTL_DBG(xe, range > vm->size) ||
3943 XE_IOCTL_DBG(xe, addr > vm->size - range)) {
3944 err = -EINVAL;
3945 goto release_vm_lock;
3946 }
3947 }
3948
3949 if (args->num_binds) {
3950 bos = kvzalloc_objs(*bos, args->num_binds,
3951 GFP_KERNEL | __GFP_ACCOUNT | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
3952 if (!bos) {
3953 err = -ENOMEM;
3954 goto release_vm_lock;
3955 }
3956
3957 ops = kvzalloc_objs(*ops, args->num_binds,
3958 GFP_KERNEL | __GFP_ACCOUNT | __GFP_RETRY_MAYFAIL | __GFP_NOWARN);
3959 if (!ops) {
3960 err = -ENOMEM;
3961 goto free_bos;
3962 }
3963 }
3964
3965 for (i = 0; i < args->num_binds; ++i) {
3966 struct drm_gem_object *gem_obj;
3967 u64 range = bind_ops[i].range;
3968 u64 addr = bind_ops[i].addr;
3969 u32 obj = bind_ops[i].obj;
3970 u64 obj_offset = bind_ops[i].obj_offset;
3971 u16 pat_index = bind_ops[i].pat_index;
3972 u32 op = bind_ops[i].op;
3973 u32 bind_flags = bind_ops[i].flags;
3974
3975 if (!obj)
3976 continue;
3977
3978 gem_obj = drm_gem_object_lookup(file, obj);
3979 if (XE_IOCTL_DBG(xe, !gem_obj)) {
3980 err = -ENOENT;
3981 goto put_obj;
3982 }
3983 bos[i] = gem_to_xe_bo(gem_obj);
3984
3985 err = xe_vm_bind_ioctl_validate_bo(xe, bos[i], addr, range,
3986 obj_offset, pat_index, op,
3987 bind_flags);
3988 if (err)
3989 goto put_obj;
3990 }
3991
3992 if (args->num_syncs) {
3993 syncs = kzalloc_objs(*syncs, args->num_syncs);
3994 if (!syncs) {
3995 err = -ENOMEM;
3996 goto put_obj;
3997 }
3998 }
3999
4000 syncs_user = u64_to_user_ptr(args->syncs);
4001 for (num_syncs = 0; num_syncs < args->num_syncs; num_syncs++) {
4002 struct xe_exec_queue *__q = q ?: vm->q[0];
4003
4004 err = xe_sync_entry_parse(xe, xef, &syncs[num_syncs],
4005 &syncs_user[num_syncs],
4006 __q->ufence_syncobj,
4007 ++__q->ufence_timeline_value,
4008 (xe_vm_in_lr_mode(vm) ?
4009 SYNC_PARSE_FLAG_LR_MODE : 0) |
4010 (!args->num_binds ?
4011 SYNC_PARSE_FLAG_DISALLOW_USER_FENCE : 0));
4012 if (err)
4013 goto free_syncs;
4014
4015 if (xe_sync_is_ufence(&syncs[num_syncs]))
4016 num_ufence++;
4017 }
4018
4019 if (XE_IOCTL_DBG(xe, num_ufence > 1)) {
4020 err = -EINVAL;
4021 goto free_syncs;
4022 }
4023
4024 if (!args->num_binds) {
4025 err = -ENODATA;
4026 goto free_syncs;
4027 }
4028
4029 xe_vma_ops_init(&vops, vm, q, syncs, num_syncs);
4030 if (args->num_binds > 1)
4031 vops.flags |= XE_VMA_OPS_ARRAY_OF_BINDS;
4032 for (i = 0; i < args->num_binds; ++i) {
4033 u64 range = bind_ops[i].range;
4034 u64 addr = bind_ops[i].addr;
4035 u32 op = bind_ops[i].op;
4036 u32 flags = bind_ops[i].flags;
4037 u64 obj_offset = bind_ops[i].obj_offset;
4038 u32 prefetch_region = bind_ops[i].prefetch_mem_region_instance;
4039 u16 pat_index = bind_ops[i].pat_index;
4040
4041 ops[i] = vm_bind_ioctl_ops_create(vm, &vops, bos[i], obj_offset,
4042 addr, range, op, flags,
4043 prefetch_region, pat_index);
4044 if (IS_ERR(ops[i])) {
4045 err = PTR_ERR(ops[i]);
4046 ops[i] = NULL;
4047 goto unwind_ops;
4048 }
4049
4050 err = vm_bind_ioctl_ops_parse(vm, ops[i], &vops);
4051 if (err)
4052 goto unwind_ops;
4053
4054 #ifdef TEST_VM_OPS_ERROR
4055 if (flags & FORCE_OP_ERROR) {
4056 vops.inject_error = true;
4057 vm->xe->vm_inject_error_position =
4058 (vm->xe->vm_inject_error_position + 1) %
4059 FORCE_OP_ERROR_COUNT;
4060 }
4061 #endif
4062 }
4063
4064 /* Nothing to do */
4065 if (list_empty(&vops.list)) {
4066 err = -ENODATA;
4067 goto unwind_ops;
4068 }
4069
4070 err = xe_vma_ops_alloc(&vops, args->num_binds > 1);
4071 if (err)
4072 goto unwind_ops;
4073
4074 err = vm_bind_ioctl_ops_prefetch_ranges(vm, &vops);
4075 if (err)
4076 goto unwind_ops;
4077
4078 fence = vm_bind_ioctl_ops_execute(vm, &vops);
4079 if (IS_ERR(fence))
4080 err = PTR_ERR(fence);
4081 else
4082 dma_fence_put(fence);
4083
4084 unwind_ops:
4085 if (err && err != -ENODATA)
4086 vm_bind_ioctl_ops_unwind(vm, ops, args->num_binds);
4087 xe_vma_ops_fini(&vops);
4088 for (i = args->num_binds - 1; i >= 0; --i)
4089 if (ops[i])
4090 drm_gpuva_ops_free(&vm->gpuvm, ops[i]);
4091 free_syncs:
4092 if (err == -ENODATA)
4093 err = vm_bind_ioctl_signal_fences(vm, q, syncs, num_syncs);
4094 while (num_syncs--)
4095 xe_sync_entry_cleanup(&syncs[num_syncs]);
4096
4097 kfree(syncs);
4098 put_obj:
4099 for (i = 0; i < args->num_binds; ++i)
4100 xe_bo_put(bos[i]);
4101
4102 kvfree(ops);
4103 free_bos:
4104 kvfree(bos);
4105 release_vm_lock:
4106 up_write(&vm->lock);
4107 put_exec_queue:
4108 if (q)
4109 xe_exec_queue_put(q);
4110 free_bind_ops:
4111 if (args->num_binds > 1)
4112 kvfree(bind_ops);
4113 put_vm:
4114 xe_vm_put(vm);
4115 return err;
4116 }
4117
4118 /*
4119 * Map access type, fault type, and fault level from current bspec
4120 * specification to user spec abstraction. The current mapping is
4121 * approximately 1-to-1, with access type being the only notable
4122 * exception as it carries additional data with respect to prefetch
4123 * status that needs to be masked out.
4124 */
xe_to_user_access_type(u8 access_type)4125 static u8 xe_to_user_access_type(u8 access_type)
4126 {
4127 return access_type & XE_PAGEFAULT_ACCESS_TYPE_MASK;
4128 }
4129
xe_to_user_fault_type(u8 fault_type)4130 static u8 xe_to_user_fault_type(u8 fault_type)
4131 {
4132 return fault_type;
4133 }
4134
xe_to_user_fault_level(u8 fault_level)4135 static u8 xe_to_user_fault_level(u8 fault_level)
4136 {
4137 return fault_level;
4138 }
4139
fill_faults(struct xe_vm * vm,struct drm_xe_vm_get_property * args)4140 static int fill_faults(struct xe_vm *vm,
4141 struct drm_xe_vm_get_property *args)
4142 {
4143 struct xe_vm_fault __user *usr_ptr = u64_to_user_ptr(args->data);
4144 struct xe_vm_fault *fault_list, fault_entry = { 0 };
4145 struct xe_vm_fault_entry *entry;
4146 int ret = 0, i = 0, count, entry_size;
4147
4148 entry_size = sizeof(struct xe_vm_fault);
4149 count = args->size / entry_size;
4150
4151 fault_list = kzalloc_objs(struct xe_vm_fault, count);
4152 if (!fault_list)
4153 return -ENOMEM;
4154
4155 spin_lock(&vm->faults.lock);
4156 list_for_each_entry(entry, &vm->faults.list, list) {
4157 if (i == count)
4158 break;
4159
4160 fault_entry.address = xe_device_canonicalize_addr(vm->xe, entry->address);
4161 fault_entry.address_precision = entry->address_precision;
4162
4163 fault_entry.access_type = xe_to_user_access_type(entry->access_type);
4164 fault_entry.fault_type = xe_to_user_fault_type(entry->fault_type);
4165 fault_entry.fault_level = xe_to_user_fault_level(entry->fault_level);
4166
4167 memcpy(&fault_list[i], &fault_entry, entry_size);
4168
4169 i++;
4170 }
4171 spin_unlock(&vm->faults.lock);
4172
4173 ret = copy_to_user(usr_ptr, fault_list, args->size);
4174
4175 kfree(fault_list);
4176 return ret ? -EFAULT : 0;
4177 }
4178
xe_vm_get_property_helper(struct xe_vm * vm,struct drm_xe_vm_get_property * args)4179 static int xe_vm_get_property_helper(struct xe_vm *vm,
4180 struct drm_xe_vm_get_property *args)
4181 {
4182 size_t size;
4183
4184 switch (args->property) {
4185 case DRM_XE_VM_GET_PROPERTY_FAULTS:
4186 spin_lock(&vm->faults.lock);
4187 size = size_mul(sizeof(struct xe_vm_fault), vm->faults.len);
4188 spin_unlock(&vm->faults.lock);
4189
4190 if (!args->size) {
4191 args->size = size;
4192 return 0;
4193 }
4194
4195 /*
4196 * Number of faults may increase between calls to
4197 * xe_vm_get_property_ioctl, so just report the number of
4198 * faults the user requests if it's less than or equal to
4199 * the number of faults in the VM fault array.
4200 *
4201 * We should also at least assert that the args->size value
4202 * is a multiple of the xe_vm_fault struct size.
4203 */
4204 if (args->size > size || args->size % sizeof(struct xe_vm_fault))
4205 return -EINVAL;
4206
4207 return fill_faults(vm, args);
4208 }
4209 return -EINVAL;
4210 }
4211
xe_vm_get_property_ioctl(struct drm_device * drm,void * data,struct drm_file * file)4212 int xe_vm_get_property_ioctl(struct drm_device *drm, void *data,
4213 struct drm_file *file)
4214 {
4215 struct xe_device *xe = to_xe_device(drm);
4216 struct xe_file *xef = to_xe_file(file);
4217 struct drm_xe_vm_get_property *args = data;
4218 struct xe_vm *vm;
4219 int ret = 0;
4220
4221 if (XE_IOCTL_DBG(xe, (args->reserved[0] || args->reserved[1] ||
4222 args->reserved[2] || args->extensions ||
4223 args->pad)))
4224 return -EINVAL;
4225
4226 vm = xe_vm_lookup(xef, args->vm_id);
4227 if (XE_IOCTL_DBG(xe, !vm))
4228 return -ENOENT;
4229
4230 ret = xe_vm_get_property_helper(vm, args);
4231
4232 xe_vm_put(vm);
4233 return ret;
4234 }
4235
4236 /**
4237 * xe_vm_bind_kernel_bo - bind a kernel BO to a VM
4238 * @vm: VM to bind the BO to
4239 * @bo: BO to bind
4240 * @q: exec queue to use for the bind (optional)
4241 * @addr: address at which to bind the BO
4242 * @cache_lvl: PAT cache level to use
4243 *
4244 * Execute a VM bind map operation on a kernel-owned BO to bind it into a
4245 * kernel-owned VM.
4246 *
4247 * Returns a dma_fence to track the binding completion if the job to do so was
4248 * successfully submitted, an error pointer otherwise.
4249 */
xe_vm_bind_kernel_bo(struct xe_vm * vm,struct xe_bo * bo,struct xe_exec_queue * q,u64 addr,enum xe_cache_level cache_lvl)4250 struct dma_fence *xe_vm_bind_kernel_bo(struct xe_vm *vm, struct xe_bo *bo,
4251 struct xe_exec_queue *q, u64 addr,
4252 enum xe_cache_level cache_lvl)
4253 {
4254 struct xe_vma_ops vops;
4255 struct drm_gpuva_ops *ops = NULL;
4256 struct dma_fence *fence;
4257 int err;
4258
4259 xe_bo_get(bo);
4260 xe_vm_get(vm);
4261 if (q)
4262 xe_exec_queue_get(q);
4263
4264 down_write(&vm->lock);
4265
4266 xe_vma_ops_init(&vops, vm, q, NULL, 0);
4267
4268 ops = vm_bind_ioctl_ops_create(vm, &vops, bo, 0, addr, xe_bo_size(bo),
4269 DRM_XE_VM_BIND_OP_MAP, 0, 0,
4270 xe_cache_pat_idx(vm->xe, cache_lvl));
4271 if (IS_ERR(ops)) {
4272 err = PTR_ERR(ops);
4273 goto release_vm_lock;
4274 }
4275
4276 err = vm_bind_ioctl_ops_parse(vm, ops, &vops);
4277 if (err)
4278 goto release_vm_lock;
4279
4280 xe_assert(vm->xe, !list_empty(&vops.list));
4281
4282 err = xe_vma_ops_alloc(&vops, false);
4283 if (err)
4284 goto unwind_ops;
4285
4286 fence = vm_bind_ioctl_ops_execute(vm, &vops);
4287 if (IS_ERR(fence))
4288 err = PTR_ERR(fence);
4289
4290 unwind_ops:
4291 if (err && err != -ENODATA)
4292 vm_bind_ioctl_ops_unwind(vm, &ops, 1);
4293
4294 xe_vma_ops_fini(&vops);
4295 drm_gpuva_ops_free(&vm->gpuvm, ops);
4296
4297 release_vm_lock:
4298 up_write(&vm->lock);
4299
4300 if (q)
4301 xe_exec_queue_put(q);
4302 xe_vm_put(vm);
4303 xe_bo_put(bo);
4304
4305 if (err)
4306 fence = ERR_PTR(err);
4307
4308 return fence;
4309 }
4310
4311 /**
4312 * xe_vm_lock() - Lock the vm's dma_resv object
4313 * @vm: The struct xe_vm whose lock is to be locked
4314 * @intr: Whether to perform any wait interruptible
4315 *
4316 * Return: 0 on success, -EINTR if @intr is true and the wait for a
4317 * contended lock was interrupted. If @intr is false, the function
4318 * always returns 0.
4319 */
xe_vm_lock(struct xe_vm * vm,bool intr)4320 int xe_vm_lock(struct xe_vm *vm, bool intr)
4321 {
4322 int ret;
4323
4324 if (intr)
4325 ret = dma_resv_lock_interruptible(xe_vm_resv(vm), NULL);
4326 else
4327 ret = dma_resv_lock(xe_vm_resv(vm), NULL);
4328
4329 return ret;
4330 }
4331
4332 /**
4333 * xe_vm_unlock() - Unlock the vm's dma_resv object
4334 * @vm: The struct xe_vm whose lock is to be released.
4335 *
4336 * Unlock a buffer object lock that was locked by xe_vm_lock().
4337 */
xe_vm_unlock(struct xe_vm * vm)4338 void xe_vm_unlock(struct xe_vm *vm)
4339 {
4340 dma_resv_unlock(xe_vm_resv(vm));
4341 }
4342
4343 /**
4344 * xe_vm_invalidate_vma_submit - Submit a job to invalidate GPU mappings for
4345 * VMA.
4346 * @vma: VMA to invalidate
4347 * @batch: TLB invalidation batch to populate; caller must later call
4348 * xe_tlb_inval_batch_wait() on it to wait for completion
4349 *
4350 * Walks a list of page tables leaves which it memset the entries owned by this
4351 * VMA to zero, invalidates the TLBs, but doesn't block waiting for TLB flush
4352 * to complete, but instead populates @batch which can be waited on using
4353 * xe_tlb_inval_batch_wait().
4354 *
4355 * Returns 0 for success, negative error code otherwise.
4356 */
xe_vm_invalidate_vma_submit(struct xe_vma * vma,struct xe_tlb_inval_batch * batch)4357 int xe_vm_invalidate_vma_submit(struct xe_vma *vma, struct xe_tlb_inval_batch *batch)
4358 {
4359 struct xe_device *xe = xe_vma_vm(vma)->xe;
4360 struct xe_vm *vm = xe_vma_vm(vma);
4361 struct xe_tile *tile;
4362 u8 tile_mask = 0;
4363 int ret = 0;
4364 u8 id;
4365
4366 xe_assert(xe, !xe_vma_is_null(vma));
4367 xe_assert(xe, !xe_vma_is_cpu_addr_mirror(vma));
4368 trace_xe_vma_invalidate(vma);
4369
4370 vm_dbg(&vm->xe->drm,
4371 "INVALIDATE: addr=0x%016llx, range=0x%016llx",
4372 xe_vma_start(vma), xe_vma_size(vma));
4373
4374 /*
4375 * Check that we don't race with page-table updates, tile_invalidated
4376 * update is safe
4377 */
4378 if (IS_ENABLED(CONFIG_PROVE_LOCKING)) {
4379 if (xe_vma_is_userptr(vma)) {
4380 lockdep_assert(lockdep_is_held_type(&vm->svm.gpusvm.notifier_lock, 0) ||
4381 (lockdep_is_held_type(&vm->svm.gpusvm.notifier_lock, 1) &&
4382 lockdep_is_held(&xe_vm_resv(vm)->lock.base)));
4383
4384 WARN_ON_ONCE(!mmu_interval_check_retry
4385 (&to_userptr_vma(vma)->userptr.notifier,
4386 to_userptr_vma(vma)->userptr.pages.notifier_seq));
4387 WARN_ON_ONCE(!dma_resv_test_signaled(xe_vm_resv(vm),
4388 DMA_RESV_USAGE_BOOKKEEP));
4389
4390 } else {
4391 xe_bo_assert_held(xe_vma_bo(vma));
4392 }
4393 }
4394
4395 for_each_tile(tile, xe, id)
4396 if (xe_pt_zap_ptes(tile, vma))
4397 tile_mask |= BIT(id);
4398
4399 xe_device_wmb(xe);
4400
4401 ret = xe_tlb_inval_range_tilemask_submit(xe, xe_vma_vm(vma)->usm.asid,
4402 xe_vma_start(vma), xe_vma_end(vma),
4403 tile_mask, batch);
4404
4405 /* WRITE_ONCE pairs with READ_ONCE in xe_vm_has_valid_gpu_mapping() */
4406 WRITE_ONCE(vma->tile_invalidated, vma->tile_mask);
4407 return ret;
4408 }
4409
4410 /**
4411 * xe_vm_invalidate_vma - invalidate GPU mappings for VMA without a lock
4412 * @vma: VMA to invalidate
4413 *
4414 * Walks a list of page tables leaves which it memset the entries owned by this
4415 * VMA to zero, invalidates the TLBs, and block until TLBs invalidation is
4416 * complete.
4417 *
4418 * Returns 0 for success, negative error code otherwise.
4419 */
xe_vm_invalidate_vma(struct xe_vma * vma)4420 int xe_vm_invalidate_vma(struct xe_vma *vma)
4421 {
4422 struct xe_tlb_inval_batch batch;
4423 int ret;
4424
4425 ret = xe_vm_invalidate_vma_submit(vma, &batch);
4426 if (ret)
4427 return ret;
4428
4429 xe_tlb_inval_batch_wait(&batch);
4430 return ret;
4431 }
4432
xe_vm_validate_protected(struct xe_vm * vm)4433 int xe_vm_validate_protected(struct xe_vm *vm)
4434 {
4435 struct drm_gpuva *gpuva;
4436 int err = 0;
4437
4438 if (!vm)
4439 return -ENODEV;
4440
4441 mutex_lock(&vm->snap_mutex);
4442
4443 drm_gpuvm_for_each_va(gpuva, &vm->gpuvm) {
4444 struct xe_vma *vma = gpuva_to_vma(gpuva);
4445 struct xe_bo *bo = vma->gpuva.gem.obj ?
4446 gem_to_xe_bo(vma->gpuva.gem.obj) : NULL;
4447
4448 if (!bo)
4449 continue;
4450
4451 if (xe_bo_is_protected(bo)) {
4452 err = xe_pxp_bo_key_check(vm->xe->pxp, bo);
4453 if (err)
4454 break;
4455 }
4456 }
4457
4458 mutex_unlock(&vm->snap_mutex);
4459 return err;
4460 }
4461
4462 struct xe_vm_snapshot {
4463 int uapi_flags;
4464 unsigned long num_snaps;
4465 struct {
4466 u64 ofs, bo_ofs;
4467 unsigned long len;
4468 #define XE_VM_SNAP_FLAG_USERPTR BIT(0)
4469 #define XE_VM_SNAP_FLAG_READ_ONLY BIT(1)
4470 #define XE_VM_SNAP_FLAG_IS_NULL BIT(2)
4471 unsigned long flags;
4472 int uapi_mem_region;
4473 u16 pat_index;
4474 int cpu_caching;
4475 struct xe_bo *bo;
4476 void *data;
4477 struct mm_struct *mm;
4478 } snap[];
4479 };
4480
xe_vm_snapshot_capture(struct xe_vm * vm)4481 struct xe_vm_snapshot *xe_vm_snapshot_capture(struct xe_vm *vm)
4482 {
4483 unsigned long num_snaps = 0, i;
4484 struct xe_vm_snapshot *snap = NULL;
4485 struct drm_gpuva *gpuva;
4486
4487 if (!vm)
4488 return NULL;
4489
4490 mutex_lock(&vm->snap_mutex);
4491 drm_gpuvm_for_each_va(gpuva, &vm->gpuvm) {
4492 if (gpuva->flags & XE_VMA_DUMPABLE)
4493 num_snaps++;
4494 }
4495
4496 if (num_snaps)
4497 snap = kvzalloc(offsetof(struct xe_vm_snapshot, snap[num_snaps]), GFP_NOWAIT);
4498 if (!snap) {
4499 snap = num_snaps ? ERR_PTR(-ENOMEM) : ERR_PTR(-ENODEV);
4500 goto out_unlock;
4501 }
4502
4503 if (vm->flags & XE_VM_FLAG_FAULT_MODE)
4504 snap->uapi_flags |= DRM_XE_VM_CREATE_FLAG_FAULT_MODE;
4505 if (vm->flags & XE_VM_FLAG_LR_MODE)
4506 snap->uapi_flags |= DRM_XE_VM_CREATE_FLAG_LR_MODE;
4507 if (vm->flags & XE_VM_FLAG_SCRATCH_PAGE)
4508 snap->uapi_flags |= DRM_XE_VM_CREATE_FLAG_SCRATCH_PAGE;
4509
4510 snap->num_snaps = num_snaps;
4511 i = 0;
4512 drm_gpuvm_for_each_va(gpuva, &vm->gpuvm) {
4513 struct xe_vma *vma = gpuva_to_vma(gpuva);
4514 struct xe_bo *bo = vma->gpuva.gem.obj ?
4515 gem_to_xe_bo(vma->gpuva.gem.obj) : NULL;
4516
4517 if (!(gpuva->flags & XE_VMA_DUMPABLE))
4518 continue;
4519
4520 snap->snap[i].ofs = xe_vma_start(vma);
4521 snap->snap[i].len = xe_vma_size(vma);
4522 snap->snap[i].flags = xe_vma_read_only(vma) ?
4523 XE_VM_SNAP_FLAG_READ_ONLY : 0;
4524 snap->snap[i].pat_index = vma->attr.pat_index;
4525 if (bo) {
4526 snap->snap[i].cpu_caching = bo->cpu_caching;
4527 snap->snap[i].bo = xe_bo_get(bo);
4528 snap->snap[i].bo_ofs = xe_vma_bo_offset(vma);
4529 switch (bo->ttm.resource->mem_type) {
4530 case XE_PL_SYSTEM:
4531 case XE_PL_TT:
4532 snap->snap[i].uapi_mem_region = 0;
4533 break;
4534 case XE_PL_VRAM0:
4535 snap->snap[i].uapi_mem_region = 1;
4536 break;
4537 case XE_PL_VRAM1:
4538 snap->snap[i].uapi_mem_region = 2;
4539 break;
4540 }
4541 } else if (xe_vma_is_userptr(vma)) {
4542 struct mm_struct *mm =
4543 to_userptr_vma(vma)->userptr.notifier.mm;
4544
4545 if (mmget_not_zero(mm))
4546 snap->snap[i].mm = mm;
4547 else
4548 snap->snap[i].data = ERR_PTR(-EFAULT);
4549
4550 snap->snap[i].bo_ofs = xe_vma_userptr(vma);
4551 snap->snap[i].flags |= XE_VM_SNAP_FLAG_USERPTR;
4552 snap->snap[i].uapi_mem_region = 0;
4553 } else if (xe_vma_is_null(vma)) {
4554 snap->snap[i].flags |= XE_VM_SNAP_FLAG_IS_NULL;
4555 snap->snap[i].uapi_mem_region = -1;
4556 } else {
4557 snap->snap[i].data = ERR_PTR(-ENOENT);
4558 snap->snap[i].uapi_mem_region = -1;
4559 }
4560 i++;
4561 }
4562
4563 out_unlock:
4564 mutex_unlock(&vm->snap_mutex);
4565 return snap;
4566 }
4567
xe_vm_snapshot_capture_delayed(struct xe_vm_snapshot * snap)4568 void xe_vm_snapshot_capture_delayed(struct xe_vm_snapshot *snap)
4569 {
4570 if (IS_ERR_OR_NULL(snap))
4571 return;
4572
4573 for (int i = 0; i < snap->num_snaps; i++) {
4574 struct xe_bo *bo = snap->snap[i].bo;
4575 int err;
4576
4577 if (IS_ERR(snap->snap[i].data) ||
4578 snap->snap[i].flags & XE_VM_SNAP_FLAG_IS_NULL)
4579 continue;
4580
4581 snap->snap[i].data = kvmalloc(snap->snap[i].len, GFP_USER);
4582 if (!snap->snap[i].data) {
4583 snap->snap[i].data = ERR_PTR(-ENOMEM);
4584 goto cleanup_bo;
4585 }
4586
4587 if (bo) {
4588 err = xe_bo_read(bo, snap->snap[i].bo_ofs,
4589 snap->snap[i].data, snap->snap[i].len);
4590 } else {
4591 void __user *userptr = (void __user *)(size_t)snap->snap[i].bo_ofs;
4592
4593 kthread_use_mm(snap->snap[i].mm);
4594 if (!copy_from_user(snap->snap[i].data, userptr, snap->snap[i].len))
4595 err = 0;
4596 else
4597 err = -EFAULT;
4598 kthread_unuse_mm(snap->snap[i].mm);
4599
4600 mmput(snap->snap[i].mm);
4601 snap->snap[i].mm = NULL;
4602 }
4603
4604 if (err) {
4605 kvfree(snap->snap[i].data);
4606 snap->snap[i].data = ERR_PTR(err);
4607 }
4608
4609 cleanup_bo:
4610 xe_bo_put(bo);
4611 snap->snap[i].bo = NULL;
4612 }
4613 }
4614
xe_vm_snapshot_print(struct xe_vm_snapshot * snap,struct drm_printer * p)4615 void xe_vm_snapshot_print(struct xe_vm_snapshot *snap, struct drm_printer *p)
4616 {
4617 unsigned long i, j;
4618
4619 if (IS_ERR_OR_NULL(snap)) {
4620 drm_printf(p, "[0].error: %li\n", PTR_ERR(snap));
4621 return;
4622 }
4623
4624 drm_printf(p, "VM.uapi_flags: 0x%x\n", snap->uapi_flags);
4625 for (i = 0; i < snap->num_snaps; i++) {
4626 drm_printf(p, "[%llx].length: 0x%lx\n", snap->snap[i].ofs, snap->snap[i].len);
4627
4628 drm_printf(p, "[%llx].properties: %s|%s|mem_region=0x%lx|pat_index=%d|cpu_caching=%d\n",
4629 snap->snap[i].ofs,
4630 snap->snap[i].flags & XE_VM_SNAP_FLAG_READ_ONLY ?
4631 "read_only" : "read_write",
4632 snap->snap[i].flags & XE_VM_SNAP_FLAG_IS_NULL ?
4633 "null_sparse" :
4634 snap->snap[i].flags & XE_VM_SNAP_FLAG_USERPTR ?
4635 "userptr" : "bo",
4636 snap->snap[i].uapi_mem_region == -1 ? 0 :
4637 BIT(snap->snap[i].uapi_mem_region),
4638 snap->snap[i].pat_index,
4639 snap->snap[i].cpu_caching);
4640
4641 if (IS_ERR(snap->snap[i].data)) {
4642 drm_printf(p, "[%llx].error: %li\n", snap->snap[i].ofs,
4643 PTR_ERR(snap->snap[i].data));
4644 continue;
4645 }
4646
4647 if (snap->snap[i].flags & XE_VM_SNAP_FLAG_IS_NULL)
4648 continue;
4649
4650 drm_printf(p, "[%llx].data: ", snap->snap[i].ofs);
4651
4652 for (j = 0; j < snap->snap[i].len; j += sizeof(u32)) {
4653 u32 *val = snap->snap[i].data + j;
4654 char dumped[ASCII85_BUFSZ];
4655
4656 drm_puts(p, ascii85_encode(*val, dumped));
4657 }
4658
4659 drm_puts(p, "\n");
4660
4661 if (drm_coredump_printer_is_full(p))
4662 return;
4663 }
4664 }
4665
xe_vm_snapshot_free(struct xe_vm_snapshot * snap)4666 void xe_vm_snapshot_free(struct xe_vm_snapshot *snap)
4667 {
4668 unsigned long i;
4669
4670 if (IS_ERR_OR_NULL(snap))
4671 return;
4672
4673 for (i = 0; i < snap->num_snaps; i++) {
4674 if (!IS_ERR(snap->snap[i].data))
4675 kvfree(snap->snap[i].data);
4676 xe_bo_put(snap->snap[i].bo);
4677 if (snap->snap[i].mm)
4678 mmput(snap->snap[i].mm);
4679 }
4680 kvfree(snap);
4681 }
4682
4683 /**
4684 * xe_vma_need_vram_for_atomic - Check if VMA needs VRAM migration for atomic operations
4685 * @xe: Pointer to the Xe device structure
4686 * @vma: Pointer to the virtual memory area (VMA) structure
4687 * @is_atomic: In pagefault path and atomic operation
4688 *
4689 * This function determines whether the given VMA needs to be migrated to
4690 * VRAM in order to do atomic GPU operation.
4691 *
4692 * Return:
4693 * 1 - Migration to VRAM is required
4694 * 0 - Migration is not required
4695 * -EACCES - Invalid access for atomic memory attr
4696 *
4697 */
xe_vma_need_vram_for_atomic(struct xe_device * xe,struct xe_vma * vma,bool is_atomic)4698 int xe_vma_need_vram_for_atomic(struct xe_device *xe, struct xe_vma *vma, bool is_atomic)
4699 {
4700 u32 atomic_access = xe_vma_bo(vma) ? xe_vma_bo(vma)->attr.atomic_access :
4701 vma->attr.atomic_access;
4702
4703 if (!IS_DGFX(xe) || !is_atomic)
4704 return false;
4705
4706 /*
4707 * NOTE: The checks implemented here are platform-specific. For
4708 * instance, on a device supporting CXL atomics, these would ideally
4709 * work universally without additional handling.
4710 */
4711 switch (atomic_access) {
4712 case DRM_XE_ATOMIC_DEVICE:
4713 return !xe->info.has_device_atomics_on_smem;
4714
4715 case DRM_XE_ATOMIC_CPU:
4716 return -EACCES;
4717
4718 case DRM_XE_ATOMIC_UNDEFINED:
4719 case DRM_XE_ATOMIC_GLOBAL:
4720 default:
4721 return 1;
4722 }
4723 }
4724
xe_vm_alloc_vma(struct xe_vm * vm,struct drm_gpuvm_map_req * map_req,bool is_madvise)4725 static int xe_vm_alloc_vma(struct xe_vm *vm,
4726 struct drm_gpuvm_map_req *map_req,
4727 bool is_madvise)
4728 {
4729 struct xe_vma_ops vops;
4730 struct drm_gpuva_ops *ops = NULL;
4731 struct drm_gpuva_op *__op;
4732 unsigned int vma_flags = 0;
4733 bool remap_op = false;
4734 struct xe_vma_mem_attr tmp_attr = {};
4735 u16 default_pat;
4736 int err;
4737
4738 lockdep_assert_held_write(&vm->lock);
4739
4740 if (is_madvise)
4741 ops = drm_gpuvm_madvise_ops_create(&vm->gpuvm, map_req);
4742 else
4743 ops = drm_gpuvm_sm_map_ops_create(&vm->gpuvm, map_req);
4744
4745 if (IS_ERR(ops))
4746 return PTR_ERR(ops);
4747
4748 if (list_empty(&ops->list)) {
4749 err = 0;
4750 goto free_ops;
4751 }
4752
4753 drm_gpuva_for_each_op(__op, ops) {
4754 struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
4755 struct xe_vma *vma = NULL;
4756
4757 if (!is_madvise) {
4758 if (__op->op == DRM_GPUVA_OP_UNMAP) {
4759 vma = gpuva_to_vma(op->base.unmap.va);
4760 XE_WARN_ON(!xe_vma_has_default_mem_attrs(vma));
4761 default_pat = vma->attr.default_pat_index;
4762 vma_flags = vma->gpuva.flags;
4763 }
4764
4765 if (__op->op == DRM_GPUVA_OP_REMAP) {
4766 vma = gpuva_to_vma(op->base.remap.unmap->va);
4767 default_pat = vma->attr.default_pat_index;
4768 vma_flags = vma->gpuva.flags;
4769 }
4770
4771 if (__op->op == DRM_GPUVA_OP_MAP) {
4772 op->map.vma_flags |= vma_flags & XE_VMA_CREATE_MASK;
4773 op->map.pat_index = default_pat;
4774 }
4775 } else {
4776 if (__op->op == DRM_GPUVA_OP_REMAP) {
4777 vma = gpuva_to_vma(op->base.remap.unmap->va);
4778 xe_assert(vm->xe, !remap_op);
4779 xe_assert(vm->xe, xe_vma_has_no_bo(vma));
4780 remap_op = true;
4781 vma_flags = vma->gpuva.flags;
4782 }
4783
4784 if (__op->op == DRM_GPUVA_OP_MAP) {
4785 xe_assert(vm->xe, remap_op);
4786 remap_op = false;
4787 /*
4788 * In case of madvise ops DRM_GPUVA_OP_MAP is
4789 * always after DRM_GPUVA_OP_REMAP, so ensure
4790 * to propagate the flags from the vma we're
4791 * unmapping.
4792 */
4793 op->map.vma_flags |= vma_flags & XE_VMA_CREATE_MASK;
4794 }
4795 }
4796 print_op(vm->xe, __op);
4797 }
4798
4799 xe_vma_ops_init(&vops, vm, NULL, NULL, 0);
4800
4801 if (is_madvise)
4802 vops.flags |= XE_VMA_OPS_FLAG_MADVISE;
4803 else
4804 vops.flags |= XE_VMA_OPS_FLAG_ALLOW_SVM_UNMAP;
4805
4806 err = vm_bind_ioctl_ops_parse(vm, ops, &vops);
4807 if (err)
4808 goto unwind_ops;
4809
4810 xe_vm_lock(vm, false);
4811
4812 drm_gpuva_for_each_op(__op, ops) {
4813 struct xe_vma_op *op = gpuva_op_to_vma_op(__op);
4814 struct xe_vma *vma;
4815
4816 if (__op->op == DRM_GPUVA_OP_UNMAP) {
4817 vma = gpuva_to_vma(op->base.unmap.va);
4818 /* There should be no unmap for madvise */
4819 if (is_madvise)
4820 XE_WARN_ON("UNEXPECTED UNMAP");
4821
4822 xe_vma_destroy(vma, NULL);
4823 } else if (__op->op == DRM_GPUVA_OP_REMAP) {
4824 vma = gpuva_to_vma(op->base.remap.unmap->va);
4825 /* In case of madvise ops Store attributes for REMAP UNMAPPED
4826 * VMA, so they can be assigned to newly MAP created vma.
4827 */
4828 if (is_madvise)
4829 xe_vma_mem_attr_copy(&tmp_attr, &vma->attr);
4830
4831 xe_vma_destroy(gpuva_to_vma(op->base.remap.unmap->va), NULL);
4832 } else if (__op->op == DRM_GPUVA_OP_MAP) {
4833 vma = op->map.vma;
4834 /* In case of madvise call, MAP will always be followed by REMAP.
4835 * Therefore temp_attr will always have sane values, making it safe to
4836 * copy them to new vma.
4837 */
4838 if (is_madvise)
4839 xe_vma_mem_attr_copy(&vma->attr, &tmp_attr);
4840 }
4841 }
4842
4843 xe_vm_unlock(vm);
4844 drm_gpuva_ops_free(&vm->gpuvm, ops);
4845 xe_vma_mem_attr_fini(&tmp_attr);
4846 return 0;
4847
4848 unwind_ops:
4849 vm_bind_ioctl_ops_unwind(vm, &ops, 1);
4850 free_ops:
4851 drm_gpuva_ops_free(&vm->gpuvm, ops);
4852 return err;
4853 }
4854
4855 /**
4856 * xe_vm_alloc_madvise_vma - Allocate VMA's with madvise ops
4857 * @vm: Pointer to the xe_vm structure
4858 * @start: Starting input address
4859 * @range: Size of the input range
4860 *
4861 * This function splits existing vma to create new vma for user provided input range
4862 *
4863 * Return: 0 if success
4864 */
xe_vm_alloc_madvise_vma(struct xe_vm * vm,uint64_t start,uint64_t range)4865 int xe_vm_alloc_madvise_vma(struct xe_vm *vm, uint64_t start, uint64_t range)
4866 {
4867 struct drm_gpuvm_map_req map_req = {
4868 .map.va.addr = start,
4869 .map.va.range = range,
4870 };
4871
4872 lockdep_assert_held_write(&vm->lock);
4873
4874 vm_dbg(&vm->xe->drm, "MADVISE_OPS_CREATE: addr=0x%016llx, size=0x%016llx", start, range);
4875
4876 return xe_vm_alloc_vma(vm, &map_req, true);
4877 }
4878
is_cpu_addr_vma_with_default_attr(struct xe_vma * vma)4879 static bool is_cpu_addr_vma_with_default_attr(struct xe_vma *vma)
4880 {
4881 return vma && xe_vma_is_cpu_addr_mirror(vma) &&
4882 xe_vma_has_default_mem_attrs(vma);
4883 }
4884
4885 /**
4886 * xe_vm_find_cpu_addr_mirror_vma_range - Extend a VMA range to include adjacent CPU-mirrored VMAs
4887 * @vm: VM to search within
4888 * @start: Input/output pointer to the starting address of the range
4889 * @end: Input/output pointer to the end address of the range
4890 *
4891 * Given a range defined by @start and @range, this function checks the VMAs
4892 * immediately before and after the range. If those neighboring VMAs are
4893 * CPU-address-mirrored and have default memory attributes, the function
4894 * updates @start and @range to include them. This extended range can then
4895 * be used for merging or other operations that require a unified VMA.
4896 *
4897 * The function does not perform the merge itself; it only computes the
4898 * mergeable boundaries.
4899 */
xe_vm_find_cpu_addr_mirror_vma_range(struct xe_vm * vm,u64 * start,u64 * end)4900 void xe_vm_find_cpu_addr_mirror_vma_range(struct xe_vm *vm, u64 *start, u64 *end)
4901 {
4902 struct xe_vma *prev, *next;
4903
4904 lockdep_assert_held(&vm->lock);
4905
4906 if (*start >= SZ_4K) {
4907 prev = xe_vm_find_vma_by_addr(vm, *start - SZ_4K);
4908 if (is_cpu_addr_vma_with_default_attr(prev))
4909 *start = xe_vma_start(prev);
4910 }
4911
4912 if (*end < vm->size) {
4913 next = xe_vm_find_vma_by_addr(vm, *end + 1);
4914 if (is_cpu_addr_vma_with_default_attr(next))
4915 *end = xe_vma_end(next);
4916 }
4917 }
4918
4919 /**
4920 * xe_vm_alloc_cpu_addr_mirror_vma - Allocate CPU addr mirror vma
4921 * @vm: Pointer to the xe_vm structure
4922 * @start: Starting input address
4923 * @range: Size of the input range
4924 *
4925 * This function splits/merges existing vma to create new vma for user provided input range
4926 *
4927 * Return: 0 if success
4928 */
xe_vm_alloc_cpu_addr_mirror_vma(struct xe_vm * vm,uint64_t start,uint64_t range)4929 int xe_vm_alloc_cpu_addr_mirror_vma(struct xe_vm *vm, uint64_t start, uint64_t range)
4930 {
4931 struct drm_gpuvm_map_req map_req = {
4932 .map.va.addr = start,
4933 .map.va.range = range,
4934 };
4935
4936 lockdep_assert_held_write(&vm->lock);
4937
4938 vm_dbg(&vm->xe->drm, "CPU_ADDR_MIRROR_VMA_OPS_CREATE: addr=0x%016llx, size=0x%016llx",
4939 start, range);
4940
4941 return xe_vm_alloc_vma(vm, &map_req, false);
4942 }
4943
4944 /**
4945 * xe_vm_add_exec_queue() - Add exec queue to VM
4946 * @vm: The VM.
4947 * @q: The exec_queue
4948 *
4949 * Add exec queue to VM, skipped if the device does not have context based TLB
4950 * invalidations.
4951 */
xe_vm_add_exec_queue(struct xe_vm * vm,struct xe_exec_queue * q)4952 void xe_vm_add_exec_queue(struct xe_vm *vm, struct xe_exec_queue *q)
4953 {
4954 struct xe_device *xe = vm->xe;
4955
4956 /* User VMs and queues only */
4957 xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_KERNEL));
4958 xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_PERMANENT));
4959 xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_VM));
4960 xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_MIGRATE));
4961 xe_assert(xe, vm->xef);
4962 xe_assert(xe, vm == q->vm);
4963
4964 if (!xe->info.has_ctx_tlb_inval)
4965 return;
4966
4967 down_write(&vm->exec_queues.lock);
4968 list_add(&q->vm_exec_queue_link, &vm->exec_queues.list[q->gt->info.id]);
4969 ++vm->exec_queues.count[q->gt->info.id];
4970 up_write(&vm->exec_queues.lock);
4971 }
4972
4973 /**
4974 * xe_vm_remove_exec_queue() - Remove exec queue from VM
4975 * @vm: The VM.
4976 * @q: The exec_queue
4977 *
4978 * Remove exec queue from VM, skipped if the device does not have context based
4979 * TLB invalidations.
4980 */
xe_vm_remove_exec_queue(struct xe_vm * vm,struct xe_exec_queue * q)4981 void xe_vm_remove_exec_queue(struct xe_vm *vm, struct xe_exec_queue *q)
4982 {
4983 if (!vm->xe->info.has_ctx_tlb_inval)
4984 return;
4985
4986 down_write(&vm->exec_queues.lock);
4987 if (!list_empty(&q->vm_exec_queue_link)) {
4988 list_del(&q->vm_exec_queue_link);
4989 --vm->exec_queues.count[q->gt->info.id];
4990 }
4991 up_write(&vm->exec_queues.lock);
4992 }
4993