xref: /linux/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c (revision 3c1d77d7b81878ae4cb60fe81be4afa14e901c42)
1 /*
2  * Copyright 2008 Advanced Micro Devices, Inc.
3  * Copyright 2008 Red Hat Inc.
4  * Copyright 2009 Jerome Glisse.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the "Software"),
8  * to deal in the Software without restriction, including without limitation
9  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10  * and/or sell copies of the Software, and to permit persons to whom the
11  * Software is furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22  * OTHER DEALINGS IN THE SOFTWARE.
23  *
24  * Authors: Dave Airlie
25  *          Alex Deucher
26  *          Jerome Glisse
27  */
28 
29 #include <linux/dma-fence-array.h>
30 #include <linux/interval_tree_generic.h>
31 #include <linux/idr.h>
32 #include <linux/dma-buf.h>
33 
34 #include <drm/amdgpu_drm.h>
35 #include <drm/drm_drv.h>
36 #include <drm/drm_ioctl.h>
37 #include <drm/ttm/ttm_tt.h>
38 #include <drm/drm_exec.h>
39 #include "amdgpu.h"
40 #include "amdgpu_vm.h"
41 #include "amdgpu_vm_internal.h"
42 #include "amdgpu_trace.h"
43 #include "amdgpu_amdkfd.h"
44 #include "amdgpu_gmc.h"
45 #include "amdgpu_xgmi.h"
46 #include "amdgpu_dma_buf.h"
47 #include "amdgpu_res_cursor.h"
48 #include "kfd_svm.h"
49 
50 /**
51  * DOC: GPUVM
52  *
53  * GPUVM is the MMU functionality provided on the GPU.
54  * GPUVM is similar to the legacy GART on older asics, however
55  * rather than there being a single global GART table
56  * for the entire GPU, there can be multiple GPUVM page tables active
57  * at any given time.  The GPUVM page tables can contain a mix
58  * VRAM pages and system pages (both memory and MMIO) and system pages
59  * can be mapped as snooped (cached system pages) or unsnooped
60  * (uncached system pages).
61  *
62  * Each active GPUVM has an ID associated with it and there is a page table
63  * linked with each VMID.  When executing a command buffer,
64  * the kernel tells the engine what VMID to use for that command
65  * buffer.  VMIDs are allocated dynamically as commands are submitted.
66  * The userspace drivers maintain their own address space and the kernel
67  * sets up their pages tables accordingly when they submit their
68  * command buffers and a VMID is assigned.
69  * The hardware supports up to 16 active GPUVMs at any given time.
70  *
71  * Each GPUVM is represented by a 1-2 or 1-5 level page table, depending
72  * on the ASIC family.  GPUVM supports RWX attributes on each page as well
73  * as other features such as encryption and caching attributes.
74  *
75  * VMID 0 is special.  It is the GPUVM used for the kernel driver.  In
76  * addition to an aperture managed by a page table, VMID 0 also has
77  * several other apertures.  There is an aperture for direct access to VRAM
78  * and there is a legacy AGP aperture which just forwards accesses directly
79  * to the matching system physical addresses (or IOVAs when an IOMMU is
80  * present).  These apertures provide direct access to these memories without
81  * incurring the overhead of a page table.  VMID 0 is used by the kernel
82  * driver for tasks like memory management.
83  *
84  * GPU clients (i.e., engines on the GPU) use GPUVM VMIDs to access memory.
85  * For user applications, each application can have their own unique GPUVM
86  * address space.  The application manages the address space and the kernel
87  * driver manages the GPUVM page tables for each process.  If an GPU client
88  * accesses an invalid page, it will generate a GPU page fault, similar to
89  * accessing an invalid page on a CPU.
90  */
91 
92 #define START(node) ((node)->start)
93 #define LAST(node) ((node)->last)
94 
95 INTERVAL_TREE_DEFINE(struct amdgpu_bo_va_mapping, rb, uint64_t, __subtree_last,
96 		     START, LAST, static, amdgpu_vm_it)
97 
98 #undef START
99 #undef LAST
100 
101 /**
102  * struct amdgpu_prt_cb - Helper to disable partial resident texture feature from a fence callback
103  */
104 struct amdgpu_prt_cb {
105 
106 	/**
107 	 * @adev: amdgpu device
108 	 */
109 	struct amdgpu_device *adev;
110 
111 	/**
112 	 * @cb: callback
113 	 */
114 	struct dma_fence_cb cb;
115 };
116 
117 /**
118  * struct amdgpu_vm_tlb_seq_struct - Helper to increment the TLB flush sequence
119  */
120 struct amdgpu_vm_tlb_seq_struct {
121 	/**
122 	 * @vm: pointer to the amdgpu_vm structure to set the fence sequence on
123 	 */
124 	struct amdgpu_vm *vm;
125 
126 	/**
127 	 * @cb: callback
128 	 */
129 	struct dma_fence_cb cb;
130 };
131 
132 /**
133  * amdgpu_vm_assert_locked - check if VM is correctly locked
134  * @vm: the VM which schould be tested
135  *
136  * Asserts that the VM root PD is locked.
137  */
138 static void amdgpu_vm_assert_locked(struct amdgpu_vm *vm)
139 {
140 	dma_resv_assert_held(vm->root.bo->tbo.base.resv);
141 }
142 
143 /* Initialize the amdgpu_vm_bo_status object */
144 static void amdgpu_vm_bo_status_init(struct amdgpu_vm_bo_status *lists)
145 {
146 	INIT_LIST_HEAD(&lists->evicted);
147 	INIT_LIST_HEAD(&lists->needs_update);
148 	INIT_LIST_HEAD(&lists->idle);
149 }
150 
151 /*
152  * Make sure we have the lock to modify the vm_bo status and return the object
153  * with the status lists.
154  */
155 static struct amdgpu_vm_bo_status *
156 amdgpu_vm_bo_lock_lists(struct amdgpu_vm_bo_base *vm_bo)
157 {
158 	struct amdgpu_vm *vm = vm_bo->vm;
159 	struct amdgpu_bo *bo = vm_bo->bo;
160 
161 	if (amdgpu_vm_is_bo_always_valid(vm, bo)) {
162 		/* No extra locking needed, protected by the root PD resv lock */
163 		amdgpu_vm_assert_locked(vm);
164 
165 		if (bo->tbo.type == ttm_bo_type_kernel)
166 			return &vm->kernel;
167 
168 		return &vm->always_valid;
169 	}
170 
171 	spin_lock(&vm_bo->vm->individual_lock);
172 	return &vm->individual;
173 }
174 
175 /* Eventually unlock the status list lock again */
176 static void amdgpu_vm_bo_unlock_lists(struct amdgpu_vm_bo_base *vm_bo)
177 {
178 	if (amdgpu_vm_is_bo_always_valid(vm_bo->vm, vm_bo->bo))
179 		amdgpu_vm_assert_locked(vm_bo->vm);
180 	else
181 		spin_unlock(&vm_bo->vm->individual_lock);
182 }
183 
184 /**
185  * amdgpu_vm_is_bo_always_valid - check if the BO is VM always valid
186  *
187  * @vm: VM to test against.
188  * @bo: BO to be tested.
189  *
190  * Returns true if the BO shares the dma_resv object with the root PD and is
191  * always guaranteed to be valid inside the VM.
192  */
193 bool amdgpu_vm_is_bo_always_valid(struct amdgpu_vm *vm, struct amdgpu_bo *bo)
194 {
195 	return bo && bo->tbo.base.resv == vm->root.bo->tbo.base.resv;
196 }
197 
198 /**
199  * amdgpu_vm_bo_evicted - vm_bo is evicted
200  *
201  * @vm_bo: vm_bo which is evicted
202  *
203  * State for vm_bo objects meaning the underlying BO was evicted and need to
204  * move in place again.
205  */
206 static void amdgpu_vm_bo_evicted(struct amdgpu_vm_bo_base *vm_bo)
207 {
208 	struct amdgpu_vm_bo_status *lists;
209 
210 	lists = amdgpu_vm_bo_lock_lists(vm_bo);
211 	vm_bo->moved = true;
212 	list_move(&vm_bo->vm_status, &lists->evicted);
213 	amdgpu_vm_bo_unlock_lists(vm_bo);
214 }
215 /**
216  * amdgpu_vm_bo_needs_update - vm_bo needs pagetable update
217  *
218  * @vm_bo: vm_bo which is out of date
219  *
220  * State for vm_bo objects meaning the underlying BO had mapping changes (move, PRT bind/unbind)
221  * but the new location is not yet reflected in the page tables.
222  */
223 static void amdgpu_vm_bo_needs_update(struct amdgpu_vm_bo_base *vm_bo)
224 {
225 	struct amdgpu_vm_bo_status *lists;
226 	struct amdgpu_bo *bo = vm_bo->bo;
227 
228 	/*
229 	 * The root PD doesn't have a parent PDE and goes directly into the
230 	 * idle state.
231 	 */
232 	lists = amdgpu_vm_bo_lock_lists(vm_bo);
233 	if (bo && bo->tbo.type == ttm_bo_type_kernel && !bo->parent) {
234 		vm_bo->moved = false;
235 		list_move(&vm_bo->vm_status, &lists->idle);
236 	} else {
237 		list_move(&vm_bo->vm_status, &lists->needs_update);
238 	}
239 	amdgpu_vm_bo_unlock_lists(vm_bo);
240 }
241 
242 /**
243  * amdgpu_vm_bo_idle - vm_bo is idle
244  *
245  * @vm_bo: vm_bo which is now idle
246  *
247  * State for vm_bo objects meaning we are done with the state machine and no
248  * further action is necessary.
249  */
250 static void amdgpu_vm_bo_idle(struct amdgpu_vm_bo_base *vm_bo)
251 {
252 	struct amdgpu_vm_bo_status *lists;
253 
254 	lists = amdgpu_vm_bo_lock_lists(vm_bo);
255 	if (!amdgpu_vm_is_bo_always_valid(vm_bo->vm, vm_bo->bo))
256 		vm_bo->moved = false;
257 	list_move(&vm_bo->vm_status, &lists->idle);
258 	amdgpu_vm_bo_unlock_lists(vm_bo);
259 }
260 
261 /**
262  * amdgpu_vm_bo_reset_state_machine - reset the vm_bo state machine
263  * @vm: the VM which state machine to reset
264  *
265  * Move all vm_bo object in the VM into a state where their location will be
266  * updated in the page tables again.
267  */
268 static void amdgpu_vm_bo_reset_state_machine(struct amdgpu_vm *vm)
269 {
270 	struct amdgpu_vm_bo_base *vm_bo, *tmp;
271 
272 	/*
273 	 * Don't use list splice here, we need the special handling for the root
274 	 * PD and set the moved flag appropriately.
275 	 */
276 	amdgpu_vm_assert_locked(vm);
277 	list_for_each_entry_safe(vm_bo, tmp, &vm->kernel.idle, vm_status)
278 		amdgpu_vm_bo_needs_update(vm_bo);
279 	list_for_each_entry_safe(vm_bo, tmp, &vm->always_valid.idle, vm_status)
280 		amdgpu_vm_bo_needs_update(vm_bo);
281 
282 	spin_lock(&vm->individual_lock);
283 	list_for_each_entry_safe(vm_bo, tmp, &vm->individual.idle, vm_status) {
284 		vm_bo->moved = true;
285 		list_move(&vm_bo->vm_status, &vm->individual.needs_update);
286 	}
287 	spin_unlock(&vm->individual_lock);
288 }
289 
290 /**
291  * amdgpu_vm_update_shared - helper to update shared memory stat
292  * @base: base structure for tracking BO usage in a VM
293  *
294  * Takes the vm stats_lock and updates the shared memory stat. If the basic
295  * stat changed (e.g. buffer was moved) amdgpu_vm_update_stats need to be called
296  * as well.
297  */
298 static void amdgpu_vm_update_shared(struct amdgpu_vm_bo_base *base)
299 {
300 	struct amdgpu_vm *vm = base->vm;
301 	struct amdgpu_bo *bo = base->bo;
302 	uint64_t size = amdgpu_bo_size(bo);
303 	uint32_t bo_memtype = amdgpu_bo_mem_stats_placement(bo);
304 	bool shared;
305 
306 	dma_resv_assert_held(bo->tbo.base.resv);
307 	spin_lock(&vm->stats_lock);
308 	shared = drm_gem_object_is_shared_for_memory_stats(&bo->tbo.base);
309 	if (base->shared != shared) {
310 		base->shared = shared;
311 		if (shared) {
312 			vm->stats[bo_memtype].drm.shared += size;
313 			vm->stats[bo_memtype].drm.private -= size;
314 		} else {
315 			vm->stats[bo_memtype].drm.shared -= size;
316 			vm->stats[bo_memtype].drm.private += size;
317 		}
318 	}
319 	spin_unlock(&vm->stats_lock);
320 }
321 
322 /**
323  * amdgpu_vm_bo_update_shared - callback when bo gets shared/unshared
324  * @bo: amdgpu buffer object
325  *
326  * Update the per VM stats for all the vm if needed from private to shared or
327  * vice versa.
328  */
329 void amdgpu_vm_bo_update_shared(struct amdgpu_bo *bo)
330 {
331 	struct amdgpu_vm_bo_base *base;
332 
333 	for (base = bo->vm_bo; base; base = base->next)
334 		amdgpu_vm_update_shared(base);
335 }
336 
337 /**
338  * amdgpu_vm_update_stats_locked - helper to update normal memory stat
339  * @base: base structure for tracking BO usage in a VM
340  * @res:  the ttm_resource to use for the purpose of accounting, may or may not
341  *        be bo->tbo.resource
342  * @sign: if we should add (+1) or subtract (-1) from the stat
343  *
344  * Caller need to have the vm stats_lock held. Useful for when multiple update
345  * need to happen at the same time.
346  */
347 static void amdgpu_vm_update_stats_locked(struct amdgpu_vm_bo_base *base,
348 					  struct ttm_resource *res, int sign)
349 {
350 	struct amdgpu_vm *vm = base->vm;
351 	struct amdgpu_bo *bo = base->bo;
352 	int64_t size = sign * amdgpu_bo_size(bo);
353 	uint32_t bo_memtype = amdgpu_bo_mem_stats_placement(bo);
354 
355 	/* For drm-total- and drm-shared-, BO are accounted by their preferred
356 	 * placement, see also amdgpu_bo_mem_stats_placement.
357 	 */
358 	if (base->shared)
359 		vm->stats[bo_memtype].drm.shared += size;
360 	else
361 		vm->stats[bo_memtype].drm.private += size;
362 
363 	if (res && res->mem_type < __AMDGPU_PL_NUM) {
364 		uint32_t res_memtype = res->mem_type;
365 
366 		vm->stats[res_memtype].drm.resident += size;
367 		/* BO only count as purgeable if it is resident,
368 		 * since otherwise there's nothing to purge.
369 		 */
370 		if (bo->flags & AMDGPU_GEM_CREATE_DISCARDABLE)
371 			vm->stats[res_memtype].drm.purgeable += size;
372 		if (!(bo->preferred_domains &
373 		      amdgpu_mem_type_to_domain(res_memtype)))
374 			vm->stats[bo_memtype].evicted += size;
375 	}
376 }
377 
378 /**
379  * amdgpu_vm_update_stats - helper to update normal memory stat
380  * @base: base structure for tracking BO usage in a VM
381  * @res:  the ttm_resource to use for the purpose of accounting, may or may not
382  *        be bo->tbo.resource
383  * @sign: if we should add (+1) or subtract (-1) from the stat
384  *
385  * Updates the basic memory stat when bo is added/deleted/moved.
386  */
387 void amdgpu_vm_update_stats(struct amdgpu_vm_bo_base *base,
388 			    struct ttm_resource *res, int sign)
389 {
390 	struct amdgpu_vm *vm = base->vm;
391 
392 	spin_lock(&vm->stats_lock);
393 	amdgpu_vm_update_stats_locked(base, res, sign);
394 	spin_unlock(&vm->stats_lock);
395 }
396 
397 /**
398  * amdgpu_vm_bo_base_init - Adds bo to the list of bos associated with the vm
399  *
400  * @base: base structure for tracking BO usage in a VM
401  * @vm: vm to which bo is to be added
402  * @bo: amdgpu buffer object
403  *
404  * Initialize a bo_va_base structure and add it to the appropriate lists
405  *
406  */
407 void amdgpu_vm_bo_base_init(struct amdgpu_vm_bo_base *base,
408 			    struct amdgpu_vm *vm, struct amdgpu_bo *bo)
409 {
410 	base->vm = vm;
411 	base->bo = bo;
412 	base->next = NULL;
413 	INIT_LIST_HEAD(&base->vm_status);
414 
415 	dma_resv_assert_held(vm->root.bo->tbo.base.resv);
416 	if (!bo)
417 		return;
418 
419 	base->next = bo->vm_bo;
420 	bo->vm_bo = base;
421 
422 	spin_lock(&vm->stats_lock);
423 	base->shared = drm_gem_object_is_shared_for_memory_stats(&bo->tbo.base);
424 	amdgpu_vm_update_stats_locked(base, bo->tbo.resource, +1);
425 	spin_unlock(&vm->stats_lock);
426 
427 	if (!amdgpu_vm_is_bo_always_valid(vm, bo)) {
428 		amdgpu_vm_bo_idle(base);
429 		return;
430 	}
431 
432 	ttm_bo_set_bulk_move(&bo->tbo, &vm->lru_bulk_move);
433 
434 	/*
435 	 * When a per VM isn't in the desired domain put it into the evicted
436 	 * state to make sure that it gets validated on the next best occasion.
437 	 */
438 	if (bo->preferred_domains &
439 	    amdgpu_mem_type_to_domain(bo->tbo.resource->mem_type))
440 		amdgpu_vm_bo_needs_update(base);
441 	else
442 		amdgpu_vm_bo_evicted(base);
443 }
444 
445 /**
446  * amdgpu_vm_lock_pd - lock PD in drm_exec
447  *
448  * @vm: vm providing the BOs
449  * @exec: drm execution context
450  * @num_fences: number of extra fences to reserve
451  *
452  * Lock the VM root PD in the DRM execution context.
453  */
454 int amdgpu_vm_lock_pd(struct amdgpu_vm *vm, struct drm_exec *exec,
455 		      unsigned int num_fences)
456 {
457 	/* We need at least two fences for the VM PD/PT updates */
458 	return drm_exec_prepare_obj(exec, &vm->root.bo->tbo.base,
459 				    2 + num_fences);
460 }
461 
462 /**
463  * amdgpu_vm_lock_individual - lock all BOs on the individual idle list
464  * @vm: vm providing the BOs
465  * @exec: drm execution context
466  * @num_fences: number of extra fences to reserve
467  *
468  * Lock the BOs on the individual idle list in the DRM execution context.
469  */
470 int amdgpu_vm_lock_individual(struct amdgpu_vm *vm, struct drm_exec *exec,
471 			      unsigned int num_fences)
472 {
473 	struct list_head *prev = &vm->individual.idle;
474 	struct amdgpu_bo_va *bo_va;
475 	struct amdgpu_bo *bo;
476 	int ret;
477 
478 	/* We can only trust prev->next while holding the lock */
479 	spin_lock(&vm->individual_lock);
480 	while (!list_is_head(prev->next, &vm->individual.idle)) {
481 		bo_va = list_entry(prev->next, typeof(*bo_va), base.vm_status);
482 
483 		bo = bo_va->base.bo;
484 		if (bo) {
485 			amdgpu_bo_ref(bo);
486 			spin_unlock(&vm->individual_lock);
487 
488 			ret = drm_exec_prepare_obj(exec, &bo->tbo.base, num_fences);
489 			amdgpu_bo_unref(&bo);
490 			if (unlikely(ret))
491 				return ret;
492 
493 			spin_lock(&vm->individual_lock);
494 		}
495 		prev = prev->next;
496 	}
497 	spin_unlock(&vm->individual_lock);
498 
499 	return 0;
500 }
501 
502 /**
503  * amdgpu_vm_move_to_lru_tail - move all BOs to the end of LRU
504  *
505  * @adev: amdgpu device pointer
506  * @vm: vm providing the BOs
507  *
508  * Move all BOs to the end of LRU and remember their positions to put them
509  * together.
510  */
511 void amdgpu_vm_move_to_lru_tail(struct amdgpu_device *adev,
512 				struct amdgpu_vm *vm)
513 {
514 	spin_lock(&adev->mman.bdev.lru_lock);
515 	ttm_lru_bulk_move_tail(&vm->lru_bulk_move);
516 	spin_unlock(&adev->mman.bdev.lru_lock);
517 }
518 
519 /* Create scheduler entities for page table updates */
520 static int amdgpu_vm_init_entities(struct amdgpu_device *adev,
521 				   struct amdgpu_vm *vm)
522 {
523 	int r;
524 
525 	r = drm_sched_entity_init(&vm->immediate, DRM_SCHED_PRIORITY_NORMAL,
526 				  adev->vm_manager.vm_pte_scheds,
527 				  adev->vm_manager.vm_pte_num_scheds, NULL);
528 	if (r)
529 		goto error;
530 
531 	return drm_sched_entity_init(&vm->delayed, DRM_SCHED_PRIORITY_NORMAL,
532 				     adev->vm_manager.vm_pte_scheds,
533 				     adev->vm_manager.vm_pte_num_scheds, NULL);
534 
535 error:
536 	drm_sched_entity_destroy(&vm->immediate);
537 	return r;
538 }
539 
540 /* Destroy the entities for page table updates again */
541 static void amdgpu_vm_fini_entities(struct amdgpu_vm *vm)
542 {
543 	drm_sched_entity_destroy(&vm->immediate);
544 	drm_sched_entity_destroy(&vm->delayed);
545 }
546 
547 /**
548  * amdgpu_vm_generation - return the page table re-generation counter
549  * @adev: the amdgpu_device
550  * @vm: optional VM to check, might be NULL
551  *
552  * Returns a page table re-generation token to allow checking if submissions
553  * are still valid to use this VM. The VM parameter might be NULL in which case
554  * just the VRAM lost counter will be used.
555  */
556 uint64_t amdgpu_vm_generation(struct amdgpu_device *adev, struct amdgpu_vm *vm)
557 {
558 	uint64_t result = (u64)atomic_read(&adev->vram_lost_counter) << 32;
559 
560 	if (!vm)
561 		return result;
562 
563 	result += lower_32_bits(vm->generation);
564 	/* Add one if the page tables will be re-generated on next CS */
565 	if (drm_sched_entity_error(&vm->delayed))
566 		++result;
567 
568 	return result;
569 }
570 
571 /**
572  * amdgpu_vm_validate - validate evicted BOs tracked in the VM
573  *
574  * @adev: amdgpu device pointer
575  * @vm: vm providing the BOs
576  * @ticket: optional reservation ticket used to reserve the VM
577  * @validate: callback to do the validation
578  * @param: parameter for the validation callback
579  *
580  * Validate the page table BOs and per-VM BOs on command submission if
581  * necessary. If a ticket is given, also try to validate evicted user queue
582  * BOs. They must already be reserved with the given ticket.
583  *
584  * Returns:
585  * Validation result.
586  */
587 int amdgpu_vm_validate(struct amdgpu_device *adev, struct amdgpu_vm *vm,
588 		       struct ww_acquire_ctx *ticket,
589 		       int (*validate)(void *p, struct amdgpu_bo *bo),
590 		       void *param)
591 {
592 	uint64_t new_vm_generation = amdgpu_vm_generation(adev, vm);
593 	struct amdgpu_vm_bo_base *bo_base, *tmp;
594 	int r;
595 
596 	dma_resv_assert_held(vm->root.bo->tbo.base.resv);
597 	if (vm->generation != new_vm_generation) {
598 		vm->generation = new_vm_generation;
599 		amdgpu_vm_bo_reset_state_machine(vm);
600 		amdgpu_vm_fini_entities(vm);
601 		r = amdgpu_vm_init_entities(adev, vm);
602 		if (r)
603 			return r;
604 	}
605 
606 	list_for_each_entry_safe(bo_base, tmp, &vm->kernel.evicted, vm_status) {
607 		r = validate(param, bo_base->bo);
608 		if (r)
609 			return r;
610 
611 		vm->update_funcs->map_table(to_amdgpu_bo_vm(bo_base->bo));
612 		bo_base->moved = true;
613 		amdgpu_vm_bo_needs_update(bo_base);
614 	}
615 
616 	/*
617 	 * As soon as all page tables are in place we can start updating them
618 	 * again.
619 	 */
620 	scoped_guard(mutex, &vm->eviction_lock)
621 		vm->evicting = false;
622 
623 	list_for_each_entry_safe(bo_base, tmp, &vm->always_valid.evicted,
624 				 vm_status) {
625 		r = validate(param, bo_base->bo);
626 		if (r)
627 			return r;
628 
629 		bo_base->moved = true;
630 		amdgpu_vm_bo_needs_update(bo_base);
631 	}
632 
633 	if (!ticket)
634 		return 0;
635 
636 	spin_lock(&vm->individual_lock);
637 restart:
638 	list_for_each_entry(bo_base, &vm->individual.evicted, vm_status) {
639 		struct amdgpu_bo *bo = bo_base->bo;
640 
641 		if (dma_resv_locking_ctx(bo->tbo.base.resv) != ticket)
642 			continue;
643 
644 		spin_unlock(&vm->individual_lock);
645 
646 		r = validate(param, bo);
647 		if (r)
648 			return r;
649 
650 		bo_base->moved = true;
651 		amdgpu_vm_bo_needs_update(bo_base);
652 
653 		/* It's a bit inefficient to always jump back to the start, but
654 		 * we would need to re-structure the KFD for properly fixing
655 		 * that.
656 		 */
657 		spin_lock(&vm->individual_lock);
658 		goto restart;
659 	}
660 	spin_unlock(&vm->individual_lock);
661 
662 	return 0;
663 }
664 
665 /**
666  * amdgpu_vm_ready - check VM is ready for updates
667  *
668  * @vm: VM to check
669  *
670  * Check if all VM PDs/PTs are ready for updates
671  *
672  * Returns:
673  * True if VM is not evicting and all VM entities are not stopped
674  */
675 bool amdgpu_vm_ready(struct amdgpu_vm *vm)
676 {
677 	bool ret;
678 
679 	amdgpu_vm_assert_locked(vm);
680 
681 	scoped_guard(mutex, &vm->eviction_lock)
682 		ret = !vm->evicting;
683 
684 	ret &= list_empty(&vm->kernel.evicted);
685 
686 	spin_lock(&vm->immediate.lock);
687 	ret &= !vm->immediate.stopped;
688 	spin_unlock(&vm->immediate.lock);
689 
690 	spin_lock(&vm->delayed.lock);
691 	ret &= !vm->delayed.stopped;
692 	spin_unlock(&vm->delayed.lock);
693 
694 	return ret;
695 }
696 
697 /**
698  * amdgpu_vm_check_compute_bug - check whether asic has compute vm bug
699  *
700  * @adev: amdgpu_device pointer
701  */
702 void amdgpu_vm_check_compute_bug(struct amdgpu_device *adev)
703 {
704 	const struct amdgpu_ip_block *ip_block;
705 	bool has_compute_vm_bug;
706 	struct amdgpu_ring *ring;
707 	int i;
708 
709 	has_compute_vm_bug = false;
710 
711 	ip_block = amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_GFX);
712 	if (ip_block) {
713 		/* Compute has a VM bug for GFX version < 7.
714 		   Compute has a VM bug for GFX 8 MEC firmware version < 673.*/
715 		if (ip_block->version->major <= 7)
716 			has_compute_vm_bug = true;
717 		else if (ip_block->version->major == 8)
718 			if (adev->gfx.mec_fw_version < 673)
719 				has_compute_vm_bug = true;
720 	}
721 
722 	for (i = 0; i < adev->num_rings; i++) {
723 		ring = adev->rings[i];
724 		if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE)
725 			/* only compute rings */
726 			ring->has_compute_vm_bug = has_compute_vm_bug;
727 		else
728 			ring->has_compute_vm_bug = false;
729 	}
730 }
731 
732 /**
733  * amdgpu_vm_need_pipeline_sync - Check if pipe sync is needed for job.
734  *
735  * @ring: ring on which the job will be submitted
736  * @job: job to submit
737  *
738  * Returns:
739  * True if sync is needed.
740  */
741 bool amdgpu_vm_need_pipeline_sync(struct amdgpu_ring *ring,
742 				  struct amdgpu_job *job)
743 {
744 	struct amdgpu_device *adev = ring->adev;
745 	unsigned vmhub = ring->vm_hub;
746 	struct amdgpu_kq_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
747 
748 	if (job->vmid == 0)
749 		return false;
750 
751 	if (job->vm_needs_flush || ring->has_compute_vm_bug)
752 		return true;
753 
754 	if (ring->funcs->emit_gds_switch && job->gds_switch_needed)
755 		return true;
756 
757 	if (amdgpu_vmid_had_gpu_reset(adev, &id_mgr->ids[job->vmid]))
758 		return true;
759 
760 	return false;
761 }
762 
763 /**
764  * amdgpu_vm_flush - hardware flush the vm
765  *
766  * @ring: ring to use for flush
767  * @job:  related job
768  * @need_pipe_sync: is pipe sync needed
769  * @emit_spm_needed: does the caller need to emit spm
770  * @emit_gds_needed: does the caller need to emit gds
771  *
772  * Emit a VM flush when it is necessary.
773  */
774 void amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job,
775 		     bool *need_pipe_sync, bool *emit_spm_needed,
776 		     bool *emit_gds_needed)
777 {
778 	struct amdgpu_device *adev = ring->adev;
779 	struct amdgpu_isolation *isolation =
780 		&adev->isolation[ring->xcp_id == AMDGPU_XCP_NO_PARTITION ?
781 				 0 : ring->xcp_id];
782 	unsigned vmhub = ring->vm_hub;
783 	struct amdgpu_kq_vmid_mgr *id_mgr = &adev->vm_manager.id_mgr[vmhub];
784 	struct amdgpu_vmid *id = &id_mgr->ids[job->vmid];
785 	bool spm_update_needed = adev->gfx.rlc.funcs->update_spm_vmid &&
786 		job->spm_update_needed;
787 	bool gds_switch_needed = ring->funcs->emit_gds_switch &&
788 		job->gds_switch_needed;
789 	bool vm_flush_needed = job->vm_needs_flush;
790 	bool cleaner_shader_needed = false;
791 	bool pasid_mapping_needed = false;
792 	struct dma_fence *fence = NULL;
793 	unsigned int patch = 0;
794 	bool emit_fence;
795 
796 	if (amdgpu_vmid_had_gpu_reset(adev, id)) {
797 		gds_switch_needed = true;
798 		vm_flush_needed = true;
799 		pasid_mapping_needed = true;
800 		spm_update_needed = true;
801 	}
802 
803 	mutex_lock(&id_mgr->lock);
804 	if (id->pasid != job->pasid || !id->pasid_mapping ||
805 	    !dma_fence_is_signaled(id->pasid_mapping))
806 		pasid_mapping_needed = true;
807 	mutex_unlock(&id_mgr->lock);
808 
809 	gds_switch_needed &= !!ring->funcs->emit_gds_switch;
810 	spm_update_needed &= !!adev->gfx.rlc.funcs->update_spm_vmid;
811 	vm_flush_needed &= !!ring->funcs->emit_vm_flush  &&
812 			job->vm_pd_addr != AMDGPU_BO_INVALID_OFFSET;
813 	pasid_mapping_needed &= adev->gmc.gmc_funcs->emit_pasid_mapping &&
814 		ring->funcs->emit_wreg;
815 
816 	cleaner_shader_needed = job->run_cleaner_shader &&
817 		adev->gfx.enable_cleaner_shader &&
818 		ring->funcs->emit_cleaner_shader && job->base.s_fence &&
819 		&job->base.s_fence->scheduled == isolation->spearhead;
820 
821 	emit_fence = vm_flush_needed || pasid_mapping_needed ||
822 		cleaner_shader_needed;
823 
824 	*emit_spm_needed = spm_update_needed;
825 	if (spm_update_needed && emit_fence)
826 		*emit_spm_needed = false;
827 
828 	*emit_gds_needed = gds_switch_needed;
829 	if (gds_switch_needed && emit_fence)
830 		*emit_gds_needed = false;
831 
832 	if (!emit_fence)
833 		return;
834 
835 	amdgpu_ring_ib_begin(ring);
836 
837 	/* There is no matching insert_end for this on purpose for the vm flush.
838 	 * The IB portion of the submission has both.  Having multiple
839 	 * insert_start sequences is ok, but you can only have one insert_end
840 	 * per submission based on the way VCN FW works.  For JPEG
841 	 * you can as many insert_start and insert_end sequences as you like as
842 	 * long as the rest of the packets come between start and end sequences.
843 	 */
844 	if (ring->funcs->insert_start)
845 		ring->funcs->insert_start(ring);
846 
847 	if (ring->funcs->init_cond_exec)
848 		patch = amdgpu_ring_init_cond_exec(ring,
849 						   ring->cond_exe_gpu_addr);
850 
851 	if (*need_pipe_sync) {
852 		amdgpu_ring_emit_pipeline_sync(ring);
853 		*need_pipe_sync = false;
854 	}
855 
856 	if (cleaner_shader_needed)
857 		ring->funcs->emit_cleaner_shader(ring);
858 
859 	if (vm_flush_needed) {
860 		trace_amdgpu_vm_flush(ring, job->vmid, job->vm_pd_addr);
861 		amdgpu_ring_emit_vm_flush(ring, job->vmid, job->vm_pd_addr);
862 	}
863 
864 	if (pasid_mapping_needed)
865 		amdgpu_gmc_emit_pasid_mapping(ring, job->vmid, job->pasid);
866 
867 	if (spm_update_needed)
868 		adev->gfx.rlc.funcs->update_spm_vmid(adev, ring->xcc_id, ring, job->vmid);
869 
870 	if (gds_switch_needed)
871 		amdgpu_ring_emit_gds_switch(ring, job->vmid, job->gds_base,
872 						    job->gds_size, job->gws_base,
873 						    job->gws_size, job->oa_base,
874 						    job->oa_size);
875 
876 	amdgpu_fence_emit(ring, job->hw_vm_fence, 0);
877 	fence = &job->hw_vm_fence->base;
878 	/* get a ref for the job */
879 	dma_fence_get(fence);
880 
881 	if (vm_flush_needed) {
882 		mutex_lock(&id_mgr->lock);
883 		dma_fence_put(id->last_flush);
884 		id->last_flush = dma_fence_get(fence);
885 		id->current_gpu_reset_count =
886 			atomic_read(&adev->gpu_reset_counter);
887 		mutex_unlock(&id_mgr->lock);
888 	}
889 
890 	if (pasid_mapping_needed) {
891 		mutex_lock(&id_mgr->lock);
892 		id->pasid = job->pasid;
893 		dma_fence_put(id->pasid_mapping);
894 		id->pasid_mapping = dma_fence_get(fence);
895 		mutex_unlock(&id_mgr->lock);
896 	}
897 
898 	/*
899 	 * Make sure that all other submissions wait for the cleaner shader to
900 	 * finish before we push them to the HW.
901 	 */
902 	if (cleaner_shader_needed) {
903 		trace_amdgpu_cleaner_shader(ring, fence);
904 		mutex_lock(&adev->enforce_isolation_mutex);
905 		dma_fence_put(isolation->spearhead);
906 		isolation->spearhead = dma_fence_get(fence);
907 		mutex_unlock(&adev->enforce_isolation_mutex);
908 	}
909 	dma_fence_put(fence);
910 
911 	amdgpu_ring_patch_cond_exec(ring, patch);
912 
913 	/*
914 	 * Sync CE with ME to prevent CE from fetching the next CE IB
915 	 * before the context switch is done. This is emitted before
916 	 * the first IB of a job submission after a context switch.
917 	 * The double SWITCH_BUFFER here *cannot* be skipped by COND_EXEC.
918 	 */
919 	if (ring->funcs->emit_switch_buffer) {
920 		amdgpu_ring_emit_switch_buffer(ring);
921 		amdgpu_ring_emit_switch_buffer(ring);
922 	}
923 
924 	amdgpu_ring_ib_end(ring);
925 }
926 
927 /**
928  * amdgpu_vm_bo_find - find the bo_va for a specific vm & bo
929  *
930  * @vm: requested vm
931  * @bo: requested buffer object
932  *
933  * Find @bo inside the requested vm.
934  * Search inside the @bos vm list for the requested vm
935  * Returns the found bo_va or NULL if none is found
936  *
937  * Object has to be reserved!
938  *
939  * Returns:
940  * Found bo_va or NULL.
941  */
942 struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm,
943 				       struct amdgpu_bo *bo)
944 {
945 	struct amdgpu_vm_bo_base *base;
946 
947 	for (base = bo->vm_bo; base; base = base->next) {
948 		if (base->vm != vm)
949 			continue;
950 
951 		return container_of(base, struct amdgpu_bo_va, base);
952 	}
953 	return NULL;
954 }
955 
956 /**
957  * amdgpu_vm_map_gart - Resolve gart mapping of addr
958  *
959  * @pages_addr: optional DMA address to use for lookup
960  * @addr: the unmapped addr
961  *
962  * Look up the physical address of the page that the pte resolves
963  * to.
964  *
965  * Returns:
966  * The pointer for the page table entry.
967  */
968 uint64_t amdgpu_vm_map_gart(const dma_addr_t *pages_addr, uint64_t addr)
969 {
970 	uint64_t result;
971 
972 	/* page table offset */
973 	result = pages_addr[addr >> PAGE_SHIFT];
974 
975 	/* in case cpu page size != gpu page size*/
976 	result |= addr & (~PAGE_MASK);
977 
978 	result &= 0xFFFFFFFFFFFFF000ULL;
979 
980 	return result;
981 }
982 
983 /**
984  * amdgpu_vm_update_pdes - make sure that all directories are valid
985  *
986  * @adev: amdgpu_device pointer
987  * @vm: requested vm
988  * @immediate: submit immediately to the paging queue
989  *
990  * Makes sure all directories are up to date.
991  *
992  * Returns:
993  * 0 for success, error for failure.
994  */
995 int amdgpu_vm_update_pdes(struct amdgpu_device *adev,
996 			  struct amdgpu_vm *vm, bool immediate)
997 {
998 	struct amdgpu_vm_update_params params;
999 	struct amdgpu_vm_bo_base *entry, *tmp;
1000 	bool flush_tlb_needed = false;
1001 	int r, idx;
1002 
1003 	amdgpu_vm_assert_locked(vm);
1004 
1005 	if (list_empty(&vm->kernel.needs_update))
1006 		return 0;
1007 
1008 	if (!drm_dev_enter(adev_to_drm(adev), &idx))
1009 		return -ENODEV;
1010 
1011 	memset(&params, 0, sizeof(params));
1012 	params.adev = adev;
1013 	params.vm = vm;
1014 	params.immediate = immediate;
1015 
1016 	r = vm->update_funcs->prepare(&params, NULL,
1017 				      AMDGPU_KERNEL_JOB_ID_VM_UPDATE_PDES);
1018 	if (r)
1019 		goto error;
1020 
1021 	list_for_each_entry(entry, &vm->kernel.needs_update, vm_status) {
1022 		/* vm_flush_needed after updating moved PDEs */
1023 		flush_tlb_needed |= entry->moved;
1024 
1025 		r = amdgpu_vm_pde_update(&params, entry);
1026 		if (r)
1027 			goto error;
1028 	}
1029 
1030 	r = vm->update_funcs->commit(&params, &vm->last_update);
1031 	if (r)
1032 		goto error;
1033 
1034 	if (flush_tlb_needed)
1035 		atomic64_inc(&vm->tlb_seq);
1036 
1037 	list_for_each_entry_safe(entry, tmp, &vm->kernel.needs_update,
1038 				 vm_status)
1039 		amdgpu_vm_bo_idle(entry);
1040 
1041 error:
1042 	drm_dev_exit(idx);
1043 	return r;
1044 }
1045 
1046 /**
1047  * amdgpu_vm_tlb_seq_cb - make sure to increment tlb sequence
1048  * @fence: unused
1049  * @cb: the callback structure
1050  *
1051  * Increments the tlb sequence to make sure that future CS execute a VM flush.
1052  */
1053 static void amdgpu_vm_tlb_seq_cb(struct dma_fence *fence,
1054 				 struct dma_fence_cb *cb)
1055 {
1056 	struct amdgpu_vm_tlb_seq_struct *tlb_cb;
1057 
1058 	tlb_cb = container_of(cb, typeof(*tlb_cb), cb);
1059 	atomic64_inc(&tlb_cb->vm->tlb_seq);
1060 	kfree(tlb_cb);
1061 }
1062 
1063 /**
1064  * amdgpu_vm_tlb_flush - prepare TLB flush
1065  *
1066  * @params: parameters for update
1067  * @fence: input fence to sync TLB flush with
1068  * @tlb_cb: the callback structure
1069  *
1070  * Increments the tlb sequence to make sure that future CS execute a VM flush.
1071  */
1072 static void
1073 amdgpu_vm_tlb_flush(struct amdgpu_vm_update_params *params,
1074 		    struct dma_fence **fence,
1075 		    struct amdgpu_vm_tlb_seq_struct *tlb_cb)
1076 {
1077 	struct amdgpu_vm *vm = params->vm;
1078 
1079 	tlb_cb->vm = vm;
1080 	if (!fence || !*fence) {
1081 		amdgpu_vm_tlb_seq_cb(NULL, &tlb_cb->cb);
1082 		return;
1083 	}
1084 
1085 	if (!dma_fence_add_callback(*fence, &tlb_cb->cb,
1086 				    amdgpu_vm_tlb_seq_cb)) {
1087 		dma_fence_put(vm->last_tlb_flush);
1088 		vm->last_tlb_flush = dma_fence_get(*fence);
1089 	} else {
1090 		amdgpu_vm_tlb_seq_cb(NULL, &tlb_cb->cb);
1091 	}
1092 
1093 	/* Prepare a TLB flush fence to be attached to PTs */
1094 	/* The check for need_tlb_fence should be dropped once we
1095 	 * sort out the issues with KIQ/MES TLB invalidation timeouts.
1096 	 */
1097 	if (!params->unlocked && vm->need_tlb_fence) {
1098 		amdgpu_vm_tlb_fence_create(params->adev, vm, fence);
1099 
1100 		/* Makes sure no PD/PT is freed before the flush */
1101 		dma_resv_add_fence(vm->root.bo->tbo.base.resv, *fence,
1102 				   DMA_RESV_USAGE_BOOKKEEP);
1103 	}
1104 }
1105 
1106 /**
1107  * amdgpu_vm_update_range - update a range in the vm page table
1108  *
1109  * @adev: amdgpu_device pointer to use for commands
1110  * @vm: the VM to update the range
1111  * @immediate: immediate submission in a page fault
1112  * @unlocked: unlocked invalidation during MM callback
1113  * @flush_tlb: trigger tlb invalidation after update completed
1114  * @allow_override: change MTYPE for local NUMA nodes
1115  * @sync: fences we need to sync to
1116  * @start: start of mapped range
1117  * @last: last mapped entry
1118  * @flags: flags for the entries
1119  * @offset: offset into nodes and pages_addr
1120  * @vram_base: base for vram mappings
1121  * @res: ttm_resource to map
1122  * @pages_addr: DMA addresses to use for mapping
1123  * @fence: optional resulting fence
1124  *
1125  * Fill in the page table entries between @start and @last.
1126  *
1127  * Returns:
1128  * 0 for success, negative erro code for failure.
1129  */
1130 int amdgpu_vm_update_range(struct amdgpu_device *adev, struct amdgpu_vm *vm,
1131 			   bool immediate, bool unlocked, bool flush_tlb,
1132 			   bool allow_override, struct amdgpu_sync *sync,
1133 			   uint64_t start, uint64_t last, uint64_t flags,
1134 			   uint64_t offset, uint64_t vram_base,
1135 			   struct ttm_resource *res, dma_addr_t *pages_addr,
1136 			   struct dma_fence **fence)
1137 {
1138 	struct amdgpu_vm_tlb_seq_struct *tlb_cb;
1139 	struct amdgpu_vm_update_params params;
1140 	struct amdgpu_res_cursor cursor;
1141 	int r, idx;
1142 
1143 	if (!drm_dev_enter(adev_to_drm(adev), &idx))
1144 		return -ENODEV;
1145 
1146 	tlb_cb = kmalloc_obj(*tlb_cb);
1147 	if (!tlb_cb) {
1148 		drm_dev_exit(idx);
1149 		return -ENOMEM;
1150 	}
1151 
1152 	/* Vega20+XGMI where PTEs get inadvertently cached in L2 texture cache,
1153 	 * heavy-weight flush TLB unconditionally.
1154 	 */
1155 	flush_tlb |= adev->gmc.xgmi.num_physical_nodes &&
1156 		     amdgpu_ip_version(adev, GC_HWIP, 0) == IP_VERSION(9, 4, 0);
1157 
1158 	/*
1159 	 * On GFX8 and older any 8 PTE block with a valid bit set enters the TLB
1160 	 */
1161 	flush_tlb |= amdgpu_ip_version(adev, GC_HWIP, 0) < IP_VERSION(9, 0, 0);
1162 
1163 	memset(&params, 0, sizeof(params));
1164 	params.adev = adev;
1165 	params.vm = vm;
1166 	params.immediate = immediate;
1167 	params.pages_addr = pages_addr;
1168 	params.unlocked = unlocked;
1169 	params.needs_flush = flush_tlb;
1170 	params.override_pte = allow_override && adev->gmc.override_pte;
1171 	INIT_LIST_HEAD(&params.tlb_flush_waitlist);
1172 
1173 	r = amdgpu_vm_begin_critical(&params);
1174 	if (r)
1175 		goto error_free;
1176 
1177 	if (!unlocked && !dma_fence_is_signaled(vm->last_unlocked)) {
1178 		struct dma_fence *tmp = dma_fence_get_stub();
1179 
1180 		amdgpu_bo_fence(vm->root.bo, vm->last_unlocked, true);
1181 		swap(vm->last_unlocked, tmp);
1182 		dma_fence_put(tmp);
1183 	}
1184 
1185 	r = vm->update_funcs->prepare(&params, sync,
1186 				      AMDGPU_KERNEL_JOB_ID_VM_UPDATE_RANGE);
1187 	if (r)
1188 		goto error_free;
1189 
1190 	amdgpu_res_first(pages_addr ? NULL : res, offset,
1191 			 (last - start + 1) * AMDGPU_GPU_PAGE_SIZE, &cursor);
1192 	while (cursor.remaining) {
1193 		uint64_t tmp, num_entries, addr;
1194 
1195 		num_entries = cursor.size >> AMDGPU_GPU_PAGE_SHIFT;
1196 		if (res && res->mem_type == AMDGPU_PL_NPA) {
1197 			addr = cursor.start;
1198 		} else if (pages_addr) {
1199 			bool contiguous = true;
1200 
1201 			if (num_entries > AMDGPU_GPU_PAGES_IN_CPU_PAGE) {
1202 				uint64_t pfn = cursor.start >> PAGE_SHIFT;
1203 				uint64_t count;
1204 
1205 				contiguous = pages_addr[pfn + 1] ==
1206 					pages_addr[pfn] + PAGE_SIZE;
1207 
1208 				tmp = num_entries /
1209 					AMDGPU_GPU_PAGES_IN_CPU_PAGE;
1210 				for (count = 2; count < tmp; ++count) {
1211 					uint64_t idx = pfn + count;
1212 
1213 					if (contiguous != (pages_addr[idx] ==
1214 					    pages_addr[idx - 1] + PAGE_SIZE))
1215 						break;
1216 				}
1217 				if (!contiguous)
1218 					count--;
1219 				num_entries = count *
1220 					AMDGPU_GPU_PAGES_IN_CPU_PAGE;
1221 			}
1222 
1223 			if (!contiguous) {
1224 				addr = cursor.start;
1225 				params.pages_addr = pages_addr;
1226 			} else {
1227 				addr = pages_addr[cursor.start >> PAGE_SHIFT];
1228 				params.pages_addr = NULL;
1229 			}
1230 
1231 		} else if (flags & (AMDGPU_PTE_VALID | AMDGPU_PTE_PRT_FLAG(adev))) {
1232 			addr = vram_base + cursor.start;
1233 		} else {
1234 			addr = 0;
1235 		}
1236 
1237 		tmp = start + num_entries;
1238 		r = amdgpu_vm_ptes_update(&params, start, tmp, addr, flags);
1239 		if (r)
1240 			goto error_free;
1241 
1242 		amdgpu_res_next(&cursor, num_entries * AMDGPU_GPU_PAGE_SIZE);
1243 		start = tmp;
1244 	}
1245 
1246 	r = vm->update_funcs->commit(&params, fence);
1247 	if (r)
1248 		goto error_free;
1249 
1250 	if (params.needs_flush) {
1251 		amdgpu_vm_tlb_flush(&params, fence, tlb_cb);
1252 		tlb_cb = NULL;
1253 	}
1254 
1255 	amdgpu_vm_pt_free_list(adev, &params);
1256 
1257 error_free:
1258 	kfree(tlb_cb);
1259 	amdgpu_vm_end_critical(&params);
1260 	drm_dev_exit(idx);
1261 	return r;
1262 }
1263 
1264 void amdgpu_vm_get_memory(struct amdgpu_vm *vm,
1265 			  struct amdgpu_mem_stats stats[__AMDGPU_PL_NUM])
1266 {
1267 	spin_lock(&vm->stats_lock);
1268 	memcpy(stats, vm->stats, sizeof(*stats) * __AMDGPU_PL_NUM);
1269 	spin_unlock(&vm->stats_lock);
1270 }
1271 
1272 /**
1273  * amdgpu_vm_bo_update - update all BO mappings in the vm page table
1274  *
1275  * @adev: amdgpu_device pointer
1276  * @bo_va: requested BO and VM object
1277  * @clear: if true clear the entries
1278  *
1279  * Fill in the page table entries for @bo_va.
1280  *
1281  * Returns:
1282  * 0 for success, -EINVAL for failure.
1283  */
1284 int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va,
1285 			bool clear)
1286 {
1287 	struct amdgpu_bo *bo = bo_va->base.bo;
1288 	struct amdgpu_vm *vm = bo_va->base.vm;
1289 	struct amdgpu_bo_va_mapping *mapping;
1290 	struct dma_fence **last_update;
1291 	dma_addr_t *pages_addr = NULL;
1292 	struct ttm_resource *mem;
1293 	struct amdgpu_sync sync;
1294 	bool flush_tlb = clear;
1295 	uint64_t vram_base;
1296 	uint64_t flags;
1297 	bool uncached;
1298 	int r;
1299 
1300 	amdgpu_sync_create(&sync);
1301 	if (clear) {
1302 		mem = NULL;
1303 
1304 		/* Implicitly sync to command submissions in the same VM before
1305 		 * unmapping.
1306 		 */
1307 		r = amdgpu_sync_resv(adev, &sync, vm->root.bo->tbo.base.resv,
1308 				     AMDGPU_SYNC_EQ_OWNER, vm);
1309 		if (r)
1310 			goto error_free;
1311 		if (bo) {
1312 			r = amdgpu_sync_kfd(&sync, bo->tbo.base.resv);
1313 			if (r)
1314 				goto error_free;
1315 		}
1316 	} else if (!bo) {
1317 		mem = NULL;
1318 
1319 		/* PRT map operations don't need to sync to anything. */
1320 
1321 	} else {
1322 		struct drm_gem_object *obj = &bo->tbo.base;
1323 
1324 		if (drm_gem_is_imported(obj) && bo_va->is_xgmi) {
1325 			struct dma_buf *dma_buf = obj->import_attach->dmabuf;
1326 			struct drm_gem_object *gobj = dma_buf->priv;
1327 			struct amdgpu_bo *abo = gem_to_amdgpu_bo(gobj);
1328 
1329 			if (abo->tbo.resource &&
1330 			    abo->tbo.resource->mem_type == TTM_PL_VRAM)
1331 				bo = gem_to_amdgpu_bo(gobj);
1332 		}
1333 		mem = bo->tbo.resource;
1334 		if (mem && (mem->mem_type == TTM_PL_TT ||
1335 			    mem->mem_type == AMDGPU_PL_PREEMPT))
1336 			pages_addr = bo->tbo.ttm->dma_address;
1337 
1338 		/* Implicitly sync to moving fences before mapping anything */
1339 		r = amdgpu_sync_resv(adev, &sync, bo->tbo.base.resv,
1340 				     AMDGPU_SYNC_EXPLICIT, vm);
1341 		if (r)
1342 			goto error_free;
1343 	}
1344 
1345 	if (bo) {
1346 		struct amdgpu_device *bo_adev;
1347 
1348 		flags = amdgpu_ttm_tt_pte_flags(adev, bo->tbo.ttm, mem);
1349 
1350 		if (amdgpu_bo_encrypted(bo))
1351 			flags |= AMDGPU_PTE_TMZ;
1352 
1353 		bo_adev = amdgpu_ttm_adev(bo->tbo.bdev);
1354 		vram_base = bo_adev->vm_manager.vram_base_offset;
1355 		uncached = (bo->flags & AMDGPU_GEM_CREATE_UNCACHED) != 0;
1356 	} else {
1357 		flags = 0x0;
1358 		vram_base = 0;
1359 		uncached = false;
1360 	}
1361 
1362 	if (clear || amdgpu_vm_is_bo_always_valid(vm, bo))
1363 		last_update = &vm->last_update;
1364 	else
1365 		last_update = &bo_va->last_pt_update;
1366 
1367 	if (!clear && bo_va->base.moved) {
1368 		flush_tlb = true;
1369 		list_splice_init(&bo_va->valids, &bo_va->invalids);
1370 
1371 	} else if (bo_va->cleared != clear) {
1372 		list_splice_init(&bo_va->valids, &bo_va->invalids);
1373 	}
1374 
1375 	list_for_each_entry(mapping, &bo_va->invalids, list) {
1376 		uint64_t update_flags = flags;
1377 
1378 		/* normally,bo_va->flags only contians READABLE and WIRTEABLE bit go here
1379 		 * but in case of something, we filter the flags in first place
1380 		 */
1381 		if (!(mapping->flags & AMDGPU_VM_PAGE_READABLE))
1382 			update_flags &= ~AMDGPU_PTE_READABLE;
1383 		if (!(mapping->flags & AMDGPU_VM_PAGE_WRITEABLE))
1384 			update_flags &= ~AMDGPU_PTE_WRITEABLE;
1385 
1386 		/* Apply ASIC specific mapping flags */
1387 		amdgpu_gmc_get_vm_pte(adev, vm, bo, mapping->flags,
1388 				      &update_flags);
1389 
1390 		trace_amdgpu_vm_bo_update(mapping);
1391 
1392 		r = amdgpu_vm_update_range(adev, vm, false, false, flush_tlb,
1393 					   !uncached, &sync, mapping->start,
1394 					   mapping->last, update_flags,
1395 					   mapping->offset, vram_base, mem,
1396 					   pages_addr, last_update);
1397 		if (r)
1398 			goto error_free;
1399 	}
1400 
1401 	/* If the BO is not in its preferred location add it back to
1402 	 * the evicted list so that it gets validated again on the
1403 	 * next command submission.
1404 	 */
1405 	if (amdgpu_vm_is_bo_always_valid(vm, bo)) {
1406 		if (bo->tbo.resource &&
1407 		    !(bo->preferred_domains &
1408 		      amdgpu_mem_type_to_domain(bo->tbo.resource->mem_type)))
1409 			amdgpu_vm_bo_evicted(&bo_va->base);
1410 		else
1411 			amdgpu_vm_bo_idle(&bo_va->base);
1412 	} else if (bo) {
1413 		/*
1414 		 * A PRT/sparse mapping has no BO and is kept off the vm_bo
1415 		 * state lists (see amdgpu_vm_bo_base_init()); putting it on the
1416 		 * idle list here would let amdgpu_vm_handle_moved() dereference
1417 		 * the NULL bo after a reset.
1418 		 */
1419 		amdgpu_vm_bo_idle(&bo_va->base);
1420 	}
1421 
1422 	list_splice_init(&bo_va->invalids, &bo_va->valids);
1423 	bo_va->cleared = clear;
1424 	bo_va->base.moved = false;
1425 
1426 	if (trace_amdgpu_vm_bo_mapping_enabled()) {
1427 		list_for_each_entry(mapping, &bo_va->valids, list)
1428 			trace_amdgpu_vm_bo_mapping(mapping);
1429 	}
1430 
1431 error_free:
1432 	amdgpu_sync_free(&sync);
1433 	return r;
1434 }
1435 
1436 /**
1437  * amdgpu_vm_update_prt_state - update the global PRT state
1438  *
1439  * @adev: amdgpu_device pointer
1440  */
1441 static void amdgpu_vm_update_prt_state(struct amdgpu_device *adev)
1442 {
1443 	unsigned long flags;
1444 	bool enable;
1445 
1446 	spin_lock_irqsave(&adev->vm_manager.prt_lock, flags);
1447 	enable = !!atomic_read(&adev->vm_manager.num_prt_users);
1448 	adev->gmc.gmc_funcs->set_prt(adev, enable);
1449 	spin_unlock_irqrestore(&adev->vm_manager.prt_lock, flags);
1450 }
1451 
1452 /**
1453  * amdgpu_vm_prt_get - add a PRT user
1454  *
1455  * @adev: amdgpu_device pointer
1456  */
1457 static void amdgpu_vm_prt_get(struct amdgpu_device *adev)
1458 {
1459 	if (!adev->gmc.gmc_funcs->set_prt)
1460 		return;
1461 
1462 	if (atomic_inc_return(&adev->vm_manager.num_prt_users) == 1)
1463 		amdgpu_vm_update_prt_state(adev);
1464 }
1465 
1466 /**
1467  * amdgpu_vm_prt_put - drop a PRT user
1468  *
1469  * @adev: amdgpu_device pointer
1470  */
1471 static void amdgpu_vm_prt_put(struct amdgpu_device *adev)
1472 {
1473 	if (atomic_dec_return(&adev->vm_manager.num_prt_users) == 0)
1474 		amdgpu_vm_update_prt_state(adev);
1475 }
1476 
1477 /**
1478  * amdgpu_vm_prt_cb - callback for updating the PRT status
1479  *
1480  * @fence: fence for the callback
1481  * @_cb: the callback function
1482  */
1483 static void amdgpu_vm_prt_cb(struct dma_fence *fence, struct dma_fence_cb *_cb)
1484 {
1485 	struct amdgpu_prt_cb *cb = container_of(_cb, struct amdgpu_prt_cb, cb);
1486 
1487 	amdgpu_vm_prt_put(cb->adev);
1488 	kfree(cb);
1489 }
1490 
1491 /**
1492  * amdgpu_vm_add_prt_cb - add callback for updating the PRT status
1493  *
1494  * @adev: amdgpu_device pointer
1495  * @fence: fence for the callback
1496  */
1497 static void amdgpu_vm_add_prt_cb(struct amdgpu_device *adev,
1498 				 struct dma_fence *fence)
1499 {
1500 	struct amdgpu_prt_cb *cb;
1501 
1502 	if (!adev->gmc.gmc_funcs->set_prt)
1503 		return;
1504 
1505 	cb = kmalloc_obj(struct amdgpu_prt_cb);
1506 	if (!cb) {
1507 		/* Last resort when we are OOM */
1508 		if (fence)
1509 			dma_fence_wait(fence, false);
1510 
1511 		amdgpu_vm_prt_put(adev);
1512 	} else {
1513 		cb->adev = adev;
1514 		if (!fence || dma_fence_add_callback(fence, &cb->cb,
1515 						     amdgpu_vm_prt_cb))
1516 			amdgpu_vm_prt_cb(fence, &cb->cb);
1517 	}
1518 }
1519 
1520 /**
1521  * amdgpu_vm_free_mapping - free a mapping
1522  *
1523  * @adev: amdgpu_device pointer
1524  * @vm: requested vm
1525  * @mapping: mapping to be freed
1526  * @fence: fence of the unmap operation
1527  *
1528  * Free a mapping and make sure we decrease the PRT usage count if applicable.
1529  */
1530 static void amdgpu_vm_free_mapping(struct amdgpu_device *adev,
1531 				   struct amdgpu_vm *vm,
1532 				   struct amdgpu_bo_va_mapping *mapping,
1533 				   struct dma_fence *fence)
1534 {
1535 	if (mapping->flags & AMDGPU_VM_PAGE_PRT)
1536 		amdgpu_vm_add_prt_cb(adev, fence);
1537 	kfree(mapping);
1538 }
1539 
1540 /**
1541  * amdgpu_vm_prt_fini - finish all prt mappings
1542  *
1543  * @adev: amdgpu_device pointer
1544  * @vm: requested vm
1545  *
1546  * Register a cleanup callback to disable PRT support after VM dies.
1547  */
1548 static void amdgpu_vm_prt_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
1549 {
1550 	struct dma_resv *resv = vm->root.bo->tbo.base.resv;
1551 	struct dma_resv_iter cursor;
1552 	struct dma_fence *fence;
1553 
1554 	dma_resv_for_each_fence(&cursor, resv, DMA_RESV_USAGE_BOOKKEEP, fence) {
1555 		/* Add a callback for each fence in the reservation object */
1556 		amdgpu_vm_prt_get(adev);
1557 		amdgpu_vm_add_prt_cb(adev, fence);
1558 	}
1559 }
1560 
1561 /**
1562  * amdgpu_vm_clear_freed - clear freed BOs in the PT
1563  *
1564  * @adev: amdgpu_device pointer
1565  * @vm: requested vm
1566  * @fence: optional resulting fence (unchanged if no work needed to be done
1567  * or if an error occurred)
1568  *
1569  * Make sure all freed BOs are cleared in the PT.
1570  * PTs have to be reserved and mutex must be locked!
1571  *
1572  * Returns:
1573  * 0 for success.
1574  *
1575  */
1576 int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
1577 			  struct amdgpu_vm *vm,
1578 			  struct dma_fence **fence)
1579 {
1580 	struct amdgpu_bo_va_mapping *mapping;
1581 	struct dma_fence *f = NULL;
1582 	struct amdgpu_sync sync;
1583 	int r;
1584 
1585 	if (list_empty(&vm->freed))
1586 		return 0;
1587 
1588 	/*
1589 	 * Implicitly sync to command submissions in the same VM before
1590 	 * unmapping.
1591 	 */
1592 	amdgpu_sync_create(&sync);
1593 	r = amdgpu_sync_resv(adev, &sync, vm->root.bo->tbo.base.resv,
1594 			     AMDGPU_SYNC_EQ_OWNER, vm);
1595 	if (r)
1596 		goto error_free;
1597 
1598 	while (!list_empty(&vm->freed)) {
1599 		mapping = list_first_entry(&vm->freed,
1600 			struct amdgpu_bo_va_mapping, list);
1601 		list_del(&mapping->list);
1602 
1603 		r = amdgpu_vm_update_range(adev, vm, false, false, true, false,
1604 					   &sync, mapping->start, mapping->last,
1605 					   0, 0, 0, NULL, NULL, &f);
1606 		amdgpu_vm_free_mapping(adev, vm, mapping, f);
1607 		if (r) {
1608 			dma_fence_put(f);
1609 			goto error_free;
1610 		}
1611 	}
1612 
1613 	if (fence && f) {
1614 		dma_fence_put(*fence);
1615 		*fence = f;
1616 	} else {
1617 		dma_fence_put(f);
1618 	}
1619 
1620 error_free:
1621 	amdgpu_sync_free(&sync);
1622 	return r;
1623 
1624 }
1625 
1626 /**
1627  * amdgpu_vm_handle_moved - handle moved BOs in the PT
1628  *
1629  * @adev: amdgpu_device pointer
1630  * @vm: requested vm
1631  * @ticket: optional reservation ticket used to reserve the VM
1632  *
1633  * Make sure all BOs which are moved are updated in the PTs.
1634  *
1635  * Returns:
1636  * 0 for success.
1637  *
1638  * PTs have to be reserved!
1639  */
1640 int amdgpu_vm_handle_moved(struct amdgpu_device *adev,
1641 			   struct amdgpu_vm *vm,
1642 			   struct ww_acquire_ctx *ticket)
1643 {
1644 	struct amdgpu_bo_va *bo_va, *tmp;
1645 	struct dma_resv *resv;
1646 	struct amdgpu_bo *bo;
1647 	bool clear, unlock;
1648 	int r;
1649 
1650 	list_for_each_entry_safe(bo_va, tmp, &vm->always_valid.needs_update,
1651 				 base.vm_status) {
1652 		/* Per VM BOs never need to bo cleared in the page tables */
1653 		r = amdgpu_vm_bo_update(adev, bo_va, false);
1654 		if (r)
1655 			return r;
1656 	}
1657 
1658 	spin_lock(&vm->individual_lock);
1659 	while (!list_empty(&vm->individual.needs_update)) {
1660 		bo_va = list_first_entry(&vm->individual.needs_update,
1661 					 typeof(*bo_va), base.vm_status);
1662 		bo = bo_va->base.bo;
1663 		resv = bo->tbo.base.resv;
1664 		spin_unlock(&vm->individual_lock);
1665 
1666 		/* Try to reserve the BO to avoid clearing its ptes */
1667 		if (!adev->debug_vm && !amdgpu_ttm_tt_get_usermm(bo->tbo.ttm) &&
1668 		    dma_resv_trylock(resv)) {
1669 			clear = false;
1670 			unlock = true;
1671 		/* The caller is already holding the reservation lock */
1672 		} else if (ticket && dma_resv_locking_ctx(resv) == ticket) {
1673 			clear = false;
1674 			unlock = false;
1675 		/* Somebody else is using the BO right now */
1676 		} else {
1677 			clear = true;
1678 			unlock = false;
1679 		}
1680 
1681 		r = amdgpu_vm_bo_update(adev, bo_va, clear);
1682 
1683 		if (unlock)
1684 			dma_resv_unlock(resv);
1685 		if (r)
1686 			return r;
1687 
1688 		/* Remember evicted DMABuf imports in compute VMs for later
1689 		 * validation
1690 		 */
1691 		if (vm->is_compute_context &&
1692 		    drm_gem_is_imported(&bo_va->base.bo->tbo.base) &&
1693 		    (!bo_va->base.bo->tbo.resource ||
1694 		     bo_va->base.bo->tbo.resource->mem_type == TTM_PL_SYSTEM))
1695 			amdgpu_vm_bo_evicted(&bo_va->base);
1696 
1697 		spin_lock(&vm->individual_lock);
1698 	}
1699 	spin_unlock(&vm->individual_lock);
1700 
1701 	return 0;
1702 }
1703 
1704 /**
1705  * amdgpu_vm_flush_compute_tlb - Flush TLB on compute VM
1706  *
1707  * @adev: amdgpu_device pointer
1708  * @vm: requested vm
1709  * @flush_type: flush type
1710  * @xcc_mask: mask of XCCs that belong to the compute partition in need of a TLB flush.
1711  *
1712  * Flush TLB if needed for a compute VM.
1713  *
1714  * Returns:
1715  * 0 for success.
1716  */
1717 int amdgpu_vm_flush_compute_tlb(struct amdgpu_device *adev,
1718 				struct amdgpu_vm *vm,
1719 				uint32_t flush_type,
1720 				uint32_t xcc_mask)
1721 {
1722 	uint64_t tlb_seq = amdgpu_vm_tlb_seq(vm);
1723 	bool all_hub = false;
1724 
1725 	WARN_ON_ONCE(!vm->is_compute_context);
1726 
1727 	/*
1728 	 * It can be that we race and lose here, but that is extremely unlikely
1729 	 * and the worst thing which could happen is that we flush the changes
1730 	 * into the TLB once more which is harmless.
1731 	 */
1732 	if (atomic64_xchg(&vm->kfd_last_flushed_seq, tlb_seq) == tlb_seq)
1733 		return 0;
1734 
1735 	if (adev->family == AMDGPU_FAMILY_AI ||
1736 	    adev->family == AMDGPU_FAMILY_RV)
1737 		all_hub = true;
1738 
1739 	return amdgpu_gmc_flush_gpu_tlb_pasid_xccs(adev, vm->pasid, flush_type,
1740 						   all_hub, xcc_mask);
1741 }
1742 
1743 /**
1744  * amdgpu_vm_bo_add - add a bo to a specific vm
1745  *
1746  * @adev: amdgpu_device pointer
1747  * @vm: requested vm
1748  * @bo: amdgpu buffer object
1749  *
1750  * Add @bo into the requested vm.
1751  * Add @bo to the list of bos associated with the vm
1752  *
1753  * Returns:
1754  * Newly added bo_va or NULL for failure
1755  *
1756  * Object has to be reserved!
1757  */
1758 struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,
1759 				      struct amdgpu_vm *vm,
1760 				      struct amdgpu_bo *bo)
1761 {
1762 	struct amdgpu_bo_va *bo_va;
1763 
1764 	amdgpu_vm_assert_locked(vm);
1765 
1766 	bo_va = kzalloc_obj(struct amdgpu_bo_va);
1767 	if (bo_va == NULL) {
1768 		return NULL;
1769 	}
1770 	amdgpu_vm_bo_base_init(&bo_va->base, vm, bo);
1771 
1772 	bo_va->ref_count = 1;
1773 	bo_va->last_pt_update = dma_fence_get_stub();
1774 	INIT_LIST_HEAD(&bo_va->valids);
1775 	INIT_LIST_HEAD(&bo_va->invalids);
1776 
1777 	if (!bo)
1778 		return bo_va;
1779 
1780 	dma_resv_assert_held(bo->tbo.base.resv);
1781 	if (amdgpu_dmabuf_is_xgmi_accessible(adev, bo)) {
1782 		bo_va->is_xgmi = true;
1783 		/* Power up XGMI if it can be potentially used */
1784 		amdgpu_xgmi_set_pstate(adev, AMDGPU_XGMI_PSTATE_MAX_VEGA20);
1785 	}
1786 
1787 	return bo_va;
1788 }
1789 
1790 
1791 /**
1792  * amdgpu_vm_bo_insert_map - insert a new mapping
1793  *
1794  * @adev: amdgpu_device pointer
1795  * @bo_va: bo_va to store the address
1796  * @mapping: the mapping to insert
1797  *
1798  * Insert a new mapping into all structures.
1799  */
1800 static void amdgpu_vm_bo_insert_map(struct amdgpu_device *adev,
1801 				    struct amdgpu_bo_va *bo_va,
1802 				    struct amdgpu_bo_va_mapping *mapping)
1803 {
1804 	struct amdgpu_vm *vm = bo_va->base.vm;
1805 	struct amdgpu_bo *bo = bo_va->base.bo;
1806 
1807 	mapping->bo_va = bo_va;
1808 	list_add(&mapping->list, &bo_va->invalids);
1809 	amdgpu_vm_it_insert(mapping, &vm->va);
1810 
1811 	if (mapping->flags & AMDGPU_VM_PAGE_PRT)
1812 		amdgpu_vm_prt_get(adev);
1813 
1814 	if (amdgpu_vm_is_bo_always_valid(vm, bo) && !bo_va->base.moved)
1815 		amdgpu_vm_bo_needs_update(&bo_va->base);
1816 
1817 	trace_amdgpu_vm_bo_map(bo_va, mapping);
1818 }
1819 
1820 /* Validate operation parameters to prevent potential abuse */
1821 static int amdgpu_vm_verify_parameters(struct amdgpu_device *adev,
1822 					  struct amdgpu_bo *bo,
1823 					  uint64_t saddr,
1824 					  uint64_t offset,
1825 					  uint64_t size)
1826 {
1827 	uint64_t tmp, lpfn;
1828 
1829 	if (saddr & AMDGPU_GPU_PAGE_MASK
1830 	    || offset & AMDGPU_GPU_PAGE_MASK
1831 	    || size & AMDGPU_GPU_PAGE_MASK)
1832 		return -EINVAL;
1833 
1834 	if (check_add_overflow(saddr, size, &tmp)
1835 	    || check_add_overflow(offset, size, &tmp)
1836 	    || size == 0 /* which also leads to end < begin */)
1837 		return -EINVAL;
1838 
1839 	/* make sure object fit at this offset */
1840 	if (bo && offset + size > amdgpu_bo_size(bo))
1841 		return -EINVAL;
1842 
1843 	/* Ensure last pfn not exceed max_pfn */
1844 	lpfn = (saddr + size - 1) >> AMDGPU_GPU_PAGE_SHIFT;
1845 	if (lpfn >= adev->vm_manager.max_pfn)
1846 		return -EINVAL;
1847 
1848 	return 0;
1849 }
1850 
1851 /**
1852  * amdgpu_vm_bo_map - map bo inside a vm
1853  *
1854  * @adev: amdgpu_device pointer
1855  * @bo_va: bo_va to store the address
1856  * @saddr: where to map the BO
1857  * @offset: requested offset in the BO
1858  * @size: BO size in bytes
1859  * @flags: attributes of pages (read/write/valid/etc.)
1860  *
1861  * Add a mapping of the BO at the specefied addr into the VM.
1862  *
1863  * Returns:
1864  * 0 for success, error for failure.
1865  *
1866  * Object has to be reserved and unreserved outside!
1867  */
1868 int amdgpu_vm_bo_map(struct amdgpu_device *adev,
1869 		     struct amdgpu_bo_va *bo_va,
1870 		     uint64_t saddr, uint64_t offset,
1871 		     uint64_t size, uint32_t flags)
1872 {
1873 	struct amdgpu_bo_va_mapping *mapping, *tmp;
1874 	struct amdgpu_bo *bo = bo_va->base.bo;
1875 	struct amdgpu_vm *vm = bo_va->base.vm;
1876 	uint64_t eaddr;
1877 	int r;
1878 
1879 	r = amdgpu_vm_verify_parameters(adev, bo, saddr, offset, size);
1880 	if (r)
1881 		return r;
1882 
1883 	saddr /= AMDGPU_GPU_PAGE_SIZE;
1884 	eaddr = saddr + (size - 1) / AMDGPU_GPU_PAGE_SIZE;
1885 
1886 	tmp = amdgpu_vm_it_iter_first(&vm->va, saddr, eaddr);
1887 	if (tmp) {
1888 		/* bo and tmp overlap, invalid addr */
1889 		dev_err(adev->dev, "bo %p va 0x%010Lx-0x%010Lx conflict with "
1890 			"0x%010Lx-0x%010Lx\n", bo, saddr, eaddr,
1891 			tmp->start, tmp->last + 1);
1892 		return -EINVAL;
1893 	}
1894 
1895 	mapping = kmalloc_obj(*mapping);
1896 	if (!mapping)
1897 		return -ENOMEM;
1898 
1899 	mapping->start = saddr;
1900 	mapping->last = eaddr;
1901 	mapping->offset = offset;
1902 	mapping->flags = flags;
1903 
1904 	amdgpu_vm_bo_insert_map(adev, bo_va, mapping);
1905 
1906 	return 0;
1907 }
1908 
1909 /**
1910  * amdgpu_vm_bo_replace_map - map bo inside a vm, replacing existing mappings
1911  *
1912  * @adev: amdgpu_device pointer
1913  * @bo_va: bo_va to store the address
1914  * @saddr: where to map the BO
1915  * @offset: requested offset in the BO
1916  * @size: BO size in bytes
1917  * @flags: attributes of pages (read/write/valid/etc.)
1918  *
1919  * Add a mapping of the BO at the specefied addr into the VM. Replace existing
1920  * mappings as we do so.
1921  *
1922  * Returns:
1923  * 0 for success, error for failure.
1924  *
1925  * Object has to be reserved and unreserved outside!
1926  */
1927 int amdgpu_vm_bo_replace_map(struct amdgpu_device *adev,
1928 			     struct amdgpu_bo_va *bo_va,
1929 			     uint64_t saddr, uint64_t offset,
1930 			     uint64_t size, uint32_t flags)
1931 {
1932 	struct amdgpu_bo_va_mapping *mapping;
1933 	struct amdgpu_bo *bo = bo_va->base.bo;
1934 	uint64_t eaddr;
1935 	int r;
1936 
1937 	r = amdgpu_vm_verify_parameters(adev, bo, saddr, offset, size);
1938 	if (r)
1939 		return r;
1940 
1941 	/* Allocate all the needed memory */
1942 	mapping = kmalloc_obj(*mapping);
1943 	if (!mapping)
1944 		return -ENOMEM;
1945 
1946 	r = amdgpu_vm_bo_clear_mappings(adev, bo_va->base.vm, saddr, size);
1947 	if (r) {
1948 		kfree(mapping);
1949 		return r;
1950 	}
1951 
1952 	saddr /= AMDGPU_GPU_PAGE_SIZE;
1953 	eaddr = saddr + (size - 1) / AMDGPU_GPU_PAGE_SIZE;
1954 
1955 	mapping->start = saddr;
1956 	mapping->last = eaddr;
1957 	mapping->offset = offset;
1958 	mapping->flags = flags;
1959 
1960 	amdgpu_vm_bo_insert_map(adev, bo_va, mapping);
1961 
1962 	return 0;
1963 }
1964 
1965 /**
1966  * amdgpu_vm_bo_unmap - remove bo mapping from vm
1967  *
1968  * @adev: amdgpu_device pointer
1969  * @bo_va: bo_va to remove the address from
1970  * @saddr: where to the BO is mapped
1971  *
1972  * Remove a mapping of the BO at the specefied addr from the VM.
1973  *
1974  * Returns:
1975  * 0 for success, error for failure.
1976  *
1977  * Object has to be reserved and unreserved outside!
1978  */
1979 int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
1980 		       struct amdgpu_bo_va *bo_va,
1981 		       uint64_t saddr)
1982 {
1983 	struct amdgpu_bo_va_mapping *mapping;
1984 	struct amdgpu_vm *vm = bo_va->base.vm;
1985 	bool valid = true;
1986 
1987 	saddr /= AMDGPU_GPU_PAGE_SIZE;
1988 
1989 	list_for_each_entry(mapping, &bo_va->valids, list) {
1990 		if (mapping->start == saddr)
1991 			break;
1992 	}
1993 
1994 	if (&mapping->list == &bo_va->valids) {
1995 		valid = false;
1996 
1997 		list_for_each_entry(mapping, &bo_va->invalids, list) {
1998 			if (mapping->start == saddr)
1999 				break;
2000 		}
2001 
2002 		if (&mapping->list == &bo_va->invalids)
2003 			return -ENOENT;
2004 	}
2005 
2006 	/* It's unlikely to happen that the mapping userq hasn't been idled
2007 	 * during user requests GEM unmap IOCTL except for forcing the unmap
2008 	 * from user space.
2009 	 */
2010 	if (unlikely(bo_va->userq_va_mapped))
2011 		amdgpu_userq_gem_va_unmap_validate(adev, mapping);
2012 
2013 	list_del(&mapping->list);
2014 	amdgpu_vm_it_remove(mapping, &vm->va);
2015 	mapping->bo_va = NULL;
2016 	trace_amdgpu_vm_bo_unmap(bo_va, mapping);
2017 
2018 	if (valid)
2019 		list_add(&mapping->list, &vm->freed);
2020 	else
2021 		amdgpu_vm_free_mapping(adev, vm, mapping,
2022 				       bo_va->last_pt_update);
2023 
2024 	return 0;
2025 }
2026 
2027 /**
2028  * amdgpu_vm_bo_clear_mappings - remove all mappings in a specific range
2029  *
2030  * @adev: amdgpu_device pointer
2031  * @vm: VM structure to use
2032  * @saddr: start of the range
2033  * @size: size of the range
2034  *
2035  * Remove all mappings in a range, split them as appropriate.
2036  *
2037  * Returns:
2038  * 0 for success, error for failure.
2039  */
2040 int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,
2041 				struct amdgpu_vm *vm,
2042 				uint64_t saddr, uint64_t size)
2043 {
2044 	struct amdgpu_bo_va_mapping *before, *after, *tmp, *next;
2045 	LIST_HEAD(removed);
2046 	uint64_t eaddr;
2047 	int r;
2048 
2049 	r = amdgpu_vm_verify_parameters(adev, NULL, saddr, 0, size);
2050 	if (r)
2051 		return r;
2052 
2053 	saddr /= AMDGPU_GPU_PAGE_SIZE;
2054 	eaddr = saddr + (size - 1) / AMDGPU_GPU_PAGE_SIZE;
2055 
2056 	/* Allocate all the needed memory */
2057 	before = kzalloc_obj(*before);
2058 	if (!before)
2059 		return -ENOMEM;
2060 	INIT_LIST_HEAD(&before->list);
2061 
2062 	after = kzalloc_obj(*after);
2063 	if (!after) {
2064 		kfree(before);
2065 		return -ENOMEM;
2066 	}
2067 	INIT_LIST_HEAD(&after->list);
2068 
2069 	/* Now gather all removed mappings */
2070 	tmp = amdgpu_vm_it_iter_first(&vm->va, saddr, eaddr);
2071 	while (tmp) {
2072 		/* Remember mapping split at the start */
2073 		if (tmp->start < saddr) {
2074 			before->start = tmp->start;
2075 			before->last = saddr - 1;
2076 			before->offset = tmp->offset;
2077 			before->flags = tmp->flags;
2078 			before->bo_va = tmp->bo_va;
2079 			list_add(&before->list, &tmp->bo_va->invalids);
2080 		}
2081 
2082 		/* Remember mapping split at the end */
2083 		if (tmp->last > eaddr) {
2084 			after->start = eaddr + 1;
2085 			after->last = tmp->last;
2086 			after->offset = tmp->offset;
2087 			after->offset += (after->start - tmp->start) << AMDGPU_GPU_PAGE_SHIFT;
2088 			after->flags = tmp->flags;
2089 			after->bo_va = tmp->bo_va;
2090 			list_add(&after->list, &tmp->bo_va->invalids);
2091 		}
2092 
2093 		list_del(&tmp->list);
2094 		list_add(&tmp->list, &removed);
2095 
2096 		tmp = amdgpu_vm_it_iter_next(tmp, saddr, eaddr);
2097 	}
2098 
2099 	/* And free them up */
2100 	list_for_each_entry_safe(tmp, next, &removed, list) {
2101 		amdgpu_vm_it_remove(tmp, &vm->va);
2102 		list_del(&tmp->list);
2103 
2104 		if (tmp->start < saddr)
2105 		    tmp->start = saddr;
2106 		if (tmp->last > eaddr)
2107 		    tmp->last = eaddr;
2108 
2109 		tmp->bo_va = NULL;
2110 		list_add(&tmp->list, &vm->freed);
2111 		trace_amdgpu_vm_bo_unmap(NULL, tmp);
2112 	}
2113 
2114 	/* Insert partial mapping before the range */
2115 	if (!list_empty(&before->list)) {
2116 		struct amdgpu_bo *bo = before->bo_va->base.bo;
2117 
2118 		amdgpu_vm_it_insert(before, &vm->va);
2119 		if (before->flags & AMDGPU_VM_PAGE_PRT)
2120 			amdgpu_vm_prt_get(adev);
2121 
2122 		if (amdgpu_vm_is_bo_always_valid(vm, bo) &&
2123 		    !before->bo_va->base.moved)
2124 			amdgpu_vm_bo_needs_update(&before->bo_va->base);
2125 	} else {
2126 		kfree(before);
2127 	}
2128 
2129 	/* Insert partial mapping after the range */
2130 	if (!list_empty(&after->list)) {
2131 		struct amdgpu_bo *bo = after->bo_va->base.bo;
2132 
2133 		amdgpu_vm_it_insert(after, &vm->va);
2134 		if (after->flags & AMDGPU_VM_PAGE_PRT)
2135 			amdgpu_vm_prt_get(adev);
2136 
2137 		if (amdgpu_vm_is_bo_always_valid(vm, bo) &&
2138 		    !after->bo_va->base.moved)
2139 			amdgpu_vm_bo_needs_update(&after->bo_va->base);
2140 	} else {
2141 		kfree(after);
2142 	}
2143 
2144 	return 0;
2145 }
2146 
2147 /**
2148  * amdgpu_vm_bo_lookup_mapping - find mapping by address
2149  *
2150  * @vm: the requested VM
2151  * @addr: the address
2152  *
2153  * Find a mapping by it's address.
2154  *
2155  * Returns:
2156  * The amdgpu_bo_va_mapping matching for addr or NULL
2157  *
2158  */
2159 struct amdgpu_bo_va_mapping *amdgpu_vm_bo_lookup_mapping(struct amdgpu_vm *vm,
2160 							 uint64_t addr)
2161 {
2162 	addr /= AMDGPU_GPU_PAGE_SIZE;
2163 	return amdgpu_vm_it_iter_first(&vm->va, addr, addr);
2164 }
2165 
2166 /**
2167  * amdgpu_vm_bo_trace_cs - trace all reserved mappings
2168  *
2169  * @vm: the requested vm
2170  * @ticket: CS ticket
2171  *
2172  * Trace all mappings of BOs reserved during a command submission.
2173  */
2174 void amdgpu_vm_bo_trace_cs(struct amdgpu_vm *vm, struct ww_acquire_ctx *ticket)
2175 {
2176 	struct amdgpu_bo_va_mapping *mapping;
2177 
2178 	if (!trace_amdgpu_vm_bo_cs_enabled())
2179 		return;
2180 
2181 	for (mapping = amdgpu_vm_it_iter_first(&vm->va, 0, U64_MAX); mapping;
2182 	     mapping = amdgpu_vm_it_iter_next(mapping, 0, U64_MAX)) {
2183 		if (mapping->bo_va && mapping->bo_va->base.bo) {
2184 			struct amdgpu_bo *bo;
2185 
2186 			bo = mapping->bo_va->base.bo;
2187 			if (dma_resv_locking_ctx(bo->tbo.base.resv) !=
2188 			    ticket)
2189 				continue;
2190 		}
2191 
2192 		trace_amdgpu_vm_bo_cs(mapping);
2193 	}
2194 }
2195 
2196 /**
2197  * amdgpu_vm_bo_del - remove a bo from a specific vm
2198  *
2199  * @adev: amdgpu_device pointer
2200  * @bo_va: requested bo_va
2201  *
2202  * Remove @bo_va->bo from the requested vm.
2203  *
2204  * Object have to be reserved!
2205  */
2206 void amdgpu_vm_bo_del(struct amdgpu_device *adev,
2207 		      struct amdgpu_bo_va *bo_va)
2208 {
2209 	struct amdgpu_bo_va_mapping *mapping, *next;
2210 	struct amdgpu_bo *bo = bo_va->base.bo;
2211 	struct amdgpu_vm *vm = bo_va->base.vm;
2212 	struct amdgpu_vm_bo_base **base;
2213 
2214 	dma_resv_assert_held(vm->root.bo->tbo.base.resv);
2215 
2216 	if (bo) {
2217 		dma_resv_assert_held(bo->tbo.base.resv);
2218 		if (amdgpu_vm_is_bo_always_valid(vm, bo))
2219 			ttm_bo_set_bulk_move(&bo->tbo, NULL);
2220 
2221 		for (base = &bo_va->base.bo->vm_bo; *base;
2222 		     base = &(*base)->next) {
2223 			if (*base != &bo_va->base)
2224 				continue;
2225 
2226 			amdgpu_vm_update_stats(*base, bo->tbo.resource, -1);
2227 			*base = bo_va->base.next;
2228 			break;
2229 		}
2230 	}
2231 
2232 	spin_lock(&vm->individual_lock);
2233 	list_del(&bo_va->base.vm_status);
2234 	spin_unlock(&vm->individual_lock);
2235 
2236 	list_for_each_entry_safe(mapping, next, &bo_va->valids, list) {
2237 		list_del(&mapping->list);
2238 		amdgpu_vm_it_remove(mapping, &vm->va);
2239 		mapping->bo_va = NULL;
2240 		trace_amdgpu_vm_bo_unmap(bo_va, mapping);
2241 		list_add(&mapping->list, &vm->freed);
2242 	}
2243 	list_for_each_entry_safe(mapping, next, &bo_va->invalids, list) {
2244 		list_del(&mapping->list);
2245 		amdgpu_vm_it_remove(mapping, &vm->va);
2246 		amdgpu_vm_free_mapping(adev, vm, mapping,
2247 				       bo_va->last_pt_update);
2248 	}
2249 
2250 	dma_fence_put(bo_va->last_pt_update);
2251 
2252 	if (bo && bo_va->is_xgmi)
2253 		amdgpu_xgmi_set_pstate(adev, AMDGPU_XGMI_PSTATE_MIN);
2254 
2255 	kfree(bo_va);
2256 }
2257 
2258 /**
2259  * amdgpu_vm_evictable - check if we can evict a VM
2260  *
2261  * @bo: A page table of the VM.
2262  *
2263  * Check if it is possible to evict a VM.
2264  */
2265 bool amdgpu_vm_evictable(struct amdgpu_bo *bo)
2266 {
2267 	struct amdgpu_vm_bo_base *bo_base = bo->vm_bo;
2268 	struct amdgpu_vm *vm;
2269 
2270 	/* Page tables of a destroyed VM can go away immediately */
2271 	if (!bo_base || !bo_base->vm)
2272 		return true;
2273 
2274 	/* Don't evict VM page tables while they are busy */
2275 	if (!dma_resv_test_signaled(bo->tbo.base.resv, DMA_RESV_USAGE_BOOKKEEP))
2276 		return false;
2277 
2278 	/* Try to block ongoing updates */
2279 	vm = bo_base->vm;
2280 	scoped_cond_guard(mutex_try, return false, &vm->eviction_lock) {
2281 
2282 		/* Don't evict VM page tables while they are updated */
2283 		if (!dma_fence_is_signaled(vm->last_unlocked))
2284 			return false;
2285 
2286 		vm->evicting = true;
2287 	}
2288 	return true;
2289 }
2290 
2291 /**
2292  * amdgpu_vm_bo_invalidate - mark the bo as invalid
2293  *
2294  * @bo: amdgpu buffer object
2295  * @evicted: is the BO evicted
2296  *
2297  * Mark @bo as invalid.
2298  */
2299 void amdgpu_vm_bo_invalidate(struct amdgpu_bo *bo, bool evicted)
2300 {
2301 	struct amdgpu_vm_bo_base *bo_base;
2302 
2303 	for (bo_base = bo->vm_bo; bo_base; bo_base = bo_base->next) {
2304 		struct amdgpu_vm *vm = bo_base->vm;
2305 
2306 		if (evicted && amdgpu_vm_is_bo_always_valid(vm, bo)) {
2307 			amdgpu_vm_bo_evicted(bo_base);
2308 			continue;
2309 		}
2310 
2311 		if (bo_base->moved)
2312 			continue;
2313 		bo_base->moved = true;
2314 		amdgpu_vm_bo_needs_update(bo_base);
2315 	}
2316 }
2317 
2318 /**
2319  * amdgpu_vm_bo_move - handle BO move
2320  *
2321  * @bo: amdgpu buffer object
2322  * @new_mem: the new placement of the BO move
2323  * @evicted: is the BO evicted
2324  *
2325  * Update the memory stats for the new placement and mark @bo as invalid.
2326  */
2327 void amdgpu_vm_bo_move(struct amdgpu_bo *bo, struct ttm_resource *new_mem,
2328 		       bool evicted)
2329 {
2330 	struct amdgpu_vm_bo_base *bo_base;
2331 
2332 	for (bo_base = bo->vm_bo; bo_base; bo_base = bo_base->next) {
2333 		struct amdgpu_vm *vm = bo_base->vm;
2334 
2335 		spin_lock(&vm->stats_lock);
2336 		amdgpu_vm_update_stats_locked(bo_base, bo->tbo.resource, -1);
2337 		amdgpu_vm_update_stats_locked(bo_base, new_mem, +1);
2338 		spin_unlock(&vm->stats_lock);
2339 	}
2340 
2341 	amdgpu_vm_bo_invalidate(bo, evicted);
2342 }
2343 
2344 /**
2345  * amdgpu_vm_get_block_size - calculate VM page table size as power of two
2346  *
2347  * @vm_size: VM size
2348  *
2349  * Returns:
2350  * VM page table as power of two
2351  */
2352 static uint32_t amdgpu_vm_get_block_size(uint64_t vm_size)
2353 {
2354 	/* Total bits covered by PD + PTs */
2355 	unsigned bits = ilog2(vm_size) + 18;
2356 
2357 	/* Make sure the PD is 4K in size up to 8GB address space.
2358 	   Above that split equal between PD and PTs */
2359 	if (vm_size <= 8)
2360 		return (bits - 9);
2361 	else
2362 		return ((bits + 3) / 2);
2363 }
2364 
2365 /**
2366  * amdgpu_vm_adjust_size - adjust vm size, block size and fragment size
2367  *
2368  * @adev: amdgpu_device pointer
2369  * @min_vm_size: the minimum vm size in GB if it's set auto
2370  * @fragment_size_default: Default PTE fragment size
2371  * @max_level: max VMPT level
2372  * @max_bits: max address space size in bits
2373  *
2374  */
2375 void amdgpu_vm_adjust_size(struct amdgpu_device *adev, uint32_t min_vm_size,
2376 			   uint32_t fragment_size_default, unsigned max_level,
2377 			   unsigned max_bits)
2378 {
2379 	unsigned int max_size = 1 << (max_bits - 30);
2380 	unsigned int vm_size;
2381 	uint64_t tmp;
2382 
2383 	/* adjust vm size first */
2384 	if (amdgpu_vm_size != -1) {
2385 		vm_size = amdgpu_vm_size;
2386 		if (vm_size > max_size) {
2387 			dev_warn(adev->dev, "VM size (%d) too large, max is %u GB\n",
2388 				 amdgpu_vm_size, max_size);
2389 			vm_size = max_size;
2390 		}
2391 	} else {
2392 		struct sysinfo si;
2393 		unsigned int phys_ram_gb;
2394 
2395 		/* Optimal VM size depends on the amount of physical
2396 		 * RAM available. Underlying requirements and
2397 		 * assumptions:
2398 		 *
2399 		 *  - Need to map system memory and VRAM from all GPUs
2400 		 *     - VRAM from other GPUs not known here
2401 		 *     - Assume VRAM <= system memory
2402 		 *  - On GFX8 and older, VM space can be segmented for
2403 		 *    different MTYPEs
2404 		 *  - Need to allow room for fragmentation, guard pages etc.
2405 		 *
2406 		 * This adds up to a rough guess of system memory x3.
2407 		 * Round up to power of two to maximize the available
2408 		 * VM size with the given page table size.
2409 		 */
2410 		si_meminfo(&si);
2411 		phys_ram_gb = ((uint64_t)si.totalram * si.mem_unit +
2412 			       (1 << 30) - 1) >> 30;
2413 		vm_size = roundup_pow_of_two(
2414 			clamp(phys_ram_gb * 3, min_vm_size, max_size));
2415 	}
2416 
2417 	adev->vm_manager.max_pfn = (uint64_t)vm_size << 18;
2418 	adev->vm_manager.max_level = max_level;
2419 
2420 	tmp = roundup_pow_of_two(adev->vm_manager.max_pfn);
2421 	if (amdgpu_vm_block_size != -1)
2422 		tmp >>= amdgpu_vm_block_size - 9;
2423 	tmp = DIV_ROUND_UP(fls64(tmp) - 1, 9) - 1;
2424 	adev->vm_manager.num_level = min_t(unsigned int, max_level, tmp);
2425 	switch (adev->vm_manager.num_level) {
2426 	case 4:
2427 		adev->vm_manager.root_level = AMDGPU_VM_PDB3;
2428 		break;
2429 	case 3:
2430 		adev->vm_manager.root_level = AMDGPU_VM_PDB2;
2431 		break;
2432 	case 2:
2433 		adev->vm_manager.root_level = AMDGPU_VM_PDB1;
2434 		break;
2435 	case 1:
2436 		adev->vm_manager.root_level = AMDGPU_VM_PDB0;
2437 		break;
2438 	default:
2439 		dev_err(adev->dev, "VMPT only supports 2~4+1 levels\n");
2440 	}
2441 	/* block size depends on vm size and hw setup*/
2442 	if (amdgpu_vm_block_size != -1)
2443 		adev->vm_manager.block_size =
2444 			min((unsigned)amdgpu_vm_block_size, max_bits
2445 			    - AMDGPU_GPU_PAGE_SHIFT
2446 			    - 9 * adev->vm_manager.num_level);
2447 	else if (adev->vm_manager.num_level > 1)
2448 		adev->vm_manager.block_size = 9;
2449 	else
2450 		adev->vm_manager.block_size = amdgpu_vm_get_block_size(tmp);
2451 
2452 	if (amdgpu_vm_fragment_size == -1)
2453 		adev->vm_manager.fragment_size = fragment_size_default;
2454 	else
2455 		adev->vm_manager.fragment_size = amdgpu_vm_fragment_size;
2456 
2457 	dev_info(
2458 		adev->dev,
2459 		"vm size is %u GB, %u levels, block size is %u-bit, fragment size is %u-bit\n",
2460 		vm_size, adev->vm_manager.num_level + 1,
2461 		adev->vm_manager.block_size, adev->vm_manager.fragment_size);
2462 }
2463 
2464 /**
2465  * amdgpu_vm_wait_idle - wait for the VM to become idle
2466  *
2467  * @vm: VM object to wait for
2468  * @timeout: timeout to wait for VM to become idle
2469  */
2470 long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout)
2471 {
2472 	timeout = drm_sched_entity_flush(&vm->immediate, timeout);
2473 	if (timeout <= 0)
2474 		return timeout;
2475 
2476 	return drm_sched_entity_flush(&vm->delayed, timeout);
2477 }
2478 
2479 static void amdgpu_vm_destroy_task_info(struct kref *kref)
2480 {
2481 	struct amdgpu_task_info *ti = container_of(kref, struct amdgpu_task_info, refcount);
2482 
2483 	kfree(ti);
2484 }
2485 
2486 /**
2487  * amdgpu_vm_put_task_info - reference down the vm task_info ptr
2488  *
2489  * @task_info: task_info struct under discussion.
2490  *
2491  * frees the vm task_info ptr at the last put
2492  */
2493 void amdgpu_vm_put_task_info(struct amdgpu_task_info *task_info)
2494 {
2495 	if (task_info)
2496 		kref_put(&task_info->refcount, amdgpu_vm_destroy_task_info);
2497 }
2498 
2499 /**
2500  * amdgpu_vm_get_task_info_vm - Extracts task info for a vm.
2501  *
2502  * @vm: VM to get info from
2503  *
2504  * Returns the reference counted task_info structure, which must be
2505  * referenced down with amdgpu_vm_put_task_info.
2506  */
2507 struct amdgpu_task_info *
2508 amdgpu_vm_get_task_info_vm(struct amdgpu_vm *vm)
2509 {
2510 	struct amdgpu_task_info *ti = NULL;
2511 
2512 	if (vm) {
2513 		ti = vm->task_info;
2514 		kref_get(&vm->task_info->refcount);
2515 	}
2516 
2517 	return ti;
2518 }
2519 
2520 /**
2521  * amdgpu_vm_get_task_info_pasid - Extracts task info for a PASID.
2522  *
2523  * @adev: drm device pointer
2524  * @pasid: PASID identifier for VM
2525  *
2526  * Returns the reference counted task_info structure, which must be
2527  * referenced down with amdgpu_vm_put_task_info.
2528  */
2529 struct amdgpu_task_info *
2530 amdgpu_vm_get_task_info_pasid(struct amdgpu_device *adev, u32 pasid)
2531 {
2532 	struct amdgpu_fpriv *fpriv;
2533 	struct amdgpu_task_info *ti;
2534 	struct amdgpu_vm *vm;
2535 	unsigned long flags;
2536 
2537 	amdgpu_pasid_lock(&flags);
2538 	fpriv = amdgpu_pasid_get_fpriv_locked(pasid);
2539 	vm = fpriv ? &fpriv->vm : NULL;
2540 	ti = amdgpu_vm_get_task_info_vm(vm);
2541 	amdgpu_pasid_unlock(flags);
2542 
2543 	return ti;
2544 }
2545 
2546 static int amdgpu_vm_create_task_info(struct amdgpu_vm *vm)
2547 {
2548 	vm->task_info = kzalloc_obj(struct amdgpu_task_info);
2549 	if (!vm->task_info)
2550 		return -ENOMEM;
2551 
2552 	kref_init(&vm->task_info->refcount);
2553 	return 0;
2554 }
2555 
2556 static void amdgpu_vm_render_devt(struct amdgpu_device *adev, int *major, int *minor)
2557 {
2558 	*major = DRM_MAJOR;
2559 	*minor = adev_to_drm(adev)->render->index;
2560 }
2561 
2562 /**
2563  * amdgpu_vm_set_task_info - Sets VMs task info.
2564  *
2565  * @vm: vm for which to set the info
2566  */
2567 void amdgpu_vm_set_task_info(struct amdgpu_vm *vm)
2568 {
2569 	if (!vm->task_info)
2570 		return;
2571 
2572 	if (vm->task_info->task.pid == current->pid)
2573 		return;
2574 
2575 	if (vm->root.bo) {
2576 		struct amdgpu_device *adev = amdgpu_ttm_adev(vm->root.bo->tbo.bdev);
2577 		int major, minor;
2578 
2579 		amdgpu_vm_render_devt(adev, &major, &minor);
2580 
2581 		if (vm->task_info->task.pid)
2582 			trace_amdgpu_deregister_pid(vm->task_info->task.pid,
2583 						    major, minor);
2584 		trace_amdgpu_register_pid(current->pid, major, minor);
2585 	}
2586 
2587 	vm->task_info->task.pid = current->pid;
2588 	get_task_comm(vm->task_info->task.comm, current);
2589 
2590 	vm->task_info->tgid = current->tgid;
2591 	get_task_comm(vm->task_info->process_name, current->group_leader);
2592 }
2593 
2594 /**
2595  * amdgpu_vm_init - initialize a vm instance
2596  *
2597  * @adev: amdgpu_device pointer
2598  * @vm: requested vm
2599  * @xcp_id: GPU partition selection id
2600  *
2601  * Init @vm fields.
2602  *
2603  * Returns:
2604  * 0 for success, error for failure.
2605  */
2606 int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,
2607 		   int32_t xcp_id)
2608 {
2609 	struct amdgpu_bo *root_bo;
2610 	struct amdgpu_bo_vm *root;
2611 	int r, i;
2612 
2613 	vm->va = RB_ROOT_CACHED;
2614 	for (i = 0; i < AMDGPU_MAX_VMHUBS; i++)
2615 		vm->reserved_vmid[i] = NULL;
2616 
2617 	amdgpu_vm_bo_status_init(&vm->kernel);
2618 	amdgpu_vm_bo_status_init(&vm->always_valid);
2619 	spin_lock_init(&vm->individual_lock);
2620 	amdgpu_vm_bo_status_init(&vm->individual);
2621 	INIT_LIST_HEAD(&vm->freed);
2622 	INIT_KFIFO(vm->faults);
2623 	spin_lock_init(&vm->stats_lock);
2624 
2625 	r = amdgpu_vm_init_entities(adev, vm);
2626 	if (r)
2627 		return r;
2628 
2629 	ttm_lru_bulk_move_init(&vm->lru_bulk_move);
2630 
2631 	vm->is_compute_context = false;
2632 	vm->need_tlb_fence = amdgpu_userq_enabled(&adev->ddev);
2633 
2634 	vm->use_cpu_for_update = !!(adev->vm_manager.vm_update_mode &
2635 				    AMDGPU_VM_USE_CPU_FOR_GFX);
2636 
2637 	dev_dbg(adev->dev, "VM update mode is %s\n",
2638 		vm->use_cpu_for_update ? "CPU" : "SDMA");
2639 	WARN_ONCE((vm->use_cpu_for_update &&
2640 		   !amdgpu_gmc_vram_full_visible(&adev->gmc)),
2641 		  "CPU update of VM recommended only for large BAR system\n");
2642 
2643 	if (vm->use_cpu_for_update)
2644 		vm->update_funcs = &amdgpu_vm_cpu_funcs;
2645 	else
2646 		vm->update_funcs = &amdgpu_vm_sdma_funcs;
2647 
2648 	vm->last_update = dma_fence_get_stub();
2649 	vm->last_unlocked = dma_fence_get_stub();
2650 	vm->last_tlb_flush = dma_fence_get_stub();
2651 	vm->generation = amdgpu_vm_generation(adev, NULL);
2652 
2653 	mutex_init(&vm->eviction_lock);
2654 	vm->evicting = false;
2655 	vm->tlb_fence_context = dma_fence_context_alloc(1);
2656 
2657 	r = amdgpu_vm_pt_create(adev, vm, adev->vm_manager.root_level,
2658 				false, &root, xcp_id);
2659 	if (r)
2660 		goto error_free_delayed;
2661 
2662 	root_bo = amdgpu_bo_ref(&root->bo);
2663 	r = amdgpu_bo_reserve(root_bo, true);
2664 	if (r) {
2665 		amdgpu_bo_unref(&root_bo);
2666 		goto error_free_delayed;
2667 	}
2668 
2669 	amdgpu_vm_bo_base_init(&vm->root, vm, root_bo);
2670 	r = dma_resv_reserve_fences(root_bo->tbo.base.resv, 1);
2671 	if (r)
2672 		goto error_free_root;
2673 
2674 	r = amdgpu_vm_pt_clear(adev, vm, root, false);
2675 	if (r)
2676 		goto error_free_root;
2677 
2678 	r = amdgpu_vm_create_task_info(vm);
2679 	if (r)
2680 		dev_dbg(adev->dev, "Failed to create task info for VM\n");
2681 
2682 	amdgpu_bo_unreserve(vm->root.bo);
2683 	amdgpu_bo_unref(&root_bo);
2684 
2685 	return 0;
2686 
2687 error_free_root:
2688 	amdgpu_vm_pt_free_root(adev, vm);
2689 	amdgpu_bo_unreserve(vm->root.bo);
2690 	amdgpu_bo_unref(&root_bo);
2691 
2692 error_free_delayed:
2693 	dma_fence_put(vm->last_update);
2694 	dma_fence_put(vm->last_tlb_flush);
2695 	dma_fence_put(vm->last_unlocked);
2696 	ttm_lru_bulk_move_fini(&adev->mman.bdev, &vm->lru_bulk_move);
2697 	amdgpu_vm_fini_entities(vm);
2698 
2699 	return r;
2700 }
2701 
2702 /**
2703  * amdgpu_vm_make_compute - Turn a GFX VM into a compute VM
2704  *
2705  * @adev: amdgpu_device pointer
2706  * @vm: requested vm
2707  *
2708  * This only works on GFX VMs that don't have any BOs added and no
2709  * page tables allocated yet.
2710  *
2711  * Changes the following VM parameters:
2712  * - use_cpu_for_update
2713  * - pte_supports_ats
2714  *
2715  * Reinitializes the page directory to reflect the changed ATS
2716  * setting.
2717  *
2718  * Returns:
2719  * 0 for success, -errno for errors.
2720  */
2721 int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)
2722 {
2723 	int r;
2724 
2725 	r = amdgpu_bo_reserve(vm->root.bo, true);
2726 	if (r)
2727 		return r;
2728 
2729 	/* Update VM state */
2730 	vm->use_cpu_for_update = !!(adev->vm_manager.vm_update_mode &
2731 				    AMDGPU_VM_USE_CPU_FOR_COMPUTE);
2732 	dev_dbg(adev->dev, "VM update mode is %s\n",
2733 		vm->use_cpu_for_update ? "CPU" : "SDMA");
2734 	WARN_ONCE((vm->use_cpu_for_update &&
2735 		   !amdgpu_gmc_vram_full_visible(&adev->gmc)),
2736 		  "CPU update of VM recommended only for large BAR system\n");
2737 
2738 	if (vm->use_cpu_for_update) {
2739 		/* Sync with last SDMA update/clear before switching to CPU */
2740 		r = amdgpu_bo_sync_wait(vm->root.bo,
2741 					AMDGPU_FENCE_OWNER_UNDEFINED, true);
2742 		if (r)
2743 			goto unreserve_bo;
2744 
2745 		vm->update_funcs = &amdgpu_vm_cpu_funcs;
2746 		r = amdgpu_vm_pt_map_tables(adev, vm);
2747 		if (r)
2748 			goto unreserve_bo;
2749 
2750 	} else {
2751 		vm->update_funcs = &amdgpu_vm_sdma_funcs;
2752 	}
2753 
2754 	dma_fence_put(vm->last_update);
2755 	vm->last_update = dma_fence_get_stub();
2756 	vm->is_compute_context = true;
2757 	vm->need_tlb_fence = true;
2758 
2759 unreserve_bo:
2760 	amdgpu_bo_unreserve(vm->root.bo);
2761 	return r;
2762 }
2763 
2764 /**
2765  * amdgpu_vm_make_npa - Turn a GFX VM into an NPA VM
2766  *
2767  * @adev: amdgpu_device pointer
2768  * @vm: requested vm
2769  *
2770  * This only works on GFX VMs that don't have any BOs added and no
2771  * page tables allocated yet.
2772  *
2773  * Changes the following VM parameters:
2774  * - use_cpu_for_update
2775  * - pins page tables
2776  * - initializes PTEs to no-retry encoding
2777  *
2778  * Reinitializes the page directory to reflect the changed ATS
2779  * setting.
2780  *
2781  * Returns:
2782  * 0 for success, -errno for errors.
2783  */
2784 int amdgpu_vm_make_npa(struct amdgpu_device *adev, struct amdgpu_vm *vm)
2785 {
2786 	int r = amdgpu_vm_make_compute(adev, vm);
2787 
2788 	if (r)
2789 		return r;
2790 	vm->is_npa = true;
2791 	r = amdgpu_bo_reserve(vm->root.bo, false);
2792 	if (r)
2793 		return r;
2794 	r = amdgpu_bo_pin(vm->root.bo, AMDGPU_GEM_DOMAIN_VRAM);
2795 	amdgpu_bo_unreserve(vm->root.bo);
2796 	if (r)
2797 		return r;
2798 
2799 	vm->is_npa = true;
2800 
2801 	return 0;
2802 }
2803 
2804 static int amdgpu_vm_stats_is_zero(struct amdgpu_vm *vm)
2805 {
2806 	for (int i = 0; i < __AMDGPU_PL_NUM; ++i) {
2807 		if (!(drm_memory_stats_is_zero(&vm->stats[i].drm) &&
2808 		      vm->stats[i].evicted == 0))
2809 			return false;
2810 	}
2811 	return true;
2812 }
2813 
2814 /**
2815  * amdgpu_vm_fini - tear down a vm instance
2816  *
2817  * @adev: amdgpu_device pointer
2818  * @vm: requested vm
2819  *
2820  * Tear down @vm.
2821  * Unbind the VM and remove all bos from the vm bo list
2822  */
2823 void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
2824 {
2825 	struct amdgpu_bo_va_mapping *mapping, *tmp;
2826 	bool prt_fini_needed = !!adev->gmc.gmc_funcs->set_prt;
2827 	struct amdgpu_bo *root;
2828 	unsigned long flags;
2829 	int i;
2830 
2831 	amdgpu_amdkfd_gpuvm_destroy_cb(adev, vm);
2832 
2833 	root = amdgpu_bo_ref(vm->root.bo);
2834 	amdgpu_bo_reserve(root, true);
2835 	dma_fence_wait(vm->last_unlocked, false);
2836 	dma_fence_put(vm->last_unlocked);
2837 	dma_fence_wait(vm->last_tlb_flush, false);
2838 	/* Make sure that all fence callbacks have completed */
2839 	dma_fence_lock_irqsave(vm->last_tlb_flush, flags);
2840 	dma_fence_unlock_irqrestore(vm->last_tlb_flush, flags);
2841 	dma_fence_put(vm->last_tlb_flush);
2842 
2843 	list_for_each_entry_safe(mapping, tmp, &vm->freed, list) {
2844 		if (mapping->flags & AMDGPU_VM_PAGE_PRT && prt_fini_needed) {
2845 			amdgpu_vm_prt_fini(adev, vm);
2846 			prt_fini_needed = false;
2847 		}
2848 
2849 		list_del(&mapping->list);
2850 		amdgpu_vm_free_mapping(adev, vm, mapping, NULL);
2851 	}
2852 
2853 	amdgpu_vm_pt_free_root(adev, vm);
2854 	amdgpu_bo_unreserve(root);
2855 	amdgpu_bo_unref(&root);
2856 	WARN_ON(vm->root.bo);
2857 
2858 	amdgpu_vm_fini_entities(vm);
2859 
2860 	if (!RB_EMPTY_ROOT(&vm->va.rb_root)) {
2861 		dev_err(adev->dev, "still active bo inside vm\n");
2862 	}
2863 	rbtree_postorder_for_each_entry_safe(mapping, tmp,
2864 					     &vm->va.rb_root, rb) {
2865 		/* Don't remove the mapping here, we don't want to trigger a
2866 		 * rebalance and the tree is about to be destroyed anyway.
2867 		 */
2868 		list_del(&mapping->list);
2869 		kfree(mapping);
2870 	}
2871 
2872 	dma_fence_put(vm->last_update);
2873 
2874 	for (i = 0; i < AMDGPU_MAX_VMHUBS; i++) {
2875 		amdgpu_vmid_free_reserved(adev, vm, i);
2876 	}
2877 
2878 	ttm_lru_bulk_move_fini(&adev->mman.bdev, &vm->lru_bulk_move);
2879 
2880 	if (!amdgpu_vm_stats_is_zero(vm)) {
2881 		struct amdgpu_task_info *ti = vm->task_info;
2882 
2883 		dev_warn(adev->dev,
2884 			 "VM memory stats for proc %s(%d) task %s(%d) is non-zero when fini\n",
2885 			 ti->process_name, ti->task.pid, ti->task.comm, ti->tgid);
2886 	}
2887 
2888 	if (vm->task_info && vm->task_info->task.pid) {
2889 		int major, minor;
2890 
2891 		amdgpu_vm_render_devt(adev, &major, &minor);
2892 		trace_amdgpu_deregister_pid(vm->task_info->task.pid, major, minor);
2893 	}
2894 
2895 	amdgpu_vm_put_task_info(vm->task_info);
2896 }
2897 
2898 /**
2899  * amdgpu_vm_manager_init - init the VM manager
2900  *
2901  * @adev: amdgpu_device pointer
2902  *
2903  * Initialize the VM manager structures
2904  */
2905 void amdgpu_vm_manager_init(struct amdgpu_device *adev)
2906 {
2907 	/* Concurrent flushes are only possible starting with Vega10 and
2908 	 * are broken on Navi10 and Navi14.
2909 	 */
2910 	adev->vm_manager.concurrent_flush = !(adev->asic_type < CHIP_VEGA10 ||
2911 					      adev->asic_type == CHIP_NAVI10 ||
2912 					      adev->asic_type == CHIP_NAVI14);
2913 	amdgpu_vmid_mgr_init(adev);
2914 
2915 	spin_lock_init(&adev->vm_manager.prt_lock);
2916 	atomic_set(&adev->vm_manager.num_prt_users, 0);
2917 
2918 	/* If not overridden by the user, by default, only in large BAR systems
2919 	 * Compute VM tables will be updated by CPU
2920 	 */
2921 #ifdef CONFIG_X86_64
2922 	if (amdgpu_vm_update_mode == -1) {
2923 		/* For asic with VF MMIO access protection
2924 		 * avoid using CPU for VM table updates
2925 		 */
2926 		if (amdgpu_gmc_vram_full_visible(&adev->gmc) &&
2927 		    !amdgpu_sriov_vf_mmio_access_protection(adev))
2928 			adev->vm_manager.vm_update_mode =
2929 				AMDGPU_VM_USE_CPU_FOR_COMPUTE;
2930 		else
2931 			adev->vm_manager.vm_update_mode = 0;
2932 	} else
2933 		adev->vm_manager.vm_update_mode = amdgpu_vm_update_mode;
2934 #else
2935 	adev->vm_manager.vm_update_mode = 0;
2936 #endif
2937 }
2938 
2939 /**
2940  * amdgpu_vm_manager_fini - cleanup VM manager
2941  *
2942  * @adev: amdgpu_device pointer
2943  *
2944  * Cleanup the VM manager and free resources.
2945  */
2946 void amdgpu_vm_manager_fini(struct amdgpu_device *adev)
2947 {
2948 	amdgpu_vmid_mgr_fini(adev);
2949 	amdgpu_pasid_mgr_cleanup();
2950 }
2951 
2952 /**
2953  * amdgpu_vm_ioctl - Manages VMID reservation for vm hubs.
2954  *
2955  * @dev: drm device pointer
2956  * @data: drm_amdgpu_vm
2957  * @filp: drm file pointer
2958  *
2959  * Returns:
2960  * 0 for success, -errno for errors.
2961  */
2962 int amdgpu_vm_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
2963 {
2964 	union drm_amdgpu_vm *args = data;
2965 	struct amdgpu_device *adev = drm_to_adev(dev);
2966 	struct amdgpu_fpriv *fpriv = filp->driver_priv;
2967 	struct amdgpu_vm *vm = &fpriv->vm;
2968 
2969 	/* No valid flags defined yet */
2970 	if (args->in.flags)
2971 		return -EINVAL;
2972 
2973 	switch (args->in.op) {
2974 	case AMDGPU_VM_OP_RESERVE_VMID:
2975 		/* We only have requirement to reserve vmid from gfxhub */
2976 		return amdgpu_vmid_alloc_reserved(adev, vm, AMDGPU_GFXHUB(0));
2977 	case AMDGPU_VM_OP_UNRESERVE_VMID:
2978 		amdgpu_vmid_free_reserved(adev, vm, AMDGPU_GFXHUB(0));
2979 		break;
2980 	default:
2981 		return -EINVAL;
2982 	}
2983 
2984 	return 0;
2985 }
2986 
2987 /**
2988  * amdgpu_vm_lock_by_pasid - look up a VM by PASID and lock its root PD
2989  * @adev: amdgpu device pointer
2990  * @pasid: PASID of the VM
2991  * @exec: drm_exec context to lock the root PD in
2992  *
2993  * Must be called from within a drm_exec_until_all_locked() loop; the caller
2994  * runs drm_exec_retry_on_contention() afterwards. The drm_exec context holds
2995  * a reference on the root BO until it is finalised.
2996  *
2997  * Return: the VM on success, or NULL if the PASID has no VM, the VM is being
2998  * torn down, or locking the root PD failed.
2999  */
3000 struct amdgpu_vm *amdgpu_vm_lock_by_pasid(struct amdgpu_device *adev,
3001 					  u32 pasid, struct drm_exec *exec)
3002 {
3003 	unsigned long irqflags;
3004 	struct amdgpu_fpriv *fpriv;
3005 	struct amdgpu_bo *root;
3006 	struct amdgpu_vm *vm;
3007 	int r;
3008 
3009 	amdgpu_pasid_lock(&irqflags);
3010 	fpriv = amdgpu_pasid_get_fpriv_locked(pasid);
3011 	vm = fpriv ? &fpriv->vm : NULL;
3012 	root = vm && vm->root.bo ? amdgpu_bo_ref(vm->root.bo) : NULL;
3013 	amdgpu_pasid_unlock(irqflags);
3014 
3015 	if (!root)
3016 		return NULL;
3017 
3018 	r = drm_exec_lock_obj(exec, &root->tbo.base);
3019 	if (r) {
3020 		amdgpu_bo_unref(&root);
3021 		return NULL;
3022 	}
3023 
3024 	/* Double check that the VM still exists */
3025 	amdgpu_pasid_lock(&irqflags);
3026 	fpriv = amdgpu_pasid_get_fpriv_locked(pasid);
3027 	if (!fpriv) {
3028 		vm = NULL;
3029 	} else {
3030 		vm = &fpriv->vm;
3031 		if (vm->root.bo != root)
3032 			vm = NULL;
3033 	}
3034 	amdgpu_pasid_unlock(irqflags);
3035 
3036 	if (!vm) {
3037 		drm_exec_unlock_obj(exec, &root->tbo.base);
3038 		amdgpu_bo_unref(&root);
3039 		return NULL;
3040 	}
3041 
3042 	/* The drm_exec context holds its own reference on the root BO. */
3043 	amdgpu_bo_unref(&root);
3044 
3045 	return vm;
3046 }
3047 
3048 /**
3049  * amdgpu_vm_handle_fault - graceful handling of VM faults.
3050  * @adev: amdgpu device pointer
3051  * @pasid: PASID of the VM
3052  * @ts: Timestamp of the fault
3053  * @vmid: VMID, only used for GFX 9.4.3.
3054  * @node_id: Node_id received in IH cookie. Only applicable for
3055  *           GFX 9.4.3.
3056  * @addr: Address of the fault
3057  * @write_fault: true is write fault, false is read fault
3058  *
3059  * Try to gracefully handle a VM fault. Return true if the fault was handled and
3060  * shouldn't be reported any more.
3061  */
3062 bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid,
3063 			    u32 vmid, u32 node_id, uint64_t addr,
3064 			    uint64_t ts, bool write_fault)
3065 {
3066 	bool is_compute_context = false;
3067 	struct drm_exec exec;
3068 	uint64_t value, flags;
3069 	struct amdgpu_vm *vm;
3070 	int r;
3071 
3072 	drm_exec_init(&exec, 0, 1);
3073 	drm_exec_until_all_locked(&exec) {
3074 		vm = amdgpu_vm_lock_by_pasid(adev, pasid, &exec);
3075 		drm_exec_retry_on_contention(&exec);
3076 		if (!vm)
3077 			break;
3078 	}
3079 	if (!vm) {
3080 		drm_exec_fini(&exec);
3081 		return false;
3082 	}
3083 
3084 	is_compute_context = vm->is_compute_context;
3085 
3086 	if (is_compute_context) {
3087 		__label__ drm_exec_retry;
3088 
3089 		/* Release the root PD lock since svm_range_restore_pages
3090 		 * might try to take it.
3091 		 * TODO: rework svm_range_restore_pages so that this isn't
3092 		 * necessary.
3093 		 */
3094 		drm_exec_fini(&exec);
3095 
3096 		if (!svm_range_restore_pages(adev, pasid, vmid,
3097 					     node_id, addr >> PAGE_SHIFT, ts, write_fault))
3098 			return true;
3099 
3100 		/* Re-acquire the VM lock, could be that the VM was freed in between. */
3101 		drm_exec_init(&exec, 0, 1);
3102 		drm_exec_until_all_locked(&exec) {
3103 			vm = amdgpu_vm_lock_by_pasid(adev, pasid, &exec);
3104 			drm_exec_retry_on_contention(&exec);
3105 			if (!vm)
3106 				break;
3107 		}
3108 		if (!vm) {
3109 			drm_exec_fini(&exec);
3110 			return false;
3111 		}
3112 	}
3113 
3114 	addr /= AMDGPU_GPU_PAGE_SIZE;
3115 	flags = adev->gmc.init_pte_flags |
3116 		AMDGPU_PTE_VALID | AMDGPU_PTE_SNOOPED |
3117 		AMDGPU_PTE_SYSTEM;
3118 
3119 	if (is_compute_context) {
3120 		/* Intentionally setting invalid PTE flag
3121 		 * combination to force a no-retry-fault
3122 		 */
3123 		flags = AMDGPU_VM_NORETRY_FLAGS;
3124 		value = 0;
3125 	} else if (amdgpu_vm_fault_stop == AMDGPU_VM_FAULT_STOP_NEVER) {
3126 		/* Redirect the access to the dummy page */
3127 		value = adev->dummy_page_addr;
3128 		flags |= AMDGPU_PTE_EXECUTABLE | AMDGPU_PTE_READABLE |
3129 			 AMDGPU_PTE_WRITEABLE;
3130 	} else {
3131 		/* Let the hw retry silently on the PTE */
3132 		value = 0;
3133 	}
3134 
3135 	r = dma_resv_reserve_fences(vm->root.bo->tbo.base.resv, 1);
3136 	if (r) {
3137 		pr_debug("failed %d to reserve fence slot\n", r);
3138 		goto error_unlock;
3139 	}
3140 
3141 	r = amdgpu_vm_update_range(adev, vm, true, false, false, false,
3142 				   NULL, addr, addr, flags, value, 0, NULL, NULL, NULL);
3143 	if (r)
3144 		goto error_unlock;
3145 
3146 	r = amdgpu_vm_update_pdes(adev, vm, true);
3147 
3148 error_unlock:
3149 	drm_exec_fini(&exec);
3150 	if (r < 0)
3151 		dev_err(adev->dev, "Can't handle page fault (%d)\n", r);
3152 
3153 	return false;
3154 }
3155 
3156 #if defined(CONFIG_DEBUG_FS)
3157 
3158 /* print the debug info for a specific set of status lists */
3159 static void amdgpu_debugfs_vm_bo_status_info(struct seq_file *m,
3160 					     struct amdgpu_vm_bo_status *lists)
3161 {
3162 	struct amdgpu_vm_bo_base *base;
3163 	unsigned int id;
3164 
3165 	id = 0;
3166 	seq_puts(m, "\tEvicted BOs:\n");
3167 	list_for_each_entry(base, &lists->evicted, vm_status) {
3168 		if (!base->bo)
3169 			continue;
3170 
3171 		amdgpu_bo_print_info(id++, base->bo, m);
3172 	}
3173 
3174 	id = 0;
3175 	seq_puts(m, "\tMoved BOs:\n");
3176 	list_for_each_entry(base, &lists->needs_update, vm_status) {
3177 		if (!base->bo)
3178 			continue;
3179 
3180 		amdgpu_bo_print_info(id++, base->bo, m);
3181 	}
3182 
3183 	id = 0;
3184 	seq_puts(m, "\tIdle BOs:\n");
3185 	list_for_each_entry(base, &lists->idle, vm_status) {
3186 		if (!base->bo)
3187 			continue;
3188 
3189 		amdgpu_bo_print_info(id++, base->bo, m);
3190 	}
3191 }
3192 
3193 /**
3194  * amdgpu_debugfs_vm_bo_info  - print BO info for the VM
3195  *
3196  * @vm: Requested VM for printing BO info
3197  * @m: debugfs file
3198  *
3199  * Print BO information in debugfs file for the VM
3200  */
3201 void amdgpu_debugfs_vm_bo_info(struct amdgpu_vm *vm, struct seq_file *m)
3202 {
3203 	amdgpu_vm_assert_locked(vm);
3204 
3205 	seq_puts(m, "\tKernel PT/PDs:\n");
3206 	amdgpu_debugfs_vm_bo_status_info(m, &vm->kernel);
3207 
3208 	seq_puts(m, "\tPer VM BOs:\n");
3209 	amdgpu_debugfs_vm_bo_status_info(m, &vm->always_valid);
3210 
3211 	seq_puts(m, "\tIndividual BOs:\n");
3212 	spin_lock(&vm->individual_lock);
3213 	amdgpu_debugfs_vm_bo_status_info(m, &vm->individual);
3214 	spin_unlock(&vm->individual_lock);
3215 }
3216 #endif
3217 
3218 /**
3219  * amdgpu_vm_update_fault_cache - update cached fault into.
3220  * @adev: amdgpu device pointer
3221  * @pasid: PASID of the VM
3222  * @addr: Address of the fault
3223  * @status: GPUVM fault status register
3224  * @vmhub: which vmhub got the fault
3225  *
3226  * Cache the fault info for later use by userspace in debugging.
3227  */
3228 void amdgpu_vm_update_fault_cache(struct amdgpu_device *adev,
3229 				  unsigned int pasid,
3230 				  uint64_t addr,
3231 				  uint32_t status,
3232 				  unsigned int vmhub)
3233 {
3234 	struct amdgpu_fpriv *fpriv;
3235 	struct amdgpu_vm *vm;
3236 	unsigned long flags;
3237 
3238 	amdgpu_pasid_lock(&flags);
3239 
3240 	fpriv = amdgpu_pasid_get_fpriv_locked(pasid);
3241 	vm = fpriv ? &fpriv->vm : NULL;
3242 	/* Don't update the fault cache if status is 0.  In the multiple
3243 	 * fault case, subsequent faults will return a 0 status which is
3244 	 * useless for userspace and replaces the useful fault status, so
3245 	 * only update if status is non-0.
3246 	 */
3247 	if (vm && status) {
3248 		vm->fault_info.addr = addr;
3249 		vm->fault_info.status = status;
3250 		/*
3251 		 * Update the fault information globally for later usage
3252 		 * when vm could be stale or freed.
3253 		 */
3254 		adev->vm_manager.fault_info.addr = addr;
3255 		adev->vm_manager.fault_info.vmhub = vmhub;
3256 		adev->vm_manager.fault_info.status = status;
3257 
3258 		if (AMDGPU_IS_GFXHUB(vmhub)) {
3259 			vm->fault_info.vmhub = AMDGPU_VMHUB_TYPE_GFX;
3260 			vm->fault_info.vmhub |=
3261 				(vmhub - AMDGPU_GFXHUB_START) << AMDGPU_VMHUB_IDX_SHIFT;
3262 		} else if (AMDGPU_IS_MMHUB0(vmhub)) {
3263 			vm->fault_info.vmhub = AMDGPU_VMHUB_TYPE_MM0;
3264 			vm->fault_info.vmhub |=
3265 				(vmhub - AMDGPU_MMHUB0_START) << AMDGPU_VMHUB_IDX_SHIFT;
3266 		} else if (AMDGPU_IS_MMHUB1(vmhub)) {
3267 			vm->fault_info.vmhub = AMDGPU_VMHUB_TYPE_MM1;
3268 			vm->fault_info.vmhub |=
3269 				(vmhub - AMDGPU_MMHUB1_START) << AMDGPU_VMHUB_IDX_SHIFT;
3270 		} else {
3271 			WARN_ONCE(1, "Invalid vmhub %u\n", vmhub);
3272 		}
3273 	}
3274 	amdgpu_pasid_unlock(flags);
3275 }
3276 
3277 void amdgpu_vm_print_task_info(struct amdgpu_device *adev,
3278 			       struct amdgpu_task_info *task_info)
3279 {
3280 	dev_err(adev->dev,
3281 		" Process %s pid %d thread %s pid %d\n",
3282 		task_info->process_name, task_info->tgid,
3283 		task_info->task.comm, task_info->task.pid);
3284 }
3285 
3286 void amdgpu_sdma_set_vm_pte_scheds(struct amdgpu_device *adev,
3287 				   const struct amdgpu_vm_pte_funcs *vm_pte_funcs)
3288 {
3289 	struct drm_gpu_scheduler *sched;
3290 	int i;
3291 
3292 	for (i = 0; i < adev->sdma.num_instances; i++) {
3293 		if (adev->sdma.has_page_queue)
3294 			sched = &adev->sdma.instance[i].page.sched;
3295 		else
3296 			sched = &adev->sdma.instance[i].ring.sched;
3297 		adev->vm_manager.vm_pte_scheds[i] = sched;
3298 	}
3299 	adev->vm_manager.vm_pte_num_scheds = adev->sdma.num_instances;
3300 	adev->vm_manager.vm_pte_funcs = vm_pte_funcs;
3301 }
3302